You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by mm...@apache.org on 2019/09/06 10:06:43 UTC

[pulsar] branch asf-site updated: Updated site at revision f6af696

This is an automated email from the ASF dual-hosted git repository.

mmerli pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new c0fe2e7  Updated site at revision f6af696
c0fe2e7 is described below

commit c0fe2e77b8353d58273b8d44adab3c1177ed8b29
Author: jenkins <bu...@apache.org>
AuthorDate: Fri Sep 6 10:06:28 2019 +0000

    Updated site at revision f6af696
---
 .../en/2.1.0-incubating/deploy-bare-metal.html     |   4 +-
 .../2.1.0-incubating/deploy-bare-metal/index.html  |   4 +-
 .../docs/en/2.1.0-incubating/functions-api.html    |  14 +-
 .../en/2.1.0-incubating/functions-api/index.html   |  14 +-
 .../en/2.1.0-incubating/functions-deploying.html   |  10 +-
 .../functions-deploying/index.html                 |  10 +-
 .../en/2.1.0-incubating/functions-guarantees.html  |   2 +-
 .../functions-guarantees/index.html                |   2 +-
 .../en/2.1.0-incubating/functions-metrics.html     |   8 +-
 .../2.1.0-incubating/functions-metrics/index.html  |   8 +-
 .../en/2.1.0-incubating/functions-overview.html    |  22 +-
 .../2.1.0-incubating/functions-overview/index.html |  22 +-
 .../en/2.1.0-incubating/functions-quickstart.html  |   8 +-
 .../functions-quickstart/index.html                |   8 +-
 .../docs/en/2.1.0-incubating/functions-state.html  |  10 +-
 .../en/2.1.0-incubating/functions-state/index.html |  10 +-
 content/docs/en/2.1.0-incubating/io-overview.html  |   2 +-
 .../en/2.1.0-incubating/io-overview/index.html     |   2 +-
 .../en/2.1.1-incubating/deploy-bare-metal.html     |   4 +-
 .../2.1.1-incubating/deploy-bare-metal/index.html  |   4 +-
 .../docs/en/2.1.1-incubating/functions-api.html    |  14 +-
 .../en/2.1.1-incubating/functions-api/index.html   |  14 +-
 .../en/2.1.1-incubating/functions-deploying.html   |  10 +-
 .../functions-deploying/index.html                 |  10 +-
 .../en/2.1.1-incubating/functions-guarantees.html  |   2 +-
 .../functions-guarantees/index.html                |   2 +-
 .../en/2.1.1-incubating/functions-metrics.html     |   8 +-
 .../2.1.1-incubating/functions-metrics/index.html  |   8 +-
 .../en/2.1.1-incubating/functions-overview.html    |  22 +-
 .../2.1.1-incubating/functions-overview/index.html |  22 +-
 .../en/2.1.1-incubating/functions-quickstart.html  |   8 +-
 .../functions-quickstart/index.html                |   8 +-
 .../docs/en/2.1.1-incubating/functions-state.html  |  10 +-
 .../en/2.1.1-incubating/functions-state/index.html |  10 +-
 content/docs/en/2.1.1-incubating/io-overview.html  |   2 +-
 .../en/2.1.1-incubating/io-overview/index.html     |   2 +-
 content/docs/en/2.2.0/deploy-bare-metal.html       |   4 +-
 content/docs/en/2.2.0/deploy-bare-metal/index.html |   4 +-
 content/docs/en/2.2.0/functions-api.html           |  14 +-
 content/docs/en/2.2.0/functions-api/index.html     |  14 +-
 content/docs/en/2.2.0/functions-deploying.html     |  10 +-
 .../docs/en/2.2.0/functions-deploying/index.html   |  10 +-
 content/docs/en/2.2.0/functions-guarantees.html    |   2 +-
 .../docs/en/2.2.0/functions-guarantees/index.html  |   2 +-
 content/docs/en/2.2.0/functions-metrics.html       |   8 +-
 content/docs/en/2.2.0/functions-metrics/index.html |   8 +-
 content/docs/en/2.2.0/functions-overview.html      |  22 +-
 .../docs/en/2.2.0/functions-overview/index.html    |  22 +-
 content/docs/en/2.2.0/functions-quickstart.html    |   8 +-
 .../docs/en/2.2.0/functions-quickstart/index.html  |   8 +-
 content/docs/en/2.2.0/functions-state.html         |  10 +-
 content/docs/en/2.2.0/functions-state/index.html   |  10 +-
 content/docs/en/2.2.0/io-overview.html             |   2 +-
 content/docs/en/2.2.0/io-overview/index.html       |   2 +-
 content/docs/en/2.2.1/deploy-bare-metal.html       |   4 +-
 content/docs/en/2.2.1/deploy-bare-metal/index.html |   4 +-
 content/docs/en/2.2.1/functions-api.html           |  14 +-
 content/docs/en/2.2.1/functions-api/index.html     |  14 +-
 content/docs/en/2.2.1/functions-deploying.html     |  10 +-
 .../docs/en/2.2.1/functions-deploying/index.html   |  10 +-
 content/docs/en/2.2.1/functions-guarantees.html    |   2 +-
 .../docs/en/2.2.1/functions-guarantees/index.html  |   2 +-
 content/docs/en/2.2.1/functions-metrics.html       |   8 +-
 content/docs/en/2.2.1/functions-metrics/index.html |   8 +-
 content/docs/en/2.2.1/functions-overview.html      |  22 +-
 .../docs/en/2.2.1/functions-overview/index.html    |  22 +-
 content/docs/en/2.2.1/functions-quickstart.html    |   8 +-
 .../docs/en/2.2.1/functions-quickstart/index.html  |   8 +-
 content/docs/en/2.2.1/functions-state.html         |  10 +-
 content/docs/en/2.2.1/functions-state/index.html   |  10 +-
 content/docs/en/2.2.1/io-overview.html             |   2 +-
 content/docs/en/2.2.1/io-overview/index.html       |   2 +-
 content/docs/en/2.3.0/deploy-bare-metal.html       |   4 +-
 content/docs/en/2.3.0/deploy-bare-metal/index.html |   4 +-
 content/docs/en/2.3.0/functions-api.html           |  14 +-
 content/docs/en/2.3.0/functions-api/index.html     |  14 +-
 content/docs/en/2.3.0/functions-deploying.html     |  10 +-
 .../docs/en/2.3.0/functions-deploying/index.html   |  10 +-
 content/docs/en/2.3.0/functions-guarantees.html    |   2 +-
 .../docs/en/2.3.0/functions-guarantees/index.html  |   2 +-
 content/docs/en/2.3.0/functions-metrics.html       |   8 +-
 content/docs/en/2.3.0/functions-metrics/index.html |   8 +-
 content/docs/en/2.3.0/functions-overview.html      |  22 +-
 .../docs/en/2.3.0/functions-overview/index.html    |  22 +-
 content/docs/en/2.3.0/functions-quickstart.html    |   8 +-
 .../docs/en/2.3.0/functions-quickstart/index.html  |   8 +-
 content/docs/en/2.3.0/functions-state.html         |  10 +-
 content/docs/en/2.3.0/functions-state/index.html   |  10 +-
 content/docs/en/2.3.0/io-overview.html             |   2 +-
 content/docs/en/2.3.0/io-overview/index.html       |   2 +-
 content/docs/en/2.3.1/deploy-bare-metal.html       |   4 +-
 content/docs/en/2.3.1/deploy-bare-metal/index.html |   4 +-
 content/docs/en/2.3.1/functions-api.html           |  14 +-
 content/docs/en/2.3.1/functions-api/index.html     |  14 +-
 content/docs/en/2.3.1/functions-deploying.html     |  10 +-
 .../docs/en/2.3.1/functions-deploying/index.html   |  10 +-
 content/docs/en/2.3.1/functions-guarantees.html    |   2 +-
 .../docs/en/2.3.1/functions-guarantees/index.html  |   2 +-
 content/docs/en/2.3.1/functions-metrics.html       |   8 +-
 content/docs/en/2.3.1/functions-metrics/index.html |   8 +-
 content/docs/en/2.3.1/functions-overview.html      |  22 +-
 .../docs/en/2.3.1/functions-overview/index.html    |  22 +-
 content/docs/en/2.3.1/functions-quickstart.html    |   8 +-
 .../docs/en/2.3.1/functions-quickstart/index.html  |   8 +-
 content/docs/en/2.3.1/functions-state.html         |  10 +-
 content/docs/en/2.3.1/functions-state/index.html   |  10 +-
 content/docs/en/2.3.1/io-overview.html             |   2 +-
 content/docs/en/2.3.1/io-overview/index.html       |   2 +-
 content/docs/en/2.3.2/deploy-bare-metal.html       |   4 +-
 content/docs/en/2.3.2/deploy-bare-metal/index.html |   4 +-
 content/docs/en/2.3.2/functions-api.html           |  14 +-
 content/docs/en/2.3.2/functions-api/index.html     |  14 +-
 content/docs/en/2.3.2/functions-deploying.html     |  10 +-
 .../docs/en/2.3.2/functions-deploying/index.html   |  10 +-
 content/docs/en/2.3.2/functions-guarantees.html    |   2 +-
 .../docs/en/2.3.2/functions-guarantees/index.html  |   2 +-
 content/docs/en/2.3.2/functions-metrics.html       |   8 +-
 content/docs/en/2.3.2/functions-metrics/index.html |   8 +-
 content/docs/en/2.3.2/functions-overview.html      |  22 +-
 .../docs/en/2.3.2/functions-overview/index.html    |  22 +-
 content/docs/en/2.3.2/functions-quickstart.html    |   8 +-
 .../docs/en/2.3.2/functions-quickstart/index.html  |   8 +-
 content/docs/en/2.3.2/functions-state.html         |  10 +-
 content/docs/en/2.3.2/functions-state/index.html   |  10 +-
 content/docs/en/2.3.2/functions-worker.html        |   2 +-
 content/docs/en/2.3.2/functions-worker/index.html  |   2 +-
 content/docs/en/2.3.2/io-overview.html             |   2 +-
 content/docs/en/2.3.2/io-overview/index.html       |   2 +-
 content/docs/en/2.4.0/deploy-bare-metal.html       |   4 +-
 content/docs/en/2.4.0/deploy-bare-metal/index.html |   4 +-
 content/docs/en/2.4.0/functions-api.html           |  14 +-
 content/docs/en/2.4.0/functions-api/index.html     |  14 +-
 content/docs/en/2.4.0/functions-debugging.html     |  10 +-
 .../docs/en/2.4.0/functions-debugging/index.html   |  10 +-
 content/docs/en/2.4.0/functions-deploying.html     |  10 +-
 .../docs/en/2.4.0/functions-deploying/index.html   |  10 +-
 content/docs/en/2.4.0/functions-guarantees.html    |   2 +-
 .../docs/en/2.4.0/functions-guarantees/index.html  |   2 +-
 content/docs/en/2.4.0/functions-metrics.html       |   8 +-
 content/docs/en/2.4.0/functions-metrics/index.html |   8 +-
 content/docs/en/2.4.0/functions-overview.html      |  24 +-
 .../docs/en/2.4.0/functions-overview/index.html    |  24 +-
 content/docs/en/2.4.0/functions-quickstart.html    |   4 +-
 .../docs/en/2.4.0/functions-quickstart/index.html  |   4 +-
 content/docs/en/2.4.0/functions-runtime.html       |   2 +-
 content/docs/en/2.4.0/functions-runtime/index.html |   2 +-
 content/docs/en/2.4.0/functions-state.html         |  10 +-
 content/docs/en/2.4.0/functions-state/index.html   |  10 +-
 content/docs/en/2.4.0/functions-worker.html        |   2 +-
 content/docs/en/2.4.0/functions-worker/index.html  |   2 +-
 content/docs/en/2.4.0/io-overview.html             |   2 +-
 content/docs/en/2.4.0/io-overview/index.html       |   2 +-
 content/docs/en/adaptors-kafka.html                |   2 +-
 content/docs/en/adaptors-kafka/index.html          |   2 +-
 content/docs/en/adaptors-spark.html                |   2 +-
 content/docs/en/adaptors-spark/index.html          |   2 +-
 content/docs/en/adaptors-storm.html                |   2 +-
 content/docs/en/adaptors-storm/index.html          |   2 +-
 content/docs/en/admin-api-brokers.html             |   2 +-
 content/docs/en/admin-api-brokers/index.html       |   2 +-
 content/docs/en/admin-api-clusters.html            |   2 +-
 content/docs/en/admin-api-clusters/index.html      |   2 +-
 content/docs/en/admin-api-namespaces.html          |   2 +-
 content/docs/en/admin-api-namespaces/index.html    |   2 +-
 .../docs/en/admin-api-non-persistent-topics.html   |   2 +-
 .../en/admin-api-non-persistent-topics/index.html  |   2 +-
 content/docs/en/admin-api-overview.html            |   2 +-
 content/docs/en/admin-api-overview/index.html      |   2 +-
 content/docs/en/admin-api-partitioned-topics.html  |   2 +-
 .../en/admin-api-partitioned-topics/index.html     |   2 +-
 content/docs/en/admin-api-permissions.html         |   2 +-
 content/docs/en/admin-api-permissions/index.html   |   2 +-
 content/docs/en/admin-api-persistent-topics.html   |   2 +-
 .../docs/en/admin-api-persistent-topics/index.html |   2 +-
 content/docs/en/admin-api-schemas.html             |   2 +-
 content/docs/en/admin-api-schemas/index.html       |   2 +-
 content/docs/en/admin-api-tenants.html             |   2 +-
 content/docs/en/admin-api-tenants/index.html       |   2 +-
 content/docs/en/administration-dashboard.html      |   2 +-
 .../docs/en/administration-dashboard/index.html    |   2 +-
 content/docs/en/administration-geo.html            |   2 +-
 content/docs/en/administration-geo/index.html      |   2 +-
 content/docs/en/administration-load-balance.html   |   2 +-
 .../docs/en/administration-load-balance/index.html |   2 +-
 content/docs/en/administration-proxy.html          |   2 +-
 content/docs/en/administration-proxy/index.html    |   2 +-
 content/docs/en/administration-stats.html          |   2 +-
 content/docs/en/administration-stats/index.html    |   2 +-
 content/docs/en/administration-upgrade.html        |   2 +-
 content/docs/en/administration-upgrade/index.html  |   2 +-
 content/docs/en/administration-zk-bk.html          |   2 +-
 content/docs/en/administration-zk-bk/index.html    |   2 +-
 content/docs/en/client-libraries-cpp.html          |   2 +-
 content/docs/en/client-libraries-cpp/index.html    |   2 +-
 content/docs/en/client-libraries-go.html           |   2 +-
 content/docs/en/client-libraries-go/index.html     |   2 +-
 content/docs/en/client-libraries-java.html         |   2 +-
 content/docs/en/client-libraries-java/index.html   |   2 +-
 content/docs/en/client-libraries-python.html       |   2 +-
 content/docs/en/client-libraries-python/index.html |   2 +-
 content/docs/en/client-libraries-websocket.html    |   2 +-
 .../docs/en/client-libraries-websocket/index.html  |   2 +-
 content/docs/en/client-libraries.html              |   2 +-
 content/docs/en/client-libraries/index.html        |   2 +-
 .../docs/en/concepts-architecture-overview.html    |   2 +-
 .../en/concepts-architecture-overview/index.html   |   2 +-
 content/docs/en/concepts-authentication.html       |   2 +-
 content/docs/en/concepts-authentication/index.html |   2 +-
 content/docs/en/concepts-clients.html              |   2 +-
 content/docs/en/concepts-clients/index.html        |   2 +-
 content/docs/en/concepts-messaging.html            |   2 +-
 content/docs/en/concepts-messaging/index.html      |   2 +-
 content/docs/en/concepts-multi-tenancy.html        |   2 +-
 content/docs/en/concepts-multi-tenancy/index.html  |   2 +-
 content/docs/en/concepts-overview.html             |   2 +-
 content/docs/en/concepts-overview/index.html       |   2 +-
 content/docs/en/concepts-replication.html          |   2 +-
 content/docs/en/concepts-replication/index.html    |   2 +-
 content/docs/en/concepts-schema-registry.html      |   2 +-
 .../docs/en/concepts-schema-registry/index.html    |   2 +-
 content/docs/en/concepts-tiered-storage.html       |   2 +-
 content/docs/en/concepts-tiered-storage/index.html |   2 +-
 content/docs/en/concepts-topic-compaction.html     |   2 +-
 .../docs/en/concepts-topic-compaction/index.html   |   2 +-
 content/docs/en/cookbooks-bookkeepermetadata.html  |   2 +-
 .../en/cookbooks-bookkeepermetadata/index.html     |   2 +-
 content/docs/en/cookbooks-compaction.html          |   2 +-
 content/docs/en/cookbooks-compaction/index.html    |   2 +-
 content/docs/en/cookbooks-deduplication.html       |   2 +-
 content/docs/en/cookbooks-deduplication/index.html |   2 +-
 content/docs/en/cookbooks-encryption.html          |   2 +-
 content/docs/en/cookbooks-encryption/index.html    |   2 +-
 content/docs/en/cookbooks-message-queue.html       |   2 +-
 content/docs/en/cookbooks-message-queue/index.html |   2 +-
 content/docs/en/cookbooks-non-persistent.html      |   2 +-
 .../docs/en/cookbooks-non-persistent/index.html    |   2 +-
 content/docs/en/cookbooks-partitioned.html         |   2 +-
 content/docs/en/cookbooks-partitioned/index.html   |   2 +-
 content/docs/en/cookbooks-retention-expiry.html    |   2 +-
 .../docs/en/cookbooks-retention-expiry/index.html  |   2 +-
 content/docs/en/cookbooks-tiered-storage.html      |   2 +-
 .../docs/en/cookbooks-tiered-storage/index.html    |   2 +-
 content/docs/en/deploy-aws.html                    |   2 +-
 content/docs/en/deploy-aws/index.html              |   2 +-
 .../docs/en/deploy-bare-metal-multi-cluster.html   |   2 +-
 .../en/deploy-bare-metal-multi-cluster/index.html  |   2 +-
 content/docs/en/deploy-bare-metal.html             |   6 +-
 content/docs/en/deploy-bare-metal/index.html       |   6 +-
 content/docs/en/deploy-dcos.html                   |   2 +-
 content/docs/en/deploy-dcos/index.html             |   2 +-
 content/docs/en/deploy-kubernetes.html             |   2 +-
 content/docs/en/deploy-kubernetes/index.html       |   2 +-
 content/docs/en/deploy-monitoring.html             |   2 +-
 content/docs/en/deploy-monitoring/index.html       |   2 +-
 content/docs/en/develop-binary-protocol.html       |   2 +-
 content/docs/en/develop-binary-protocol/index.html |   2 +-
 content/docs/en/develop-cpp.html                   |   2 +-
 content/docs/en/develop-cpp/index.html             |   2 +-
 content/docs/en/develop-load-manager.html          |   2 +-
 content/docs/en/develop-load-manager/index.html    |   2 +-
 content/docs/en/develop-schema.html                |   2 +-
 content/docs/en/develop-schema/index.html          |   2 +-
 content/docs/en/develop-tools.html                 |   2 +-
 content/docs/en/develop-tools/index.html           |   2 +-
 content/docs/en/functions-api.html                 |  38 +-
 content/docs/en/functions-api/index.html           |  38 +-
 content/docs/en/functions-cli.html                 | 242 +++---
 content/docs/en/functions-cli/index.html           | 242 +++---
 content/docs/en/functions-debug.html               |   8 +-
 content/docs/en/functions-debug/index.html         |   8 +-
 content/docs/en/functions-debugging.html           |  12 +-
 content/docs/en/functions-debugging/index.html     |  12 +-
 content/docs/en/functions-deploy.html              |  18 +-
 content/docs/en/functions-deploy/index.html        |  18 +-
 content/docs/en/functions-deploying.html           |  12 +-
 content/docs/en/functions-deploying/index.html     |  12 +-
 content/docs/en/functions-develop.html             |  32 +-
 content/docs/en/functions-develop/index.html       |  32 +-
 content/docs/en/functions-guarantees.html          |   4 +-
 content/docs/en/functions-guarantees/index.html    |   4 +-
 content/docs/en/functions-metrics.html             |  10 +-
 content/docs/en/functions-metrics/index.html       |  10 +-
 content/docs/en/functions-overview.html            | 343 +-------
 content/docs/en/functions-overview/index.html      | 343 +-------
 content/docs/en/functions-quickstart.html          |   6 +-
 content/docs/en/functions-quickstart/index.html    |   6 +-
 content/docs/en/functions-runtime.html             |   9 +-
 content/docs/en/functions-runtime/index.html       |   9 +-
 content/docs/en/functions-state.html               |  12 +-
 content/docs/en/functions-state/index.html         |  12 +-
 content/docs/en/functions-worker.html              |  18 +-
 content/docs/en/functions-worker/index.html        |  18 +-
 content/docs/en/io-cdc.html                        |   2 +-
 content/docs/en/io-cdc/index.html                  |   2 +-
 content/docs/en/io-connectors.html                 |   2 +-
 content/docs/en/io-connectors/index.html           |   2 +-
 content/docs/en/io-debug.html                      |   2 +-
 content/docs/en/io-debug/index.html                |   2 +-
 content/docs/en/io-develop.html                    |   2 +-
 content/docs/en/io-develop/index.html              |   2 +-
 content/docs/en/io-managing.html                   |   2 +-
 content/docs/en/io-managing/index.html             |   2 +-
 content/docs/en/io-overview.html                   |   2 +-
 content/docs/en/io-overview/index.html             |   2 +-
 content/docs/en/io-quickstart.html                 |   2 +-
 content/docs/en/io-quickstart/index.html           |   2 +-
 content/docs/en/io-use.html                        |   2 +-
 content/docs/en/io-use/index.html                  |   2 +-
 content/docs/en/next/adaptors-kafka.html           |   2 +-
 content/docs/en/next/adaptors-kafka/index.html     |   2 +-
 content/docs/en/next/adaptors-spark.html           |   2 +-
 content/docs/en/next/adaptors-spark/index.html     |   2 +-
 content/docs/en/next/adaptors-storm.html           |   2 +-
 content/docs/en/next/adaptors-storm/index.html     |   2 +-
 content/docs/en/next/admin-api-brokers.html        |   2 +-
 content/docs/en/next/admin-api-brokers/index.html  |   2 +-
 content/docs/en/next/admin-api-clusters.html       |   2 +-
 content/docs/en/next/admin-api-clusters/index.html |   2 +-
 content/docs/en/next/admin-api-namespaces.html     |   2 +-
 .../docs/en/next/admin-api-namespaces/index.html   |   2 +-
 .../en/next/admin-api-non-persistent-topics.html   |   2 +-
 .../admin-api-non-persistent-topics/index.html     |   2 +-
 content/docs/en/next/admin-api-overview.html       |   2 +-
 content/docs/en/next/admin-api-overview/index.html |   2 +-
 .../docs/en/next/admin-api-partitioned-topics.html |   2 +-
 .../next/admin-api-partitioned-topics/index.html   |   2 +-
 content/docs/en/next/admin-api-permissions.html    |   2 +-
 .../docs/en/next/admin-api-permissions/index.html  |   2 +-
 .../docs/en/next/admin-api-persistent-topics.html  |   2 +-
 .../en/next/admin-api-persistent-topics/index.html |   2 +-
 content/docs/en/next/admin-api-tenants.html        |   2 +-
 content/docs/en/next/admin-api-tenants/index.html  |   2 +-
 content/docs/en/next/administration-dashboard.html |   2 +-
 .../en/next/administration-dashboard/index.html    |   2 +-
 content/docs/en/next/administration-geo.html       |   2 +-
 content/docs/en/next/administration-geo/index.html |   2 +-
 .../docs/en/next/administration-load-balance.html  |   2 +-
 .../en/next/administration-load-balance/index.html |   2 +-
 content/docs/en/next/administration-proxy.html     |   2 +-
 .../docs/en/next/administration-proxy/index.html   |   2 +-
 content/docs/en/next/administration-stats.html     |   2 +-
 .../docs/en/next/administration-stats/index.html   |   2 +-
 content/docs/en/next/administration-upgrade.html   |   2 +-
 .../docs/en/next/administration-upgrade/index.html |   2 +-
 content/docs/en/next/administration-zk-bk.html     |   2 +-
 .../docs/en/next/administration-zk-bk/index.html   |   2 +-
 content/docs/en/next/client-libraries-cpp.html     |   2 +-
 .../docs/en/next/client-libraries-cpp/index.html   |   2 +-
 content/docs/en/next/client-libraries-go.html      |   2 +-
 .../docs/en/next/client-libraries-go/index.html    |   2 +-
 content/docs/en/next/client-libraries-java.html    |   2 +-
 .../docs/en/next/client-libraries-java/index.html  |   2 +-
 content/docs/en/next/client-libraries-python.html  |   2 +-
 .../en/next/client-libraries-python/index.html     |   2 +-
 .../docs/en/next/client-libraries-websocket.html   |   2 +-
 .../en/next/client-libraries-websocket/index.html  |   2 +-
 content/docs/en/next/client-libraries.html         |   2 +-
 content/docs/en/next/client-libraries/index.html   |   2 +-
 .../en/next/concepts-architecture-overview.html    |   2 +-
 .../next/concepts-architecture-overview/index.html |   2 +-
 content/docs/en/next/concepts-authentication.html  |   2 +-
 .../en/next/concepts-authentication/index.html     |   2 +-
 content/docs/en/next/concepts-clients.html         |   2 +-
 content/docs/en/next/concepts-clients/index.html   |   2 +-
 content/docs/en/next/concepts-messaging.html       |   2 +-
 content/docs/en/next/concepts-messaging/index.html |   2 +-
 content/docs/en/next/concepts-multi-tenancy.html   |   2 +-
 .../docs/en/next/concepts-multi-tenancy/index.html |   2 +-
 content/docs/en/next/concepts-overview.html        |   2 +-
 content/docs/en/next/concepts-overview/index.html  |   2 +-
 content/docs/en/next/concepts-replication.html     |   2 +-
 .../docs/en/next/concepts-replication/index.html   |   2 +-
 content/docs/en/next/concepts-tiered-storage.html  |   2 +-
 .../en/next/concepts-tiered-storage/index.html     |   2 +-
 .../docs/en/next/concepts-topic-compaction.html    |   2 +-
 .../en/next/concepts-topic-compaction/index.html   |   2 +-
 .../docs/en/next/cookbooks-bookkeepermetadata.html |   2 +-
 .../next/cookbooks-bookkeepermetadata/index.html   |   2 +-
 content/docs/en/next/cookbooks-compaction.html     |   2 +-
 .../docs/en/next/cookbooks-compaction/index.html   |   2 +-
 content/docs/en/next/cookbooks-deduplication.html  |   2 +-
 .../en/next/cookbooks-deduplication/index.html     |   2 +-
 content/docs/en/next/cookbooks-encryption.html     |   2 +-
 .../docs/en/next/cookbooks-encryption/index.html   |   2 +-
 content/docs/en/next/cookbooks-message-queue.html  |   2 +-
 .../en/next/cookbooks-message-queue/index.html     |   2 +-
 content/docs/en/next/cookbooks-non-persistent.html |   2 +-
 .../en/next/cookbooks-non-persistent/index.html    |   2 +-
 content/docs/en/next/cookbooks-partitioned.html    |   2 +-
 .../docs/en/next/cookbooks-partitioned/index.html  |   2 +-
 .../docs/en/next/cookbooks-retention-expiry.html   |   2 +-
 .../en/next/cookbooks-retention-expiry/index.html  |   2 +-
 content/docs/en/next/cookbooks-tiered-storage.html |   2 +-
 .../en/next/cookbooks-tiered-storage/index.html    |   2 +-
 content/docs/en/next/deploy-aws.html               |   2 +-
 content/docs/en/next/deploy-aws/index.html         |   2 +-
 .../en/next/deploy-bare-metal-multi-cluster.html   |   2 +-
 .../deploy-bare-metal-multi-cluster/index.html     |   2 +-
 content/docs/en/next/deploy-bare-metal.html        |   6 +-
 content/docs/en/next/deploy-bare-metal/index.html  |   6 +-
 content/docs/en/next/deploy-dcos.html              |   2 +-
 content/docs/en/next/deploy-dcos/index.html        |   2 +-
 content/docs/en/next/deploy-kubernetes.html        |   2 +-
 content/docs/en/next/deploy-kubernetes/index.html  |   2 +-
 content/docs/en/next/deploy-monitoring.html        |   2 +-
 content/docs/en/next/deploy-monitoring/index.html  |   2 +-
 content/docs/en/next/develop-binary-protocol.html  |   2 +-
 .../en/next/develop-binary-protocol/index.html     |   2 +-
 content/docs/en/next/develop-cpp.html              |   2 +-
 content/docs/en/next/develop-cpp/index.html        |   2 +-
 content/docs/en/next/develop-load-manager.html     |   2 +-
 .../docs/en/next/develop-load-manager/index.html   |   2 +-
 content/docs/en/next/develop-tools.html            |   2 +-
 content/docs/en/next/develop-tools/index.html      |   2 +-
 content/docs/en/next/functions-cli.html            | 242 +++---
 content/docs/en/next/functions-cli/index.html      | 242 +++---
 content/docs/en/next/functions-debug.html          |   8 +-
 content/docs/en/next/functions-debug/index.html    |   8 +-
 content/docs/en/next/functions-deploy.html         |  18 +-
 content/docs/en/next/functions-deploy/index.html   |  18 +-
 content/docs/en/next/functions-develop.html        |  32 +-
 content/docs/en/next/functions-develop/index.html  |  32 +-
 content/docs/en/next/functions-overview.html       | 343 +-------
 content/docs/en/next/functions-overview/index.html | 343 +-------
 content/docs/en/next/functions-runtime.html        |   9 +-
 content/docs/en/next/functions-runtime/index.html  |   9 +-
 content/docs/en/next/functions-worker.html         |  18 +-
 content/docs/en/next/functions-worker/index.html   |  18 +-
 content/docs/en/next/io-cdc.html                   |   2 +-
 content/docs/en/next/io-cdc/index.html             |   2 +-
 content/docs/en/next/io-connectors.html            |   2 +-
 content/docs/en/next/io-connectors/index.html      |   2 +-
 content/docs/en/next/io-debug.html                 |   2 +-
 content/docs/en/next/io-debug/index.html           |   2 +-
 content/docs/en/next/io-develop.html               |   2 +-
 content/docs/en/next/io-develop/index.html         |   2 +-
 content/docs/en/next/io-managing.html              |   2 +-
 content/docs/en/next/io-managing/index.html        |   2 +-
 content/docs/en/next/io-overview.html              |   4 +-
 content/docs/en/next/io-overview/index.html        |   4 +-
 content/docs/en/next/io-quickstart.html            |   2 +-
 content/docs/en/next/io-quickstart/index.html      |   2 +-
 content/docs/en/next/io-use.html                   |   2 +-
 content/docs/en/next/io-use/index.html             |   2 +-
 content/docs/en/next/pulsar-2.0.html               |   2 +-
 content/docs/en/next/pulsar-2.0/index.html         |   2 +-
 content/docs/en/next/pulsar-admin.html             |   2 +-
 content/docs/en/next/pulsar-admin/index.html       |   2 +-
 content/docs/en/next/reference-cli-tools.html      |   2 +-
 .../docs/en/next/reference-cli-tools/index.html    |   2 +-
 content/docs/en/next/reference-configuration.html  |   2 +-
 .../en/next/reference-configuration/index.html     |   2 +-
 .../docs/en/next/reference-connector-admin.html    |   2 +-
 .../en/next/reference-connector-admin/index.html   |   2 +-
 content/docs/en/next/reference-metrics.html        |   2 +-
 content/docs/en/next/reference-metrics/index.html  |   2 +-
 content/docs/en/next/reference-terminology.html    |   2 +-
 .../docs/en/next/reference-terminology/index.html  |   2 +-
 .../en/next/schema-evolution-compatibility.html    |   2 +-
 .../next/schema-evolution-compatibility/index.html |   2 +-
 content/docs/en/next/schema-get-started.html       |   2 +-
 content/docs/en/next/schema-get-started/index.html |   2 +-
 content/docs/en/next/schema-manage.html            |   2 +-
 content/docs/en/next/schema-manage/index.html      |   2 +-
 content/docs/en/next/schema-understand.html        |   2 +-
 content/docs/en/next/schema-understand/index.html  |   2 +-
 content/docs/en/next/security-athenz.html          |   2 +-
 content/docs/en/next/security-athenz/index.html    |   2 +-
 content/docs/en/next/security-authorization.html   |   2 +-
 .../docs/en/next/security-authorization/index.html |   2 +-
 content/docs/en/next/security-encryption.html      |   2 +-
 .../docs/en/next/security-encryption/index.html    |   2 +-
 content/docs/en/next/security-extending.html       |   2 +-
 content/docs/en/next/security-extending/index.html |   2 +-
 content/docs/en/next/security-kerberos.html        |   2 +-
 content/docs/en/next/security-kerberos/index.html  |   2 +-
 content/docs/en/next/security-overview.html        |   2 +-
 content/docs/en/next/security-overview/index.html  |   2 +-
 .../docs/en/next/security-tls-authentication.html  |   2 +-
 .../en/next/security-tls-authentication/index.html |   2 +-
 content/docs/en/next/security-tls-transport.html   |   2 +-
 .../docs/en/next/security-tls-transport/index.html |   2 +-
 content/docs/en/next/security-token-admin.html     |  93 +-
 .../docs/en/next/security-token-admin/index.html   |  93 +-
 content/docs/en/next/security-token-client.html    |   2 +-
 .../docs/en/next/security-token-client/index.html  |   2 +-
 .../en/next/sql-deployment-configurations.html     |   2 +-
 .../next/sql-deployment-configurations/index.html  |   2 +-
 content/docs/en/next/sql-getting-started.html      |   2 +-
 .../docs/en/next/sql-getting-started/index.html    |   2 +-
 content/docs/en/next/sql-overview.html             |   2 +-
 content/docs/en/next/sql-overview/index.html       |   2 +-
 content/docs/en/next/standalone-docker.html        |   2 +-
 content/docs/en/next/standalone-docker/index.html  |   2 +-
 content/docs/en/next/standalone.html               |   4 +-
 content/docs/en/next/standalone/index.html         |   4 +-
 content/docs/en/pulsar-2.0.html                    |   2 +-
 content/docs/en/pulsar-2.0/index.html              |   2 +-
 content/docs/en/pulsar-admin.html                  |   2 +-
 content/docs/en/pulsar-admin/index.html            |   2 +-
 content/docs/en/reference-cli-tools.html           |   2 +-
 content/docs/en/reference-cli-tools/index.html     |   2 +-
 content/docs/en/reference-configuration.html       |   2 +-
 content/docs/en/reference-configuration/index.html |   2 +-
 content/docs/en/reference-connector-admin.html     |   2 +-
 .../docs/en/reference-connector-admin/index.html   |   2 +-
 content/docs/en/reference-metrics.html             |   2 +-
 content/docs/en/reference-metrics/index.html       |   2 +-
 content/docs/en/reference-terminology.html         |   2 +-
 content/docs/en/reference-terminology/index.html   |   2 +-
 .../docs/en/schema-evolution-compatibility.html    |   2 +-
 .../en/schema-evolution-compatibility/index.html   |   2 +-
 content/docs/en/schema-get-started.html            |   2 +-
 content/docs/en/schema-get-started/index.html      |   2 +-
 content/docs/en/schema-manage.html                 |   2 +-
 content/docs/en/schema-manage/index.html           |   2 +-
 content/docs/en/schema-understand.html             |   2 +-
 content/docs/en/schema-understand/index.html       |   2 +-
 content/docs/en/security-athenz.html               |   2 +-
 content/docs/en/security-athenz/index.html         |   2 +-
 content/docs/en/security-authorization.html        |   2 +-
 content/docs/en/security-authorization/index.html  |   2 +-
 content/docs/en/security-encryption.html           |   2 +-
 content/docs/en/security-encryption/index.html     |   2 +-
 content/docs/en/security-extending.html            |   2 +-
 content/docs/en/security-extending/index.html      |   2 +-
 content/docs/en/security-kerberos.html             |   2 +-
 content/docs/en/security-kerberos/index.html       |   2 +-
 content/docs/en/security-overview.html             |   2 +-
 content/docs/en/security-overview/index.html       |   2 +-
 content/docs/en/security-tls-authentication.html   |   2 +-
 .../docs/en/security-tls-authentication/index.html |   2 +-
 content/docs/en/security-tls-transport.html        |   2 +-
 content/docs/en/security-tls-transport/index.html  |   2 +-
 content/docs/en/security-token-admin.html          |   2 +-
 content/docs/en/security-token-admin/index.html    |   2 +-
 content/docs/en/security-token-client.html         |   2 +-
 content/docs/en/security-token-client/index.html   |   2 +-
 content/docs/en/sql-deployment-configurations.html |   2 +-
 .../en/sql-deployment-configurations/index.html    |   2 +-
 content/docs/en/sql-getting-started.html           |   2 +-
 content/docs/en/sql-getting-started/index.html     |   2 +-
 content/docs/en/sql-overview.html                  |   2 +-
 content/docs/en/sql-overview/index.html            |   2 +-
 content/docs/en/standalone-docker.html             |   2 +-
 content/docs/en/standalone-docker/index.html       |   2 +-
 content/docs/en/standalone.html                    |   2 +-
 content/docs/en/standalone/index.html              |   2 +-
 .../fr/2.1.0-incubating/deploy-bare-metal.html     |   2 +-
 .../2.1.0-incubating/deploy-bare-metal/index.html  |   2 +-
 .../docs/fr/2.1.0-incubating/functions-api.html    |  14 +-
 .../fr/2.1.0-incubating/functions-api/index.html   |  14 +-
 .../fr/2.1.0-incubating/functions-deploying.html   |  10 +-
 .../functions-deploying/index.html                 |  10 +-
 .../fr/2.1.0-incubating/functions-guarantees.html  |   2 +-
 .../functions-guarantees/index.html                |   2 +-
 .../fr/2.1.0-incubating/functions-metrics.html     |   8 +-
 .../2.1.0-incubating/functions-metrics/index.html  |   8 +-
 .../fr/2.1.0-incubating/functions-overview.html    |  22 +-
 .../2.1.0-incubating/functions-overview/index.html |  22 +-
 .../fr/2.1.0-incubating/functions-quickstart.html  |   6 +-
 .../functions-quickstart/index.html                |   6 +-
 .../docs/fr/2.1.0-incubating/functions-state.html  |   8 +-
 .../fr/2.1.0-incubating/functions-state/index.html |   8 +-
 content/docs/fr/2.1.0-incubating/io-overview.html  |   2 +-
 .../fr/2.1.0-incubating/io-overview/index.html     |   2 +-
 .../fr/2.1.1-incubating/deploy-bare-metal.html     |   2 +-
 .../2.1.1-incubating/deploy-bare-metal/index.html  |   2 +-
 .../docs/fr/2.1.1-incubating/functions-api.html    |  14 +-
 .../fr/2.1.1-incubating/functions-api/index.html   |  14 +-
 .../fr/2.1.1-incubating/functions-deploying.html   |  10 +-
 .../functions-deploying/index.html                 |  10 +-
 .../fr/2.1.1-incubating/functions-guarantees.html  |   2 +-
 .../functions-guarantees/index.html                |   2 +-
 .../fr/2.1.1-incubating/functions-metrics.html     |   8 +-
 .../2.1.1-incubating/functions-metrics/index.html  |   8 +-
 .../fr/2.1.1-incubating/functions-overview.html    |  22 +-
 .../2.1.1-incubating/functions-overview/index.html |  22 +-
 .../fr/2.1.1-incubating/functions-quickstart.html  |   6 +-
 .../functions-quickstart/index.html                |   6 +-
 .../docs/fr/2.1.1-incubating/functions-state.html  |   8 +-
 .../fr/2.1.1-incubating/functions-state/index.html |   8 +-
 content/docs/fr/2.1.1-incubating/io-overview.html  |   2 +-
 .../fr/2.1.1-incubating/io-overview/index.html     |   2 +-
 content/docs/fr/2.2.0/deploy-bare-metal.html       |   2 +-
 content/docs/fr/2.2.0/deploy-bare-metal/index.html |   2 +-
 content/docs/fr/2.2.0/functions-api.html           |  14 +-
 content/docs/fr/2.2.0/functions-api/index.html     |  14 +-
 content/docs/fr/2.2.0/functions-deploying.html     |  10 +-
 .../docs/fr/2.2.0/functions-deploying/index.html   |  10 +-
 content/docs/fr/2.2.0/functions-guarantees.html    |   2 +-
 .../docs/fr/2.2.0/functions-guarantees/index.html  |   2 +-
 content/docs/fr/2.2.0/functions-metrics.html       |   8 +-
 content/docs/fr/2.2.0/functions-metrics/index.html |   8 +-
 content/docs/fr/2.2.0/functions-overview.html      |  22 +-
 .../docs/fr/2.2.0/functions-overview/index.html    |  22 +-
 content/docs/fr/2.2.0/functions-quickstart.html    |   6 +-
 .../docs/fr/2.2.0/functions-quickstart/index.html  |   6 +-
 content/docs/fr/2.2.0/functions-state.html         |   8 +-
 content/docs/fr/2.2.0/functions-state/index.html   |   8 +-
 content/docs/fr/2.2.0/io-overview.html             |   2 +-
 content/docs/fr/2.2.0/io-overview/index.html       |   2 +-
 content/docs/fr/2.2.1/deploy-bare-metal.html       |   4 +-
 content/docs/fr/2.2.1/deploy-bare-metal/index.html |   4 +-
 content/docs/fr/2.2.1/functions-api.html           |  14 +-
 content/docs/fr/2.2.1/functions-api/index.html     |  14 +-
 content/docs/fr/2.2.1/functions-deploying.html     |  10 +-
 .../docs/fr/2.2.1/functions-deploying/index.html   |  10 +-
 content/docs/fr/2.2.1/functions-guarantees.html    |   2 +-
 .../docs/fr/2.2.1/functions-guarantees/index.html  |   2 +-
 content/docs/fr/2.2.1/functions-metrics.html       |   8 +-
 content/docs/fr/2.2.1/functions-metrics/index.html |   8 +-
 content/docs/fr/2.2.1/functions-overview.html      |  22 +-
 .../docs/fr/2.2.1/functions-overview/index.html    |  22 +-
 content/docs/fr/2.2.1/functions-quickstart.html    |   6 +-
 .../docs/fr/2.2.1/functions-quickstart/index.html  |   6 +-
 content/docs/fr/2.2.1/functions-state.html         |   8 +-
 content/docs/fr/2.2.1/functions-state/index.html   |   8 +-
 content/docs/fr/2.2.1/io-overview.html             |   2 +-
 content/docs/fr/2.2.1/io-overview/index.html       |   2 +-
 content/docs/fr/2.3.0/deploy-bare-metal.html       |   4 +-
 content/docs/fr/2.3.0/deploy-bare-metal/index.html |   4 +-
 content/docs/fr/2.3.0/functions-api.html           |  14 +-
 content/docs/fr/2.3.0/functions-api/index.html     |  14 +-
 content/docs/fr/2.3.0/functions-deploying.html     |  10 +-
 .../docs/fr/2.3.0/functions-deploying/index.html   |  10 +-
 content/docs/fr/2.3.0/functions-guarantees.html    |   2 +-
 .../docs/fr/2.3.0/functions-guarantees/index.html  |   2 +-
 content/docs/fr/2.3.0/functions-metrics.html       |   8 +-
 content/docs/fr/2.3.0/functions-metrics/index.html |   8 +-
 content/docs/fr/2.3.0/functions-overview.html      |  22 +-
 .../docs/fr/2.3.0/functions-overview/index.html    |  22 +-
 content/docs/fr/2.3.0/functions-quickstart.html    |   6 +-
 .../docs/fr/2.3.0/functions-quickstart/index.html  |   6 +-
 content/docs/fr/2.3.0/functions-state.html         |   8 +-
 content/docs/fr/2.3.0/functions-state/index.html   |   8 +-
 content/docs/fr/2.3.0/io-overview.html             |   2 +-
 content/docs/fr/2.3.0/io-overview/index.html       |   2 +-
 content/docs/fr/2.3.1/deploy-bare-metal.html       |   4 +-
 content/docs/fr/2.3.1/deploy-bare-metal/index.html |   4 +-
 content/docs/fr/2.3.1/functions-api.html           |  14 +-
 content/docs/fr/2.3.1/functions-api/index.html     |  14 +-
 content/docs/fr/2.3.1/functions-deploying.html     |  10 +-
 .../docs/fr/2.3.1/functions-deploying/index.html   |  10 +-
 content/docs/fr/2.3.1/functions-guarantees.html    |   2 +-
 .../docs/fr/2.3.1/functions-guarantees/index.html  |   2 +-
 content/docs/fr/2.3.1/functions-metrics.html       |   8 +-
 content/docs/fr/2.3.1/functions-metrics/index.html |   8 +-
 content/docs/fr/2.3.1/functions-overview.html      |  22 +-
 .../docs/fr/2.3.1/functions-overview/index.html    |  22 +-
 content/docs/fr/2.3.1/functions-quickstart.html    |   6 +-
 .../docs/fr/2.3.1/functions-quickstart/index.html  |   6 +-
 content/docs/fr/2.3.1/functions-state.html         |   8 +-
 content/docs/fr/2.3.1/functions-state/index.html   |   8 +-
 content/docs/fr/2.3.1/io-overview.html             |   2 +-
 content/docs/fr/2.3.1/io-overview/index.html       |   2 +-
 content/docs/fr/2.3.2/deploy-bare-metal.html       |   4 +-
 content/docs/fr/2.3.2/deploy-bare-metal/index.html |   4 +-
 content/docs/fr/2.3.2/functions-api.html           |  14 +-
 content/docs/fr/2.3.2/functions-api/index.html     |  14 +-
 content/docs/fr/2.3.2/functions-deploying.html     |  10 +-
 .../docs/fr/2.3.2/functions-deploying/index.html   |  10 +-
 content/docs/fr/2.3.2/functions-guarantees.html    |   2 +-
 .../docs/fr/2.3.2/functions-guarantees/index.html  |   2 +-
 content/docs/fr/2.3.2/functions-metrics.html       |   8 +-
 content/docs/fr/2.3.2/functions-metrics/index.html |   8 +-
 content/docs/fr/2.3.2/functions-overview.html      |  22 +-
 .../docs/fr/2.3.2/functions-overview/index.html    |  22 +-
 content/docs/fr/2.3.2/functions-quickstart.html    |   6 +-
 .../docs/fr/2.3.2/functions-quickstart/index.html  |   6 +-
 content/docs/fr/2.3.2/functions-state.html         |   8 +-
 content/docs/fr/2.3.2/functions-state/index.html   |   8 +-
 content/docs/fr/2.3.2/functions-worker.html        |   2 +-
 content/docs/fr/2.3.2/functions-worker/index.html  |   2 +-
 content/docs/fr/2.3.2/io-overview.html             |   2 +-
 content/docs/fr/2.3.2/io-overview/index.html       |   2 +-
 content/docs/fr/2.4.0/deploy-bare-metal.html       |   4 +-
 content/docs/fr/2.4.0/deploy-bare-metal/index.html |   4 +-
 content/docs/fr/2.4.0/functions-api.html           |  14 +-
 content/docs/fr/2.4.0/functions-api/index.html     |  14 +-
 content/docs/fr/2.4.0/functions-debugging.html     |  10 +-
 .../docs/fr/2.4.0/functions-debugging/index.html   |  10 +-
 content/docs/fr/2.4.0/functions-deploying.html     |  10 +-
 .../docs/fr/2.4.0/functions-deploying/index.html   |  10 +-
 content/docs/fr/2.4.0/functions-guarantees.html    |   2 +-
 .../docs/fr/2.4.0/functions-guarantees/index.html  |   2 +-
 content/docs/fr/2.4.0/functions-metrics.html       |   8 +-
 content/docs/fr/2.4.0/functions-metrics/index.html |   8 +-
 content/docs/fr/2.4.0/functions-overview.html      |  24 +-
 .../docs/fr/2.4.0/functions-overview/index.html    |  24 +-
 content/docs/fr/2.4.0/functions-quickstart.html    |   2 +-
 .../docs/fr/2.4.0/functions-quickstart/index.html  |   2 +-
 content/docs/fr/2.4.0/functions-runtime.html       |   2 +-
 content/docs/fr/2.4.0/functions-runtime/index.html |   2 +-
 content/docs/fr/2.4.0/functions-state.html         |   8 +-
 content/docs/fr/2.4.0/functions-state/index.html   |   8 +-
 content/docs/fr/2.4.0/functions-worker.html        |   2 +-
 content/docs/fr/2.4.0/functions-worker/index.html  |   2 +-
 content/docs/fr/2.4.0/io-overview.html             |   2 +-
 content/docs/fr/2.4.0/io-overview/index.html       |   2 +-
 content/docs/fr/adaptors-kafka.html                |   2 +-
 content/docs/fr/adaptors-kafka/index.html          |   2 +-
 content/docs/fr/adaptors-spark.html                |   2 +-
 content/docs/fr/adaptors-spark/index.html          |   2 +-
 content/docs/fr/adaptors-storm.html                |   2 +-
 content/docs/fr/adaptors-storm/index.html          |   2 +-
 content/docs/fr/admin-api-brokers.html             |   2 +-
 content/docs/fr/admin-api-brokers/index.html       |   2 +-
 content/docs/fr/admin-api-clusters.html            |   2 +-
 content/docs/fr/admin-api-clusters/index.html      |   2 +-
 content/docs/fr/admin-api-namespaces.html          |   2 +-
 content/docs/fr/admin-api-namespaces/index.html    |   2 +-
 .../docs/fr/admin-api-non-persistent-topics.html   |   2 +-
 .../fr/admin-api-non-persistent-topics/index.html  |   2 +-
 content/docs/fr/admin-api-overview.html            |   2 +-
 content/docs/fr/admin-api-overview/index.html      |   2 +-
 content/docs/fr/admin-api-partitioned-topics.html  |   2 +-
 .../fr/admin-api-partitioned-topics/index.html     |   2 +-
 content/docs/fr/admin-api-permissions.html         |   2 +-
 content/docs/fr/admin-api-permissions/index.html   |   2 +-
 content/docs/fr/admin-api-persistent-topics.html   |   2 +-
 .../docs/fr/admin-api-persistent-topics/index.html |   2 +-
 content/docs/fr/admin-api-schemas.html             |   2 +-
 content/docs/fr/admin-api-schemas/index.html       |   2 +-
 content/docs/fr/admin-api-tenants.html             |   2 +-
 content/docs/fr/admin-api-tenants/index.html       |   2 +-
 content/docs/fr/administration-dashboard.html      |   2 +-
 .../docs/fr/administration-dashboard/index.html    |   2 +-
 content/docs/fr/administration-geo.html            |   2 +-
 content/docs/fr/administration-geo/index.html      |   2 +-
 content/docs/fr/administration-load-balance.html   |   2 +-
 .../docs/fr/administration-load-balance/index.html |   2 +-
 content/docs/fr/administration-proxy.html          |   2 +-
 content/docs/fr/administration-proxy/index.html    |   2 +-
 content/docs/fr/administration-stats.html          |   2 +-
 content/docs/fr/administration-stats/index.html    |   2 +-
 content/docs/fr/administration-upgrade.html        |   2 +-
 content/docs/fr/administration-upgrade/index.html  |   2 +-
 content/docs/fr/administration-zk-bk.html          |   2 +-
 content/docs/fr/administration-zk-bk/index.html    |   2 +-
 content/docs/fr/client-libraries-cpp.html          |   2 +-
 content/docs/fr/client-libraries-cpp/index.html    |   2 +-
 content/docs/fr/client-libraries-go.html           |   2 +-
 content/docs/fr/client-libraries-go/index.html     |   2 +-
 content/docs/fr/client-libraries-java.html         |   2 +-
 content/docs/fr/client-libraries-java/index.html   |   2 +-
 content/docs/fr/client-libraries-python.html       |   2 +-
 content/docs/fr/client-libraries-python/index.html |   2 +-
 content/docs/fr/client-libraries-websocket.html    |   2 +-
 .../docs/fr/client-libraries-websocket/index.html  |   2 +-
 content/docs/fr/client-libraries.html              |   2 +-
 content/docs/fr/client-libraries/index.html        |   2 +-
 .../docs/fr/concepts-architecture-overview.html    |   2 +-
 .../fr/concepts-architecture-overview/index.html   |   2 +-
 content/docs/fr/concepts-authentication.html       |   2 +-
 content/docs/fr/concepts-authentication/index.html |   2 +-
 content/docs/fr/concepts-clients.html              |   2 +-
 content/docs/fr/concepts-clients/index.html        |   2 +-
 content/docs/fr/concepts-messaging.html            |   2 +-
 content/docs/fr/concepts-messaging/index.html      |   2 +-
 content/docs/fr/concepts-multi-tenancy.html        |   2 +-
 content/docs/fr/concepts-multi-tenancy/index.html  |   2 +-
 content/docs/fr/concepts-overview.html             |   2 +-
 content/docs/fr/concepts-overview/index.html       |   2 +-
 content/docs/fr/concepts-replication.html          |   2 +-
 content/docs/fr/concepts-replication/index.html    |   2 +-
 content/docs/fr/concepts-schema-registry.html      |   2 +-
 .../docs/fr/concepts-schema-registry/index.html    |   2 +-
 content/docs/fr/concepts-tiered-storage.html       |   2 +-
 content/docs/fr/concepts-tiered-storage/index.html |   2 +-
 content/docs/fr/concepts-topic-compaction.html     |   2 +-
 .../docs/fr/concepts-topic-compaction/index.html   |   2 +-
 content/docs/fr/cookbooks-bookkeepermetadata.html  |   2 +-
 .../fr/cookbooks-bookkeepermetadata/index.html     |   2 +-
 content/docs/fr/cookbooks-compaction.html          |   2 +-
 content/docs/fr/cookbooks-compaction/index.html    |   2 +-
 content/docs/fr/cookbooks-deduplication.html       |   2 +-
 content/docs/fr/cookbooks-deduplication/index.html |   2 +-
 content/docs/fr/cookbooks-encryption.html          |   2 +-
 content/docs/fr/cookbooks-encryption/index.html    |   2 +-
 content/docs/fr/cookbooks-message-queue.html       |   2 +-
 content/docs/fr/cookbooks-message-queue/index.html |   2 +-
 content/docs/fr/cookbooks-non-persistent.html      |   2 +-
 .../docs/fr/cookbooks-non-persistent/index.html    |   2 +-
 content/docs/fr/cookbooks-partitioned.html         |   2 +-
 content/docs/fr/cookbooks-partitioned/index.html   |   2 +-
 content/docs/fr/cookbooks-retention-expiry.html    |   2 +-
 .../docs/fr/cookbooks-retention-expiry/index.html  |   2 +-
 content/docs/fr/cookbooks-tiered-storage.html      |   2 +-
 .../docs/fr/cookbooks-tiered-storage/index.html    |   2 +-
 content/docs/fr/deploy-aws.html                    |   2 +-
 content/docs/fr/deploy-aws/index.html              |   2 +-
 .../docs/fr/deploy-bare-metal-multi-cluster.html   |   2 +-
 .../fr/deploy-bare-metal-multi-cluster/index.html  |   2 +-
 content/docs/fr/deploy-bare-metal.html             |   6 +-
 content/docs/fr/deploy-bare-metal/index.html       |   6 +-
 content/docs/fr/deploy-dcos.html                   |   2 +-
 content/docs/fr/deploy-dcos/index.html             |   2 +-
 content/docs/fr/deploy-kubernetes.html             |   2 +-
 content/docs/fr/deploy-kubernetes/index.html       |   2 +-
 content/docs/fr/deploy-monitoring.html             |   2 +-
 content/docs/fr/deploy-monitoring/index.html       |   2 +-
 content/docs/fr/develop-binary-protocol.html       |   2 +-
 content/docs/fr/develop-binary-protocol/index.html |   2 +-
 content/docs/fr/develop-cpp.html                   |   2 +-
 content/docs/fr/develop-cpp/index.html             |   2 +-
 content/docs/fr/develop-load-manager.html          |   2 +-
 content/docs/fr/develop-load-manager/index.html    |   2 +-
 content/docs/fr/develop-schema.html                |   2 +-
 content/docs/fr/develop-schema/index.html          |   2 +-
 content/docs/fr/develop-tools.html                 |   2 +-
 content/docs/fr/develop-tools/index.html           |   2 +-
 content/docs/fr/functions-api.html                 |  38 +-
 content/docs/fr/functions-api/index.html           |  38 +-
 content/docs/fr/functions-cli.html                 |   8 +-
 content/docs/fr/functions-cli/index.html           |   8 +-
 content/docs/fr/functions-debug.html               |   8 +-
 content/docs/fr/functions-debug/index.html         |   8 +-
 content/docs/fr/functions-debugging.html           |  12 +-
 content/docs/fr/functions-debugging/index.html     |  12 +-
 content/docs/fr/functions-deploy.html              |  18 +-
 content/docs/fr/functions-deploy/index.html        |  18 +-
 content/docs/fr/functions-deploying.html           |  12 +-
 content/docs/fr/functions-deploying/index.html     |  12 +-
 content/docs/fr/functions-develop.html             |  32 +-
 content/docs/fr/functions-develop/index.html       |  32 +-
 content/docs/fr/functions-guarantees.html          |   4 +-
 content/docs/fr/functions-guarantees/index.html    |   4 +-
 content/docs/fr/functions-metrics.html             |  10 +-
 content/docs/fr/functions-metrics/index.html       |  10 +-
 content/docs/fr/functions-overview.html            | 341 +-------
 content/docs/fr/functions-overview/index.html      | 341 +-------
 content/docs/fr/functions-quickstart.html          |   4 +-
 content/docs/fr/functions-quickstart/index.html    |   4 +-
 content/docs/fr/functions-runtime.html             |   9 +-
 content/docs/fr/functions-runtime/index.html       |   9 +-
 content/docs/fr/functions-state.html               |  10 +-
 content/docs/fr/functions-state/index.html         |  10 +-
 content/docs/fr/functions-worker.html              |  18 +-
 content/docs/fr/functions-worker/index.html        |  18 +-
 content/docs/fr/io-cdc.html                        |   2 +-
 content/docs/fr/io-cdc/index.html                  |   2 +-
 content/docs/fr/io-connectors.html                 |   2 +-
 content/docs/fr/io-connectors/index.html           |   2 +-
 content/docs/fr/io-debug.html                      |   2 +-
 content/docs/fr/io-debug/index.html                |   2 +-
 content/docs/fr/io-develop.html                    |   2 +-
 content/docs/fr/io-develop/index.html              |   2 +-
 content/docs/fr/io-managing.html                   |   2 +-
 content/docs/fr/io-managing/index.html             |   2 +-
 content/docs/fr/io-overview.html                   |   2 +-
 content/docs/fr/io-overview/index.html             |   2 +-
 content/docs/fr/io-quickstart.html                 |   2 +-
 content/docs/fr/io-quickstart/index.html           |   2 +-
 content/docs/fr/io-use.html                        |   2 +-
 content/docs/fr/io-use/index.html                  |   2 +-
 content/docs/fr/next/adaptors-kafka.html           |   2 +-
 content/docs/fr/next/adaptors-kafka/index.html     |   2 +-
 content/docs/fr/next/adaptors-spark.html           |   2 +-
 content/docs/fr/next/adaptors-spark/index.html     |   2 +-
 content/docs/fr/next/adaptors-storm.html           |   2 +-
 content/docs/fr/next/adaptors-storm/index.html     |   2 +-
 content/docs/fr/next/admin-api-brokers.html        |   2 +-
 content/docs/fr/next/admin-api-brokers/index.html  |   2 +-
 content/docs/fr/next/admin-api-clusters.html       |   2 +-
 content/docs/fr/next/admin-api-clusters/index.html |   2 +-
 content/docs/fr/next/admin-api-namespaces.html     |   2 +-
 .../docs/fr/next/admin-api-namespaces/index.html   |   2 +-
 .../fr/next/admin-api-non-persistent-topics.html   |   2 +-
 .../admin-api-non-persistent-topics/index.html     |   2 +-
 content/docs/fr/next/admin-api-overview.html       |   2 +-
 content/docs/fr/next/admin-api-overview/index.html |   2 +-
 .../docs/fr/next/admin-api-partitioned-topics.html |   2 +-
 .../next/admin-api-partitioned-topics/index.html   |   2 +-
 content/docs/fr/next/admin-api-permissions.html    |   2 +-
 .../docs/fr/next/admin-api-permissions/index.html  |   2 +-
 .../docs/fr/next/admin-api-persistent-topics.html  |   2 +-
 .../fr/next/admin-api-persistent-topics/index.html |   2 +-
 content/docs/fr/next/admin-api-tenants.html        |   2 +-
 content/docs/fr/next/admin-api-tenants/index.html  |   2 +-
 content/docs/fr/next/administration-dashboard.html |   2 +-
 .../fr/next/administration-dashboard/index.html    |   2 +-
 content/docs/fr/next/administration-geo.html       |   2 +-
 content/docs/fr/next/administration-geo/index.html |   2 +-
 .../docs/fr/next/administration-load-balance.html  |   2 +-
 .../fr/next/administration-load-balance/index.html |   2 +-
 content/docs/fr/next/administration-proxy.html     |   2 +-
 .../docs/fr/next/administration-proxy/index.html   |   2 +-
 content/docs/fr/next/administration-stats.html     |   2 +-
 .../docs/fr/next/administration-stats/index.html   |   2 +-
 content/docs/fr/next/administration-upgrade.html   |   2 +-
 .../docs/fr/next/administration-upgrade/index.html |   2 +-
 content/docs/fr/next/administration-zk-bk.html     |   2 +-
 .../docs/fr/next/administration-zk-bk/index.html   |   2 +-
 content/docs/fr/next/client-libraries-cpp.html     |   2 +-
 .../docs/fr/next/client-libraries-cpp/index.html   |   2 +-
 content/docs/fr/next/client-libraries-go.html      |   2 +-
 .../docs/fr/next/client-libraries-go/index.html    |   2 +-
 content/docs/fr/next/client-libraries-java.html    |   2 +-
 .../docs/fr/next/client-libraries-java/index.html  |   2 +-
 content/docs/fr/next/client-libraries-python.html  |   2 +-
 .../fr/next/client-libraries-python/index.html     |   2 +-
 .../docs/fr/next/client-libraries-websocket.html   |   2 +-
 .../fr/next/client-libraries-websocket/index.html  |   2 +-
 content/docs/fr/next/client-libraries.html         |   2 +-
 content/docs/fr/next/client-libraries/index.html   |   2 +-
 .../fr/next/concepts-architecture-overview.html    |   2 +-
 .../next/concepts-architecture-overview/index.html |   2 +-
 content/docs/fr/next/concepts-authentication.html  |   2 +-
 .../fr/next/concepts-authentication/index.html     |   2 +-
 content/docs/fr/next/concepts-clients.html         |   2 +-
 content/docs/fr/next/concepts-clients/index.html   |   2 +-
 content/docs/fr/next/concepts-messaging.html       |   2 +-
 content/docs/fr/next/concepts-messaging/index.html |   2 +-
 content/docs/fr/next/concepts-multi-tenancy.html   |   2 +-
 .../docs/fr/next/concepts-multi-tenancy/index.html |   2 +-
 content/docs/fr/next/concepts-overview.html        |   2 +-
 content/docs/fr/next/concepts-overview/index.html  |   2 +-
 content/docs/fr/next/concepts-replication.html     |   2 +-
 .../docs/fr/next/concepts-replication/index.html   |   2 +-
 content/docs/fr/next/concepts-tiered-storage.html  |   2 +-
 .../fr/next/concepts-tiered-storage/index.html     |   2 +-
 .../docs/fr/next/concepts-topic-compaction.html    |   2 +-
 .../fr/next/concepts-topic-compaction/index.html   |   2 +-
 .../docs/fr/next/cookbooks-bookkeepermetadata.html |   2 +-
 .../next/cookbooks-bookkeepermetadata/index.html   |   2 +-
 content/docs/fr/next/cookbooks-compaction.html     |   2 +-
 .../docs/fr/next/cookbooks-compaction/index.html   |   2 +-
 content/docs/fr/next/cookbooks-deduplication.html  |   2 +-
 .../fr/next/cookbooks-deduplication/index.html     |   2 +-
 content/docs/fr/next/cookbooks-encryption.html     |   2 +-
 .../docs/fr/next/cookbooks-encryption/index.html   |   2 +-
 content/docs/fr/next/cookbooks-message-queue.html  |   2 +-
 .../fr/next/cookbooks-message-queue/index.html     |   2 +-
 content/docs/fr/next/cookbooks-non-persistent.html |   2 +-
 .../fr/next/cookbooks-non-persistent/index.html    |   2 +-
 content/docs/fr/next/cookbooks-partitioned.html    |   2 +-
 .../docs/fr/next/cookbooks-partitioned/index.html  |   2 +-
 .../docs/fr/next/cookbooks-retention-expiry.html   |   2 +-
 .../fr/next/cookbooks-retention-expiry/index.html  |   2 +-
 content/docs/fr/next/cookbooks-tiered-storage.html |   2 +-
 .../fr/next/cookbooks-tiered-storage/index.html    |   2 +-
 content/docs/fr/next/deploy-aws.html               |   2 +-
 content/docs/fr/next/deploy-aws/index.html         |   2 +-
 .../fr/next/deploy-bare-metal-multi-cluster.html   |   2 +-
 .../deploy-bare-metal-multi-cluster/index.html     |   2 +-
 content/docs/fr/next/deploy-bare-metal.html        |   4 +-
 content/docs/fr/next/deploy-bare-metal/index.html  |   4 +-
 content/docs/fr/next/deploy-dcos.html              |   2 +-
 content/docs/fr/next/deploy-dcos/index.html        |   2 +-
 content/docs/fr/next/deploy-kubernetes.html        |   2 +-
 content/docs/fr/next/deploy-kubernetes/index.html  |   2 +-
 content/docs/fr/next/deploy-monitoring.html        |   2 +-
 content/docs/fr/next/deploy-monitoring/index.html  |   2 +-
 content/docs/fr/next/develop-binary-protocol.html  |   2 +-
 .../fr/next/develop-binary-protocol/index.html     |   2 +-
 content/docs/fr/next/develop-cpp.html              |   2 +-
 content/docs/fr/next/develop-cpp/index.html        |   2 +-
 content/docs/fr/next/develop-load-manager.html     |   2 +-
 .../docs/fr/next/develop-load-manager/index.html   |   2 +-
 content/docs/fr/next/develop-tools.html            |   2 +-
 content/docs/fr/next/develop-tools/index.html      |   2 +-
 content/docs/fr/next/functions-cli.html            |   8 +-
 content/docs/fr/next/functions-cli/index.html      |   8 +-
 content/docs/fr/next/functions-debug.html          |   8 +-
 content/docs/fr/next/functions-debug/index.html    |   8 +-
 content/docs/fr/next/functions-deploy.html         |  18 +-
 content/docs/fr/next/functions-deploy/index.html   |  18 +-
 content/docs/fr/next/functions-develop.html        |  32 +-
 content/docs/fr/next/functions-develop/index.html  |  32 +-
 content/docs/fr/next/functions-overview.html       | 335 +-------
 content/docs/fr/next/functions-overview/index.html | 335 +-------
 content/docs/fr/next/functions-runtime.html        |   9 +-
 content/docs/fr/next/functions-runtime/index.html  |   9 +-
 content/docs/fr/next/functions-worker.html         |  18 +-
 content/docs/fr/next/functions-worker/index.html   |  18 +-
 content/docs/fr/next/io-cdc.html                   |   2 +-
 content/docs/fr/next/io-cdc/index.html             |   2 +-
 content/docs/fr/next/io-connectors.html            |   2 +-
 content/docs/fr/next/io-connectors/index.html      |   2 +-
 content/docs/fr/next/io-debug.html                 |   2 +-
 content/docs/fr/next/io-debug/index.html           |   2 +-
 content/docs/fr/next/io-develop.html               |   2 +-
 content/docs/fr/next/io-develop/index.html         |   2 +-
 content/docs/fr/next/io-managing.html              |   2 +-
 content/docs/fr/next/io-managing/index.html        |   2 +-
 content/docs/fr/next/io-overview.html              |   4 +-
 content/docs/fr/next/io-overview/index.html        |   4 +-
 content/docs/fr/next/io-quickstart.html            |   2 +-
 content/docs/fr/next/io-quickstart/index.html      |   2 +-
 content/docs/fr/next/io-use.html                   |   2 +-
 content/docs/fr/next/io-use/index.html             |   2 +-
 content/docs/fr/next/pulsar-2.0.html               |   2 +-
 content/docs/fr/next/pulsar-2.0/index.html         |   2 +-
 content/docs/fr/next/pulsar-admin.html             |   2 +-
 content/docs/fr/next/pulsar-admin/index.html       |   2 +-
 content/docs/fr/next/reference-cli-tools.html      |   2 +-
 .../docs/fr/next/reference-cli-tools/index.html    |   2 +-
 content/docs/fr/next/reference-configuration.html  |   2 +-
 .../fr/next/reference-configuration/index.html     |   2 +-
 .../docs/fr/next/reference-connector-admin.html    |   2 +-
 .../fr/next/reference-connector-admin/index.html   |   2 +-
 content/docs/fr/next/reference-metrics.html        |   2 +-
 content/docs/fr/next/reference-metrics/index.html  |   2 +-
 content/docs/fr/next/reference-terminology.html    |   2 +-
 .../docs/fr/next/reference-terminology/index.html  |   2 +-
 .../fr/next/schema-evolution-compatibility.html    |   2 +-
 .../next/schema-evolution-compatibility/index.html |   2 +-
 content/docs/fr/next/schema-get-started.html       |   2 +-
 content/docs/fr/next/schema-get-started/index.html |   2 +-
 content/docs/fr/next/schema-manage.html            |   2 +-
 content/docs/fr/next/schema-manage/index.html      |   2 +-
 content/docs/fr/next/schema-understand.html        |   2 +-
 content/docs/fr/next/schema-understand/index.html  |   2 +-
 content/docs/fr/next/security-athenz.html          |   2 +-
 content/docs/fr/next/security-athenz/index.html    |   2 +-
 content/docs/fr/next/security-authorization.html   |   2 +-
 .../docs/fr/next/security-authorization/index.html |   2 +-
 content/docs/fr/next/security-encryption.html      |   2 +-
 .../docs/fr/next/security-encryption/index.html    |   2 +-
 content/docs/fr/next/security-extending.html       |   2 +-
 content/docs/fr/next/security-extending/index.html |   2 +-
 content/docs/fr/next/security-kerberos.html        |   2 +-
 content/docs/fr/next/security-kerberos/index.html  |   2 +-
 content/docs/fr/next/security-overview.html        |   2 +-
 content/docs/fr/next/security-overview/index.html  |   2 +-
 .../docs/fr/next/security-tls-authentication.html  |   2 +-
 .../fr/next/security-tls-authentication/index.html |   2 +-
 content/docs/fr/next/security-tls-transport.html   |   2 +-
 .../docs/fr/next/security-tls-transport/index.html |   2 +-
 content/docs/fr/next/security-token-admin.html     | 109 ++-
 .../docs/fr/next/security-token-admin/index.html   | 109 ++-
 content/docs/fr/next/security-token-client.html    |   2 +-
 .../docs/fr/next/security-token-client/index.html  |   2 +-
 .../fr/next/sql-deployment-configurations.html     |   2 +-
 .../next/sql-deployment-configurations/index.html  |   2 +-
 content/docs/fr/next/sql-getting-started.html      |   2 +-
 .../docs/fr/next/sql-getting-started/index.html    |   2 +-
 content/docs/fr/next/sql-overview.html             |   2 +-
 content/docs/fr/next/sql-overview/index.html       |   2 +-
 content/docs/fr/next/standalone-docker.html        |   2 +-
 content/docs/fr/next/standalone-docker/index.html  |   2 +-
 content/docs/fr/next/standalone.html               |   4 +-
 content/docs/fr/next/standalone/index.html         |   4 +-
 content/docs/fr/pulsar-2.0.html                    |   2 +-
 content/docs/fr/pulsar-2.0/index.html              |   2 +-
 content/docs/fr/pulsar-admin.html                  |   2 +-
 content/docs/fr/pulsar-admin/index.html            |   2 +-
 content/docs/fr/reference-cli-tools.html           |   2 +-
 content/docs/fr/reference-cli-tools/index.html     |   2 +-
 content/docs/fr/reference-configuration.html       |   2 +-
 content/docs/fr/reference-configuration/index.html |   2 +-
 content/docs/fr/reference-connector-admin.html     |   2 +-
 .../docs/fr/reference-connector-admin/index.html   |   2 +-
 content/docs/fr/reference-metrics.html             |   2 +-
 content/docs/fr/reference-metrics/index.html       |   2 +-
 content/docs/fr/reference-terminology.html         |   2 +-
 content/docs/fr/reference-terminology/index.html   |   2 +-
 .../docs/fr/schema-evolution-compatibility.html    |   2 +-
 .../fr/schema-evolution-compatibility/index.html   |   2 +-
 content/docs/fr/schema-get-started.html            |   2 +-
 content/docs/fr/schema-get-started/index.html      |   2 +-
 content/docs/fr/schema-manage.html                 |   2 +-
 content/docs/fr/schema-manage/index.html           |   2 +-
 content/docs/fr/schema-understand.html             |   2 +-
 content/docs/fr/schema-understand/index.html       |   2 +-
 content/docs/fr/security-athenz.html               |   2 +-
 content/docs/fr/security-athenz/index.html         |   2 +-
 content/docs/fr/security-authorization.html        |   2 +-
 content/docs/fr/security-authorization/index.html  |   2 +-
 content/docs/fr/security-encryption.html           |   2 +-
 content/docs/fr/security-encryption/index.html     |   2 +-
 content/docs/fr/security-extending.html            |   2 +-
 content/docs/fr/security-extending/index.html      |   2 +-
 content/docs/fr/security-kerberos.html             |   2 +-
 content/docs/fr/security-kerberos/index.html       |   2 +-
 content/docs/fr/security-overview.html             |   2 +-
 content/docs/fr/security-overview/index.html       |   2 +-
 content/docs/fr/security-tls-authentication.html   |   2 +-
 .../docs/fr/security-tls-authentication/index.html |   2 +-
 content/docs/fr/security-tls-transport.html        |   2 +-
 content/docs/fr/security-tls-transport/index.html  |   2 +-
 content/docs/fr/security-token-admin.html          |   2 +-
 content/docs/fr/security-token-admin/index.html    |   2 +-
 content/docs/fr/security-token-client.html         |   2 +-
 content/docs/fr/security-token-client/index.html   |   2 +-
 content/docs/fr/sql-deployment-configurations.html |   2 +-
 .../fr/sql-deployment-configurations/index.html    |   2 +-
 content/docs/fr/sql-getting-started.html           |   2 +-
 content/docs/fr/sql-getting-started/index.html     |   2 +-
 content/docs/fr/sql-overview.html                  |   2 +-
 content/docs/fr/sql-overview/index.html            |   2 +-
 content/docs/fr/standalone-docker.html             |   2 +-
 content/docs/fr/standalone-docker/index.html       |   2 +-
 content/docs/fr/standalone.html                    |   2 +-
 content/docs/fr/standalone/index.html              |   2 +-
 .../ja/2.1.0-incubating/deploy-bare-metal.html     |   2 +-
 .../2.1.0-incubating/deploy-bare-metal/index.html  |   2 +-
 .../docs/ja/2.1.0-incubating/functions-api.html    |  14 +-
 .../ja/2.1.0-incubating/functions-api/index.html   |  14 +-
 .../ja/2.1.0-incubating/functions-deploying.html   |  10 +-
 .../functions-deploying/index.html                 |  10 +-
 .../ja/2.1.0-incubating/functions-guarantees.html  |   2 +-
 .../functions-guarantees/index.html                |   2 +-
 .../ja/2.1.0-incubating/functions-metrics.html     |   8 +-
 .../2.1.0-incubating/functions-metrics/index.html  |   8 +-
 .../ja/2.1.0-incubating/functions-overview.html    |  22 +-
 .../2.1.0-incubating/functions-overview/index.html |  22 +-
 .../ja/2.1.0-incubating/functions-quickstart.html  |   6 +-
 .../functions-quickstart/index.html                |   6 +-
 .../docs/ja/2.1.0-incubating/functions-state.html  |   8 +-
 .../ja/2.1.0-incubating/functions-state/index.html |   8 +-
 content/docs/ja/2.1.0-incubating/io-overview.html  |   2 +-
 .../ja/2.1.0-incubating/io-overview/index.html     |   2 +-
 .../ja/2.1.1-incubating/deploy-bare-metal.html     |   2 +-
 .../2.1.1-incubating/deploy-bare-metal/index.html  |   2 +-
 .../docs/ja/2.1.1-incubating/functions-api.html    |  14 +-
 .../ja/2.1.1-incubating/functions-api/index.html   |  14 +-
 .../ja/2.1.1-incubating/functions-deploying.html   |  10 +-
 .../functions-deploying/index.html                 |  10 +-
 .../ja/2.1.1-incubating/functions-guarantees.html  |   2 +-
 .../functions-guarantees/index.html                |   2 +-
 .../ja/2.1.1-incubating/functions-metrics.html     |   8 +-
 .../2.1.1-incubating/functions-metrics/index.html  |   8 +-
 .../ja/2.1.1-incubating/functions-overview.html    |  22 +-
 .../2.1.1-incubating/functions-overview/index.html |  22 +-
 .../ja/2.1.1-incubating/functions-quickstart.html  |   6 +-
 .../functions-quickstart/index.html                |   6 +-
 .../docs/ja/2.1.1-incubating/functions-state.html  |   8 +-
 .../ja/2.1.1-incubating/functions-state/index.html |   8 +-
 content/docs/ja/2.1.1-incubating/io-overview.html  |   2 +-
 .../ja/2.1.1-incubating/io-overview/index.html     |   2 +-
 content/docs/ja/2.2.0/deploy-bare-metal.html       |   2 +-
 content/docs/ja/2.2.0/deploy-bare-metal/index.html |   2 +-
 content/docs/ja/2.2.0/functions-api.html           |  14 +-
 content/docs/ja/2.2.0/functions-api/index.html     |  14 +-
 content/docs/ja/2.2.0/functions-deploying.html     |  10 +-
 .../docs/ja/2.2.0/functions-deploying/index.html   |  10 +-
 content/docs/ja/2.2.0/functions-guarantees.html    |   2 +-
 .../docs/ja/2.2.0/functions-guarantees/index.html  |   2 +-
 content/docs/ja/2.2.0/functions-metrics.html       |   8 +-
 content/docs/ja/2.2.0/functions-metrics/index.html |   8 +-
 content/docs/ja/2.2.0/functions-overview.html      |  22 +-
 .../docs/ja/2.2.0/functions-overview/index.html    |  22 +-
 content/docs/ja/2.2.0/functions-quickstart.html    |   6 +-
 .../docs/ja/2.2.0/functions-quickstart/index.html  |   6 +-
 content/docs/ja/2.2.0/functions-state.html         |   8 +-
 content/docs/ja/2.2.0/functions-state/index.html   |   8 +-
 content/docs/ja/2.2.0/io-overview.html             |   2 +-
 content/docs/ja/2.2.0/io-overview/index.html       |   2 +-
 content/docs/ja/2.2.1/deploy-bare-metal.html       |   4 +-
 content/docs/ja/2.2.1/deploy-bare-metal/index.html |   4 +-
 content/docs/ja/2.2.1/functions-api.html           |  14 +-
 content/docs/ja/2.2.1/functions-api/index.html     |  14 +-
 content/docs/ja/2.2.1/functions-deploying.html     |  10 +-
 .../docs/ja/2.2.1/functions-deploying/index.html   |  10 +-
 content/docs/ja/2.2.1/functions-guarantees.html    |   2 +-
 .../docs/ja/2.2.1/functions-guarantees/index.html  |   2 +-
 content/docs/ja/2.2.1/functions-metrics.html       |   8 +-
 content/docs/ja/2.2.1/functions-metrics/index.html |   8 +-
 content/docs/ja/2.2.1/functions-overview.html      |  22 +-
 .../docs/ja/2.2.1/functions-overview/index.html    |  22 +-
 content/docs/ja/2.2.1/functions-quickstart.html    |   6 +-
 .../docs/ja/2.2.1/functions-quickstart/index.html  |   6 +-
 content/docs/ja/2.2.1/functions-state.html         |   8 +-
 content/docs/ja/2.2.1/functions-state/index.html   |   8 +-
 content/docs/ja/2.2.1/io-overview.html             |   2 +-
 content/docs/ja/2.2.1/io-overview/index.html       |   2 +-
 content/docs/ja/2.3.0/deploy-bare-metal.html       |   4 +-
 content/docs/ja/2.3.0/deploy-bare-metal/index.html |   4 +-
 content/docs/ja/2.3.0/functions-api.html           |  14 +-
 content/docs/ja/2.3.0/functions-api/index.html     |  14 +-
 content/docs/ja/2.3.0/functions-deploying.html     |  10 +-
 .../docs/ja/2.3.0/functions-deploying/index.html   |  10 +-
 content/docs/ja/2.3.0/functions-guarantees.html    |   2 +-
 .../docs/ja/2.3.0/functions-guarantees/index.html  |   2 +-
 content/docs/ja/2.3.0/functions-metrics.html       |   8 +-
 content/docs/ja/2.3.0/functions-metrics/index.html |   8 +-
 content/docs/ja/2.3.0/functions-overview.html      |  22 +-
 .../docs/ja/2.3.0/functions-overview/index.html    |  22 +-
 content/docs/ja/2.3.0/functions-quickstart.html    |   6 +-
 .../docs/ja/2.3.0/functions-quickstart/index.html  |   6 +-
 content/docs/ja/2.3.0/functions-state.html         |   8 +-
 content/docs/ja/2.3.0/functions-state/index.html   |   8 +-
 content/docs/ja/2.3.0/io-overview.html             |   2 +-
 content/docs/ja/2.3.0/io-overview/index.html       |   2 +-
 content/docs/ja/2.3.1/deploy-bare-metal.html       |   4 +-
 content/docs/ja/2.3.1/deploy-bare-metal/index.html |   4 +-
 content/docs/ja/2.3.1/functions-api.html           |  14 +-
 content/docs/ja/2.3.1/functions-api/index.html     |  14 +-
 content/docs/ja/2.3.1/functions-deploying.html     |  10 +-
 .../docs/ja/2.3.1/functions-deploying/index.html   |  10 +-
 content/docs/ja/2.3.1/functions-guarantees.html    |   2 +-
 .../docs/ja/2.3.1/functions-guarantees/index.html  |   2 +-
 content/docs/ja/2.3.1/functions-metrics.html       |   8 +-
 content/docs/ja/2.3.1/functions-metrics/index.html |   8 +-
 content/docs/ja/2.3.1/functions-overview.html      |  22 +-
 .../docs/ja/2.3.1/functions-overview/index.html    |  22 +-
 content/docs/ja/2.3.1/functions-quickstart.html    |   6 +-
 .../docs/ja/2.3.1/functions-quickstart/index.html  |   6 +-
 content/docs/ja/2.3.1/functions-state.html         |   8 +-
 content/docs/ja/2.3.1/functions-state/index.html   |   8 +-
 content/docs/ja/2.3.1/io-overview.html             |   2 +-
 content/docs/ja/2.3.1/io-overview/index.html       |   2 +-
 content/docs/ja/2.3.2/deploy-bare-metal.html       |   4 +-
 content/docs/ja/2.3.2/deploy-bare-metal/index.html |   4 +-
 content/docs/ja/2.3.2/functions-api.html           |  14 +-
 content/docs/ja/2.3.2/functions-api/index.html     |  14 +-
 content/docs/ja/2.3.2/functions-deploying.html     |  10 +-
 .../docs/ja/2.3.2/functions-deploying/index.html   |  10 +-
 content/docs/ja/2.3.2/functions-guarantees.html    |   2 +-
 .../docs/ja/2.3.2/functions-guarantees/index.html  |   2 +-
 content/docs/ja/2.3.2/functions-metrics.html       |   8 +-
 content/docs/ja/2.3.2/functions-metrics/index.html |   8 +-
 content/docs/ja/2.3.2/functions-overview.html      |  22 +-
 .../docs/ja/2.3.2/functions-overview/index.html    |  22 +-
 content/docs/ja/2.3.2/functions-quickstart.html    |   6 +-
 .../docs/ja/2.3.2/functions-quickstart/index.html  |   6 +-
 content/docs/ja/2.3.2/functions-state.html         |   8 +-
 content/docs/ja/2.3.2/functions-state/index.html   |   8 +-
 content/docs/ja/2.3.2/functions-worker.html        |   2 +-
 content/docs/ja/2.3.2/functions-worker/index.html  |   2 +-
 content/docs/ja/2.3.2/io-overview.html             |   2 +-
 content/docs/ja/2.3.2/io-overview/index.html       |   2 +-
 content/docs/ja/2.4.0/deploy-bare-metal.html       |   4 +-
 content/docs/ja/2.4.0/deploy-bare-metal/index.html |   4 +-
 content/docs/ja/2.4.0/functions-api.html           |  14 +-
 content/docs/ja/2.4.0/functions-api/index.html     |  14 +-
 content/docs/ja/2.4.0/functions-debugging.html     |  10 +-
 .../docs/ja/2.4.0/functions-debugging/index.html   |  10 +-
 content/docs/ja/2.4.0/functions-deploying.html     |  10 +-
 .../docs/ja/2.4.0/functions-deploying/index.html   |  10 +-
 content/docs/ja/2.4.0/functions-guarantees.html    |   2 +-
 .../docs/ja/2.4.0/functions-guarantees/index.html  |   2 +-
 content/docs/ja/2.4.0/functions-metrics.html       |   8 +-
 content/docs/ja/2.4.0/functions-metrics/index.html |   8 +-
 content/docs/ja/2.4.0/functions-overview.html      |  24 +-
 .../docs/ja/2.4.0/functions-overview/index.html    |  24 +-
 content/docs/ja/2.4.0/functions-quickstart.html    |   2 +-
 .../docs/ja/2.4.0/functions-quickstart/index.html  |   2 +-
 content/docs/ja/2.4.0/functions-runtime.html       |   2 +-
 content/docs/ja/2.4.0/functions-runtime/index.html |   2 +-
 content/docs/ja/2.4.0/functions-state.html         |   8 +-
 content/docs/ja/2.4.0/functions-state/index.html   |   8 +-
 content/docs/ja/2.4.0/functions-worker.html        |   2 +-
 content/docs/ja/2.4.0/functions-worker/index.html  |   2 +-
 content/docs/ja/2.4.0/io-overview.html             |   2 +-
 content/docs/ja/2.4.0/io-overview/index.html       |   2 +-
 content/docs/ja/adaptors-kafka.html                |   2 +-
 content/docs/ja/adaptors-kafka/index.html          |   2 +-
 content/docs/ja/adaptors-spark.html                |   2 +-
 content/docs/ja/adaptors-spark/index.html          |   2 +-
 content/docs/ja/adaptors-storm.html                |   2 +-
 content/docs/ja/adaptors-storm/index.html          |   2 +-
 content/docs/ja/admin-api-brokers.html             |   2 +-
 content/docs/ja/admin-api-brokers/index.html       |   2 +-
 content/docs/ja/admin-api-clusters.html            |   2 +-
 content/docs/ja/admin-api-clusters/index.html      |   2 +-
 content/docs/ja/admin-api-namespaces.html          |   2 +-
 content/docs/ja/admin-api-namespaces/index.html    |   2 +-
 .../docs/ja/admin-api-non-persistent-topics.html   |   2 +-
 .../ja/admin-api-non-persistent-topics/index.html  |   2 +-
 content/docs/ja/admin-api-overview.html            |   2 +-
 content/docs/ja/admin-api-overview/index.html      |   2 +-
 content/docs/ja/admin-api-partitioned-topics.html  |   2 +-
 .../ja/admin-api-partitioned-topics/index.html     |   2 +-
 content/docs/ja/admin-api-permissions.html         |   2 +-
 content/docs/ja/admin-api-permissions/index.html   |   2 +-
 content/docs/ja/admin-api-persistent-topics.html   |   2 +-
 .../docs/ja/admin-api-persistent-topics/index.html |   2 +-
 content/docs/ja/admin-api-schemas.html             |   2 +-
 content/docs/ja/admin-api-schemas/index.html       |   2 +-
 content/docs/ja/admin-api-tenants.html             |   2 +-
 content/docs/ja/admin-api-tenants/index.html       |   2 +-
 content/docs/ja/administration-dashboard.html      |   2 +-
 .../docs/ja/administration-dashboard/index.html    |   2 +-
 content/docs/ja/administration-geo.html            |   2 +-
 content/docs/ja/administration-geo/index.html      |   2 +-
 content/docs/ja/administration-load-balance.html   |   2 +-
 .../docs/ja/administration-load-balance/index.html |   2 +-
 content/docs/ja/administration-proxy.html          |   2 +-
 content/docs/ja/administration-proxy/index.html    |   2 +-
 content/docs/ja/administration-stats.html          |   2 +-
 content/docs/ja/administration-stats/index.html    |   2 +-
 content/docs/ja/administration-upgrade.html        |   2 +-
 content/docs/ja/administration-upgrade/index.html  |   2 +-
 content/docs/ja/administration-zk-bk.html          |   2 +-
 content/docs/ja/administration-zk-bk/index.html    |   2 +-
 content/docs/ja/client-libraries-cpp.html          |   2 +-
 content/docs/ja/client-libraries-cpp/index.html    |   2 +-
 content/docs/ja/client-libraries-go.html           |   2 +-
 content/docs/ja/client-libraries-go/index.html     |   2 +-
 content/docs/ja/client-libraries-java.html         |   2 +-
 content/docs/ja/client-libraries-java/index.html   |   2 +-
 content/docs/ja/client-libraries-python.html       |   2 +-
 content/docs/ja/client-libraries-python/index.html |   2 +-
 content/docs/ja/client-libraries-websocket.html    |   2 +-
 .../docs/ja/client-libraries-websocket/index.html  |   2 +-
 content/docs/ja/client-libraries.html              |   2 +-
 content/docs/ja/client-libraries/index.html        |   2 +-
 .../docs/ja/concepts-architecture-overview.html    |   2 +-
 .../ja/concepts-architecture-overview/index.html   |   2 +-
 content/docs/ja/concepts-authentication.html       |   2 +-
 content/docs/ja/concepts-authentication/index.html |   2 +-
 content/docs/ja/concepts-clients.html              |   2 +-
 content/docs/ja/concepts-clients/index.html        |   2 +-
 content/docs/ja/concepts-messaging.html            |   2 +-
 content/docs/ja/concepts-messaging/index.html      |   2 +-
 content/docs/ja/concepts-multi-tenancy.html        |   2 +-
 content/docs/ja/concepts-multi-tenancy/index.html  |   2 +-
 content/docs/ja/concepts-overview.html             |   2 +-
 content/docs/ja/concepts-overview/index.html       |   2 +-
 content/docs/ja/concepts-replication.html          |   2 +-
 content/docs/ja/concepts-replication/index.html    |   2 +-
 content/docs/ja/concepts-schema-registry.html      |   2 +-
 .../docs/ja/concepts-schema-registry/index.html    |   2 +-
 content/docs/ja/concepts-tiered-storage.html       |   2 +-
 content/docs/ja/concepts-tiered-storage/index.html |   2 +-
 content/docs/ja/concepts-topic-compaction.html     |   2 +-
 .../docs/ja/concepts-topic-compaction/index.html   |   2 +-
 content/docs/ja/cookbooks-bookkeepermetadata.html  |   2 +-
 .../ja/cookbooks-bookkeepermetadata/index.html     |   2 +-
 content/docs/ja/cookbooks-compaction.html          |   2 +-
 content/docs/ja/cookbooks-compaction/index.html    |   2 +-
 content/docs/ja/cookbooks-deduplication.html       |   2 +-
 content/docs/ja/cookbooks-deduplication/index.html |   2 +-
 content/docs/ja/cookbooks-encryption.html          |   2 +-
 content/docs/ja/cookbooks-encryption/index.html    |   2 +-
 content/docs/ja/cookbooks-message-queue.html       |   2 +-
 content/docs/ja/cookbooks-message-queue/index.html |   2 +-
 content/docs/ja/cookbooks-non-persistent.html      |   2 +-
 .../docs/ja/cookbooks-non-persistent/index.html    |   2 +-
 content/docs/ja/cookbooks-partitioned.html         |   2 +-
 content/docs/ja/cookbooks-partitioned/index.html   |   2 +-
 content/docs/ja/cookbooks-retention-expiry.html    |   2 +-
 .../docs/ja/cookbooks-retention-expiry/index.html  |   2 +-
 content/docs/ja/cookbooks-tiered-storage.html      |   2 +-
 .../docs/ja/cookbooks-tiered-storage/index.html    |   2 +-
 content/docs/ja/deploy-aws.html                    |   2 +-
 content/docs/ja/deploy-aws/index.html              |   2 +-
 .../docs/ja/deploy-bare-metal-multi-cluster.html   |   2 +-
 .../ja/deploy-bare-metal-multi-cluster/index.html  |   2 +-
 content/docs/ja/deploy-bare-metal.html             |   6 +-
 content/docs/ja/deploy-bare-metal/index.html       |   6 +-
 content/docs/ja/deploy-dcos.html                   |   2 +-
 content/docs/ja/deploy-dcos/index.html             |   2 +-
 content/docs/ja/deploy-kubernetes.html             |   2 +-
 content/docs/ja/deploy-kubernetes/index.html       |   2 +-
 content/docs/ja/deploy-monitoring.html             |   2 +-
 content/docs/ja/deploy-monitoring/index.html       |   2 +-
 content/docs/ja/develop-binary-protocol.html       |   2 +-
 content/docs/ja/develop-binary-protocol/index.html |   2 +-
 content/docs/ja/develop-cpp.html                   |   2 +-
 content/docs/ja/develop-cpp/index.html             |   2 +-
 content/docs/ja/develop-load-manager.html          |   2 +-
 content/docs/ja/develop-load-manager/index.html    |   2 +-
 content/docs/ja/develop-schema.html                |   2 +-
 content/docs/ja/develop-schema/index.html          |   2 +-
 content/docs/ja/develop-tools.html                 |   2 +-
 content/docs/ja/develop-tools/index.html           |   2 +-
 content/docs/ja/functions-api.html                 |  38 +-
 content/docs/ja/functions-api/index.html           |  38 +-
 content/docs/ja/functions-cli.html                 |   8 +-
 content/docs/ja/functions-cli/index.html           |   8 +-
 content/docs/ja/functions-debug.html               |   8 +-
 content/docs/ja/functions-debug/index.html         |   8 +-
 content/docs/ja/functions-debugging.html           |  12 +-
 content/docs/ja/functions-debugging/index.html     |  12 +-
 content/docs/ja/functions-deploy.html              |  18 +-
 content/docs/ja/functions-deploy/index.html        |  18 +-
 content/docs/ja/functions-deploying.html           |  12 +-
 content/docs/ja/functions-deploying/index.html     |  12 +-
 content/docs/ja/functions-develop.html             |  32 +-
 content/docs/ja/functions-develop/index.html       |  32 +-
 content/docs/ja/functions-guarantees.html          |   4 +-
 content/docs/ja/functions-guarantees/index.html    |   4 +-
 content/docs/ja/functions-metrics.html             |  10 +-
 content/docs/ja/functions-metrics/index.html       |  10 +-
 content/docs/ja/functions-overview.html            | 341 +-------
 content/docs/ja/functions-overview/index.html      | 341 +-------
 content/docs/ja/functions-quickstart.html          |   4 +-
 content/docs/ja/functions-quickstart/index.html    |   4 +-
 content/docs/ja/functions-runtime.html             |   9 +-
 content/docs/ja/functions-runtime/index.html       |   9 +-
 content/docs/ja/functions-state.html               |  10 +-
 content/docs/ja/functions-state/index.html         |  10 +-
 content/docs/ja/functions-worker.html              |  18 +-
 content/docs/ja/functions-worker/index.html        |  18 +-
 content/docs/ja/io-cdc.html                        |   2 +-
 content/docs/ja/io-cdc/index.html                  |   2 +-
 content/docs/ja/io-connectors.html                 |   2 +-
 content/docs/ja/io-connectors/index.html           |   2 +-
 content/docs/ja/io-debug.html                      |   2 +-
 content/docs/ja/io-debug/index.html                |   2 +-
 content/docs/ja/io-develop.html                    |   2 +-
 content/docs/ja/io-develop/index.html              |   2 +-
 content/docs/ja/io-managing.html                   |   2 +-
 content/docs/ja/io-managing/index.html             |   2 +-
 content/docs/ja/io-overview.html                   |   2 +-
 content/docs/ja/io-overview/index.html             |   2 +-
 content/docs/ja/io-quickstart.html                 |   2 +-
 content/docs/ja/io-quickstart/index.html           |   2 +-
 content/docs/ja/io-use.html                        |   2 +-
 content/docs/ja/io-use/index.html                  |   2 +-
 content/docs/ja/next/adaptors-kafka.html           |   2 +-
 content/docs/ja/next/adaptors-kafka/index.html     |   2 +-
 content/docs/ja/next/adaptors-spark.html           |   2 +-
 content/docs/ja/next/adaptors-spark/index.html     |   2 +-
 content/docs/ja/next/adaptors-storm.html           |   2 +-
 content/docs/ja/next/adaptors-storm/index.html     |   2 +-
 content/docs/ja/next/admin-api-brokers.html        |   2 +-
 content/docs/ja/next/admin-api-brokers/index.html  |   2 +-
 content/docs/ja/next/admin-api-clusters.html       |   2 +-
 content/docs/ja/next/admin-api-clusters/index.html |   2 +-
 content/docs/ja/next/admin-api-namespaces.html     |   2 +-
 .../docs/ja/next/admin-api-namespaces/index.html   |   2 +-
 .../ja/next/admin-api-non-persistent-topics.html   |   2 +-
 .../admin-api-non-persistent-topics/index.html     |   2 +-
 content/docs/ja/next/admin-api-overview.html       |   2 +-
 content/docs/ja/next/admin-api-overview/index.html |   2 +-
 .../docs/ja/next/admin-api-partitioned-topics.html |   2 +-
 .../next/admin-api-partitioned-topics/index.html   |   2 +-
 content/docs/ja/next/admin-api-permissions.html    |   2 +-
 .../docs/ja/next/admin-api-permissions/index.html  |   2 +-
 .../docs/ja/next/admin-api-persistent-topics.html  |   2 +-
 .../ja/next/admin-api-persistent-topics/index.html |   2 +-
 content/docs/ja/next/admin-api-tenants.html        |   2 +-
 content/docs/ja/next/admin-api-tenants/index.html  |   2 +-
 content/docs/ja/next/administration-dashboard.html |   2 +-
 .../ja/next/administration-dashboard/index.html    |   2 +-
 content/docs/ja/next/administration-geo.html       |   2 +-
 content/docs/ja/next/administration-geo/index.html |   2 +-
 .../docs/ja/next/administration-load-balance.html  |   2 +-
 .../ja/next/administration-load-balance/index.html |   2 +-
 content/docs/ja/next/administration-proxy.html     |   2 +-
 .../docs/ja/next/administration-proxy/index.html   |   2 +-
 content/docs/ja/next/administration-stats.html     |   2 +-
 .../docs/ja/next/administration-stats/index.html   |   2 +-
 content/docs/ja/next/administration-upgrade.html   |   2 +-
 .../docs/ja/next/administration-upgrade/index.html |   2 +-
 content/docs/ja/next/administration-zk-bk.html     |   2 +-
 .../docs/ja/next/administration-zk-bk/index.html   |   2 +-
 content/docs/ja/next/client-libraries-cpp.html     |   2 +-
 .../docs/ja/next/client-libraries-cpp/index.html   |   2 +-
 content/docs/ja/next/client-libraries-go.html      |   2 +-
 .../docs/ja/next/client-libraries-go/index.html    |   2 +-
 content/docs/ja/next/client-libraries-java.html    |   2 +-
 .../docs/ja/next/client-libraries-java/index.html  |   2 +-
 content/docs/ja/next/client-libraries-python.html  |   2 +-
 .../ja/next/client-libraries-python/index.html     |   2 +-
 .../docs/ja/next/client-libraries-websocket.html   |   2 +-
 .../ja/next/client-libraries-websocket/index.html  |   2 +-
 content/docs/ja/next/client-libraries.html         |   2 +-
 content/docs/ja/next/client-libraries/index.html   |   2 +-
 .../ja/next/concepts-architecture-overview.html    |   2 +-
 .../next/concepts-architecture-overview/index.html |   2 +-
 content/docs/ja/next/concepts-authentication.html  |   2 +-
 .../ja/next/concepts-authentication/index.html     |   2 +-
 content/docs/ja/next/concepts-clients.html         |   2 +-
 content/docs/ja/next/concepts-clients/index.html   |   2 +-
 content/docs/ja/next/concepts-messaging.html       |   2 +-
 content/docs/ja/next/concepts-messaging/index.html |   2 +-
 content/docs/ja/next/concepts-multi-tenancy.html   |   2 +-
 .../docs/ja/next/concepts-multi-tenancy/index.html |   2 +-
 content/docs/ja/next/concepts-overview.html        |   2 +-
 content/docs/ja/next/concepts-overview/index.html  |   2 +-
 content/docs/ja/next/concepts-replication.html     |   2 +-
 .../docs/ja/next/concepts-replication/index.html   |   2 +-
 content/docs/ja/next/concepts-tiered-storage.html  |   2 +-
 .../ja/next/concepts-tiered-storage/index.html     |   2 +-
 .../docs/ja/next/concepts-topic-compaction.html    |   2 +-
 .../ja/next/concepts-topic-compaction/index.html   |   2 +-
 .../docs/ja/next/cookbooks-bookkeepermetadata.html |   2 +-
 .../next/cookbooks-bookkeepermetadata/index.html   |   2 +-
 content/docs/ja/next/cookbooks-compaction.html     |   2 +-
 .../docs/ja/next/cookbooks-compaction/index.html   |   2 +-
 content/docs/ja/next/cookbooks-deduplication.html  |   2 +-
 .../ja/next/cookbooks-deduplication/index.html     |   2 +-
 content/docs/ja/next/cookbooks-encryption.html     |   2 +-
 .../docs/ja/next/cookbooks-encryption/index.html   |   2 +-
 content/docs/ja/next/cookbooks-message-queue.html  |   2 +-
 .../ja/next/cookbooks-message-queue/index.html     |   2 +-
 content/docs/ja/next/cookbooks-non-persistent.html |   2 +-
 .../ja/next/cookbooks-non-persistent/index.html    |   2 +-
 content/docs/ja/next/cookbooks-partitioned.html    |   2 +-
 .../docs/ja/next/cookbooks-partitioned/index.html  |   2 +-
 .../docs/ja/next/cookbooks-retention-expiry.html   |   2 +-
 .../ja/next/cookbooks-retention-expiry/index.html  |   2 +-
 content/docs/ja/next/cookbooks-tiered-storage.html |   2 +-
 .../ja/next/cookbooks-tiered-storage/index.html    |   2 +-
 content/docs/ja/next/deploy-aws.html               |   2 +-
 content/docs/ja/next/deploy-aws/index.html         |   2 +-
 .../ja/next/deploy-bare-metal-multi-cluster.html   |   2 +-
 .../deploy-bare-metal-multi-cluster/index.html     |   2 +-
 content/docs/ja/next/deploy-bare-metal.html        |   4 +-
 content/docs/ja/next/deploy-bare-metal/index.html  |   4 +-
 content/docs/ja/next/deploy-dcos.html              |   2 +-
 content/docs/ja/next/deploy-dcos/index.html        |   2 +-
 content/docs/ja/next/deploy-kubernetes.html        |   2 +-
 content/docs/ja/next/deploy-kubernetes/index.html  |   2 +-
 content/docs/ja/next/deploy-monitoring.html        |   2 +-
 content/docs/ja/next/deploy-monitoring/index.html  |   2 +-
 content/docs/ja/next/develop-binary-protocol.html  |   2 +-
 .../ja/next/develop-binary-protocol/index.html     |   2 +-
 content/docs/ja/next/develop-cpp.html              |   2 +-
 content/docs/ja/next/develop-cpp/index.html        |   2 +-
 content/docs/ja/next/develop-load-manager.html     |   2 +-
 .../docs/ja/next/develop-load-manager/index.html   |   2 +-
 content/docs/ja/next/develop-tools.html            |   2 +-
 content/docs/ja/next/develop-tools/index.html      |   2 +-
 content/docs/ja/next/functions-cli.html            |   8 +-
 content/docs/ja/next/functions-cli/index.html      |   8 +-
 content/docs/ja/next/functions-debug.html          |   8 +-
 content/docs/ja/next/functions-debug/index.html    |   8 +-
 content/docs/ja/next/functions-deploy.html         |  18 +-
 content/docs/ja/next/functions-deploy/index.html   |  18 +-
 content/docs/ja/next/functions-develop.html        |  32 +-
 content/docs/ja/next/functions-develop/index.html  |  32 +-
 content/docs/ja/next/functions-overview.html       | 335 +-------
 content/docs/ja/next/functions-overview/index.html | 335 +-------
 content/docs/ja/next/functions-runtime.html        |   9 +-
 content/docs/ja/next/functions-runtime/index.html  |   9 +-
 content/docs/ja/next/functions-worker.html         |  18 +-
 content/docs/ja/next/functions-worker/index.html   |  18 +-
 content/docs/ja/next/io-cdc.html                   |   2 +-
 content/docs/ja/next/io-cdc/index.html             |   2 +-
 content/docs/ja/next/io-connectors.html            |   2 +-
 content/docs/ja/next/io-connectors/index.html      |   2 +-
 content/docs/ja/next/io-debug.html                 |   2 +-
 content/docs/ja/next/io-debug/index.html           |   2 +-
 content/docs/ja/next/io-develop.html               |   2 +-
 content/docs/ja/next/io-develop/index.html         |   2 +-
 content/docs/ja/next/io-managing.html              |   2 +-
 content/docs/ja/next/io-managing/index.html        |   2 +-
 content/docs/ja/next/io-overview.html              |   4 +-
 content/docs/ja/next/io-overview/index.html        |   4 +-
 content/docs/ja/next/io-quickstart.html            |   2 +-
 content/docs/ja/next/io-quickstart/index.html      |   2 +-
 content/docs/ja/next/io-use.html                   |   2 +-
 content/docs/ja/next/io-use/index.html             |   2 +-
 content/docs/ja/next/pulsar-2.0.html               |   2 +-
 content/docs/ja/next/pulsar-2.0/index.html         |   2 +-
 content/docs/ja/next/pulsar-admin.html             |   2 +-
 content/docs/ja/next/pulsar-admin/index.html       |   2 +-
 content/docs/ja/next/reference-cli-tools.html      |   2 +-
 .../docs/ja/next/reference-cli-tools/index.html    |   2 +-
 content/docs/ja/next/reference-configuration.html  |   2 +-
 .../ja/next/reference-configuration/index.html     |   2 +-
 .../docs/ja/next/reference-connector-admin.html    |   2 +-
 .../ja/next/reference-connector-admin/index.html   |   2 +-
 content/docs/ja/next/reference-metrics.html        |   2 +-
 content/docs/ja/next/reference-metrics/index.html  |   2 +-
 content/docs/ja/next/reference-terminology.html    |   2 +-
 .../docs/ja/next/reference-terminology/index.html  |   2 +-
 .../ja/next/schema-evolution-compatibility.html    |   2 +-
 .../next/schema-evolution-compatibility/index.html |   2 +-
 content/docs/ja/next/schema-get-started.html       |   2 +-
 content/docs/ja/next/schema-get-started/index.html |   2 +-
 content/docs/ja/next/schema-manage.html            |   2 +-
 content/docs/ja/next/schema-manage/index.html      |   2 +-
 content/docs/ja/next/schema-understand.html        |   2 +-
 content/docs/ja/next/schema-understand/index.html  |   2 +-
 content/docs/ja/next/security-athenz.html          |   2 +-
 content/docs/ja/next/security-athenz/index.html    |   2 +-
 content/docs/ja/next/security-authorization.html   |   2 +-
 .../docs/ja/next/security-authorization/index.html |   2 +-
 content/docs/ja/next/security-encryption.html      |   2 +-
 .../docs/ja/next/security-encryption/index.html    |   2 +-
 content/docs/ja/next/security-extending.html       |   2 +-
 content/docs/ja/next/security-extending/index.html |   2 +-
 content/docs/ja/next/security-kerberos.html        |   2 +-
 content/docs/ja/next/security-kerberos/index.html  |   2 +-
 content/docs/ja/next/security-overview.html        |   2 +-
 content/docs/ja/next/security-overview/index.html  |   2 +-
 .../docs/ja/next/security-tls-authentication.html  |   2 +-
 .../ja/next/security-tls-authentication/index.html |   2 +-
 content/docs/ja/next/security-tls-transport.html   |   2 +-
 .../docs/ja/next/security-tls-transport/index.html |   2 +-
 content/docs/ja/next/security-token-admin.html     | 109 ++-
 .../docs/ja/next/security-token-admin/index.html   | 109 ++-
 content/docs/ja/next/security-token-client.html    |   2 +-
 .../docs/ja/next/security-token-client/index.html  |   2 +-
 .../ja/next/sql-deployment-configurations.html     |   2 +-
 .../next/sql-deployment-configurations/index.html  |   2 +-
 content/docs/ja/next/sql-getting-started.html      |   2 +-
 .../docs/ja/next/sql-getting-started/index.html    |   2 +-
 content/docs/ja/next/sql-overview.html             |   2 +-
 content/docs/ja/next/sql-overview/index.html       |   2 +-
 content/docs/ja/next/standalone-docker.html        |   2 +-
 content/docs/ja/next/standalone-docker/index.html  |   2 +-
 content/docs/ja/next/standalone.html               |   4 +-
 content/docs/ja/next/standalone/index.html         |   4 +-
 content/docs/ja/pulsar-2.0.html                    |   2 +-
 content/docs/ja/pulsar-2.0/index.html              |   2 +-
 content/docs/ja/pulsar-admin.html                  |   2 +-
 content/docs/ja/pulsar-admin/index.html            |   2 +-
 content/docs/ja/reference-cli-tools.html           |   2 +-
 content/docs/ja/reference-cli-tools/index.html     |   2 +-
 content/docs/ja/reference-configuration.html       |   2 +-
 content/docs/ja/reference-configuration/index.html |   2 +-
 content/docs/ja/reference-connector-admin.html     |   2 +-
 .../docs/ja/reference-connector-admin/index.html   |   2 +-
 content/docs/ja/reference-metrics.html             |   2 +-
 content/docs/ja/reference-metrics/index.html       |   2 +-
 content/docs/ja/reference-terminology.html         |   2 +-
 content/docs/ja/reference-terminology/index.html   |   2 +-
 .../docs/ja/schema-evolution-compatibility.html    |   2 +-
 .../ja/schema-evolution-compatibility/index.html   |   2 +-
 content/docs/ja/schema-get-started.html            |   2 +-
 content/docs/ja/schema-get-started/index.html      |   2 +-
 content/docs/ja/schema-manage.html                 |   2 +-
 content/docs/ja/schema-manage/index.html           |   2 +-
 content/docs/ja/schema-understand.html             |   2 +-
 content/docs/ja/schema-understand/index.html       |   2 +-
 content/docs/ja/security-athenz.html               |   2 +-
 content/docs/ja/security-athenz/index.html         |   2 +-
 content/docs/ja/security-authorization.html        |   2 +-
 content/docs/ja/security-authorization/index.html  |   2 +-
 content/docs/ja/security-encryption.html           |   2 +-
 content/docs/ja/security-encryption/index.html     |   2 +-
 content/docs/ja/security-extending.html            |   2 +-
 content/docs/ja/security-extending/index.html      |   2 +-
 content/docs/ja/security-kerberos.html             |   2 +-
 content/docs/ja/security-kerberos/index.html       |   2 +-
 content/docs/ja/security-overview.html             |   2 +-
 content/docs/ja/security-overview/index.html       |   2 +-
 content/docs/ja/security-tls-authentication.html   |   2 +-
 .../docs/ja/security-tls-authentication/index.html |   2 +-
 content/docs/ja/security-tls-transport.html        |   2 +-
 content/docs/ja/security-tls-transport/index.html  |   2 +-
 content/docs/ja/security-token-admin.html          |   2 +-
 content/docs/ja/security-token-admin/index.html    |   2 +-
 content/docs/ja/security-token-client.html         |   2 +-
 content/docs/ja/security-token-client/index.html   |   2 +-
 content/docs/ja/sql-deployment-configurations.html |   2 +-
 .../ja/sql-deployment-configurations/index.html    |   2 +-
 content/docs/ja/sql-getting-started.html           |   2 +-
 content/docs/ja/sql-getting-started/index.html     |   2 +-
 content/docs/ja/sql-overview.html                  |   2 +-
 content/docs/ja/sql-overview/index.html            |   2 +-
 content/docs/ja/standalone-docker.html             |   2 +-
 content/docs/ja/standalone-docker/index.html       |   2 +-
 content/docs/ja/standalone.html                    |   2 +-
 content/docs/ja/standalone/index.html              |   2 +-
 .../zh-CN/2.1.0-incubating/deploy-bare-metal.html  |   2 +-
 .../2.1.0-incubating/deploy-bare-metal/index.html  |   2 +-
 .../docs/zh-CN/2.1.0-incubating/functions-api.html |  14 +-
 .../2.1.0-incubating/functions-api/index.html      |  14 +-
 .../2.1.0-incubating/functions-deploying.html      |  10 +-
 .../functions-deploying/index.html                 |  10 +-
 .../2.1.0-incubating/functions-guarantees.html     |   2 +-
 .../functions-guarantees/index.html                |   2 +-
 .../zh-CN/2.1.0-incubating/functions-metrics.html  |   8 +-
 .../2.1.0-incubating/functions-metrics/index.html  |   8 +-
 .../zh-CN/2.1.0-incubating/functions-overview.html |  22 +-
 .../2.1.0-incubating/functions-overview/index.html |  22 +-
 .../2.1.0-incubating/functions-quickstart.html     |   6 +-
 .../functions-quickstart/index.html                |   6 +-
 .../zh-CN/2.1.0-incubating/functions-state.html    |   8 +-
 .../2.1.0-incubating/functions-state/index.html    |   8 +-
 .../docs/zh-CN/2.1.0-incubating/io-overview.html   |   2 +-
 .../zh-CN/2.1.0-incubating/io-overview/index.html  |   2 +-
 .../zh-CN/2.1.1-incubating/deploy-bare-metal.html  |   2 +-
 .../2.1.1-incubating/deploy-bare-metal/index.html  |   2 +-
 .../docs/zh-CN/2.1.1-incubating/functions-api.html |  14 +-
 .../2.1.1-incubating/functions-api/index.html      |  14 +-
 .../2.1.1-incubating/functions-deploying.html      |  10 +-
 .../functions-deploying/index.html                 |  10 +-
 .../2.1.1-incubating/functions-guarantees.html     |   2 +-
 .../functions-guarantees/index.html                |   2 +-
 .../zh-CN/2.1.1-incubating/functions-metrics.html  |   8 +-
 .../2.1.1-incubating/functions-metrics/index.html  |   8 +-
 .../zh-CN/2.1.1-incubating/functions-overview.html |  22 +-
 .../2.1.1-incubating/functions-overview/index.html |  22 +-
 .../2.1.1-incubating/functions-quickstart.html     |   6 +-
 .../functions-quickstart/index.html                |   6 +-
 .../zh-CN/2.1.1-incubating/functions-state.html    |   8 +-
 .../2.1.1-incubating/functions-state/index.html    |   8 +-
 .../docs/zh-CN/2.1.1-incubating/io-overview.html   |   2 +-
 .../zh-CN/2.1.1-incubating/io-overview/index.html  |   2 +-
 content/docs/zh-CN/2.2.0/deploy-bare-metal.html    |   2 +-
 .../docs/zh-CN/2.2.0/deploy-bare-metal/index.html  |   2 +-
 content/docs/zh-CN/2.2.0/functions-api.html        |  14 +-
 content/docs/zh-CN/2.2.0/functions-api/index.html  |  14 +-
 content/docs/zh-CN/2.2.0/functions-deploying.html  |  10 +-
 .../zh-CN/2.2.0/functions-deploying/index.html     |  10 +-
 content/docs/zh-CN/2.2.0/functions-guarantees.html |   2 +-
 .../zh-CN/2.2.0/functions-guarantees/index.html    |   2 +-
 content/docs/zh-CN/2.2.0/functions-metrics.html    |   8 +-
 .../docs/zh-CN/2.2.0/functions-metrics/index.html  |   8 +-
 content/docs/zh-CN/2.2.0/functions-overview.html   |  22 +-
 .../docs/zh-CN/2.2.0/functions-overview/index.html |  22 +-
 content/docs/zh-CN/2.2.0/functions-quickstart.html |   6 +-
 .../zh-CN/2.2.0/functions-quickstart/index.html    |   6 +-
 content/docs/zh-CN/2.2.0/functions-state.html      |   8 +-
 .../docs/zh-CN/2.2.0/functions-state/index.html    |   8 +-
 content/docs/zh-CN/2.2.0/io-overview.html          |   2 +-
 content/docs/zh-CN/2.2.0/io-overview/index.html    |   2 +-
 content/docs/zh-CN/2.2.1/deploy-bare-metal.html    |   4 +-
 .../docs/zh-CN/2.2.1/deploy-bare-metal/index.html  |   4 +-
 content/docs/zh-CN/2.2.1/functions-api.html        |  14 +-
 content/docs/zh-CN/2.2.1/functions-api/index.html  |  14 +-
 content/docs/zh-CN/2.2.1/functions-deploying.html  |  10 +-
 .../zh-CN/2.2.1/functions-deploying/index.html     |  10 +-
 content/docs/zh-CN/2.2.1/functions-guarantees.html |   2 +-
 .../zh-CN/2.2.1/functions-guarantees/index.html    |   2 +-
 content/docs/zh-CN/2.2.1/functions-metrics.html    |   8 +-
 .../docs/zh-CN/2.2.1/functions-metrics/index.html  |   8 +-
 content/docs/zh-CN/2.2.1/functions-overview.html   |  22 +-
 .../docs/zh-CN/2.2.1/functions-overview/index.html |  22 +-
 content/docs/zh-CN/2.2.1/functions-quickstart.html |   6 +-
 .../zh-CN/2.2.1/functions-quickstart/index.html    |   6 +-
 content/docs/zh-CN/2.2.1/functions-state.html      |   8 +-
 .../docs/zh-CN/2.2.1/functions-state/index.html    |   8 +-
 content/docs/zh-CN/2.2.1/io-overview.html          |   2 +-
 content/docs/zh-CN/2.2.1/io-overview/index.html    |   2 +-
 content/docs/zh-CN/2.3.0/deploy-bare-metal.html    |   4 +-
 .../docs/zh-CN/2.3.0/deploy-bare-metal/index.html  |   4 +-
 content/docs/zh-CN/2.3.0/functions-api.html        |  14 +-
 content/docs/zh-CN/2.3.0/functions-api/index.html  |  14 +-
 content/docs/zh-CN/2.3.0/functions-deploying.html  |  10 +-
 .../zh-CN/2.3.0/functions-deploying/index.html     |  10 +-
 content/docs/zh-CN/2.3.0/functions-guarantees.html |   2 +-
 .../zh-CN/2.3.0/functions-guarantees/index.html    |   2 +-
 content/docs/zh-CN/2.3.0/functions-metrics.html    |   8 +-
 .../docs/zh-CN/2.3.0/functions-metrics/index.html  |   8 +-
 content/docs/zh-CN/2.3.0/functions-overview.html   |  22 +-
 .../docs/zh-CN/2.3.0/functions-overview/index.html |  22 +-
 content/docs/zh-CN/2.3.0/functions-quickstart.html |   6 +-
 .../zh-CN/2.3.0/functions-quickstart/index.html    |   6 +-
 content/docs/zh-CN/2.3.0/functions-state.html      |   8 +-
 .../docs/zh-CN/2.3.0/functions-state/index.html    |   8 +-
 content/docs/zh-CN/2.3.0/io-overview.html          |   2 +-
 content/docs/zh-CN/2.3.0/io-overview/index.html    |   2 +-
 content/docs/zh-CN/2.3.1/deploy-bare-metal.html    |   4 +-
 .../docs/zh-CN/2.3.1/deploy-bare-metal/index.html  |   4 +-
 content/docs/zh-CN/2.3.1/functions-api.html        |  14 +-
 content/docs/zh-CN/2.3.1/functions-api/index.html  |  14 +-
 content/docs/zh-CN/2.3.1/functions-deploying.html  |  10 +-
 .../zh-CN/2.3.1/functions-deploying/index.html     |  10 +-
 content/docs/zh-CN/2.3.1/functions-guarantees.html |   2 +-
 .../zh-CN/2.3.1/functions-guarantees/index.html    |   2 +-
 content/docs/zh-CN/2.3.1/functions-metrics.html    |   8 +-
 .../docs/zh-CN/2.3.1/functions-metrics/index.html  |   8 +-
 content/docs/zh-CN/2.3.1/functions-overview.html   |  22 +-
 .../docs/zh-CN/2.3.1/functions-overview/index.html |  22 +-
 content/docs/zh-CN/2.3.1/functions-quickstart.html |   6 +-
 .../zh-CN/2.3.1/functions-quickstart/index.html    |   6 +-
 content/docs/zh-CN/2.3.1/functions-state.html      |   8 +-
 .../docs/zh-CN/2.3.1/functions-state/index.html    |   8 +-
 content/docs/zh-CN/2.3.1/io-overview.html          |   2 +-
 content/docs/zh-CN/2.3.1/io-overview/index.html    |   2 +-
 content/docs/zh-CN/2.3.2/deploy-bare-metal.html    |   4 +-
 .../docs/zh-CN/2.3.2/deploy-bare-metal/index.html  |   4 +-
 content/docs/zh-CN/2.3.2/functions-api.html        |  14 +-
 content/docs/zh-CN/2.3.2/functions-api/index.html  |  14 +-
 content/docs/zh-CN/2.3.2/functions-deploying.html  |  10 +-
 .../zh-CN/2.3.2/functions-deploying/index.html     |  10 +-
 content/docs/zh-CN/2.3.2/functions-guarantees.html |   2 +-
 .../zh-CN/2.3.2/functions-guarantees/index.html    |   2 +-
 content/docs/zh-CN/2.3.2/functions-metrics.html    |   8 +-
 .../docs/zh-CN/2.3.2/functions-metrics/index.html  |   8 +-
 content/docs/zh-CN/2.3.2/functions-overview.html   |  22 +-
 .../docs/zh-CN/2.3.2/functions-overview/index.html |  22 +-
 content/docs/zh-CN/2.3.2/functions-quickstart.html |   6 +-
 .../zh-CN/2.3.2/functions-quickstart/index.html    |   6 +-
 content/docs/zh-CN/2.3.2/functions-state.html      |   8 +-
 .../docs/zh-CN/2.3.2/functions-state/index.html    |   8 +-
 content/docs/zh-CN/2.3.2/functions-worker.html     |   2 +-
 .../docs/zh-CN/2.3.2/functions-worker/index.html   |   2 +-
 content/docs/zh-CN/2.3.2/io-overview.html          |   2 +-
 content/docs/zh-CN/2.3.2/io-overview/index.html    |   2 +-
 content/docs/zh-CN/2.4.0/deploy-bare-metal.html    |   4 +-
 .../docs/zh-CN/2.4.0/deploy-bare-metal/index.html  |   4 +-
 content/docs/zh-CN/2.4.0/functions-api.html        |  14 +-
 content/docs/zh-CN/2.4.0/functions-api/index.html  |  14 +-
 content/docs/zh-CN/2.4.0/functions-debugging.html  |  10 +-
 .../zh-CN/2.4.0/functions-debugging/index.html     |  10 +-
 content/docs/zh-CN/2.4.0/functions-deploying.html  |  10 +-
 .../zh-CN/2.4.0/functions-deploying/index.html     |  10 +-
 content/docs/zh-CN/2.4.0/functions-guarantees.html |   2 +-
 .../zh-CN/2.4.0/functions-guarantees/index.html    |   2 +-
 content/docs/zh-CN/2.4.0/functions-metrics.html    |   8 +-
 .../docs/zh-CN/2.4.0/functions-metrics/index.html  |   8 +-
 content/docs/zh-CN/2.4.0/functions-overview.html   |  24 +-
 .../docs/zh-CN/2.4.0/functions-overview/index.html |  24 +-
 content/docs/zh-CN/2.4.0/functions-quickstart.html |   2 +-
 .../zh-CN/2.4.0/functions-quickstart/index.html    |   2 +-
 content/docs/zh-CN/2.4.0/functions-runtime.html    |   2 +-
 .../docs/zh-CN/2.4.0/functions-runtime/index.html  |   2 +-
 content/docs/zh-CN/2.4.0/functions-state.html      |   8 +-
 .../docs/zh-CN/2.4.0/functions-state/index.html    |   8 +-
 content/docs/zh-CN/2.4.0/functions-worker.html     |   2 +-
 .../docs/zh-CN/2.4.0/functions-worker/index.html   |   2 +-
 content/docs/zh-CN/2.4.0/io-overview.html          |   2 +-
 content/docs/zh-CN/2.4.0/io-overview/index.html    |   2 +-
 content/docs/zh-CN/adaptors-kafka.html             |   2 +-
 content/docs/zh-CN/adaptors-kafka/index.html       |   2 +-
 content/docs/zh-CN/adaptors-spark.html             |   2 +-
 content/docs/zh-CN/adaptors-spark/index.html       |   2 +-
 content/docs/zh-CN/adaptors-storm.html             |   2 +-
 content/docs/zh-CN/adaptors-storm/index.html       |   2 +-
 content/docs/zh-CN/admin-api-brokers.html          |   2 +-
 content/docs/zh-CN/admin-api-brokers/index.html    |   2 +-
 content/docs/zh-CN/admin-api-clusters.html         |   2 +-
 content/docs/zh-CN/admin-api-clusters/index.html   |   2 +-
 content/docs/zh-CN/admin-api-namespaces.html       |   2 +-
 content/docs/zh-CN/admin-api-namespaces/index.html |   2 +-
 .../zh-CN/admin-api-non-persistent-topics.html     |   2 +-
 .../admin-api-non-persistent-topics/index.html     |   2 +-
 content/docs/zh-CN/admin-api-overview.html         |   2 +-
 content/docs/zh-CN/admin-api-overview/index.html   |   2 +-
 .../docs/zh-CN/admin-api-partitioned-topics.html   |   2 +-
 .../zh-CN/admin-api-partitioned-topics/index.html  |   2 +-
 content/docs/zh-CN/admin-api-permissions.html      |   2 +-
 .../docs/zh-CN/admin-api-permissions/index.html    |   2 +-
 .../docs/zh-CN/admin-api-persistent-topics.html    |   2 +-
 .../zh-CN/admin-api-persistent-topics/index.html   |   2 +-
 content/docs/zh-CN/admin-api-schemas.html          |   2 +-
 content/docs/zh-CN/admin-api-schemas/index.html    |   2 +-
 content/docs/zh-CN/admin-api-tenants.html          |   2 +-
 content/docs/zh-CN/admin-api-tenants/index.html    |   2 +-
 content/docs/zh-CN/administration-dashboard.html   |   2 +-
 .../docs/zh-CN/administration-dashboard/index.html |   2 +-
 content/docs/zh-CN/administration-geo.html         |   2 +-
 content/docs/zh-CN/administration-geo/index.html   |   2 +-
 .../docs/zh-CN/administration-load-balance.html    |   2 +-
 .../zh-CN/administration-load-balance/index.html   |   2 +-
 content/docs/zh-CN/administration-proxy.html       |   2 +-
 content/docs/zh-CN/administration-proxy/index.html |   2 +-
 content/docs/zh-CN/administration-stats.html       |   2 +-
 content/docs/zh-CN/administration-stats/index.html |   2 +-
 content/docs/zh-CN/administration-upgrade.html     |   2 +-
 .../docs/zh-CN/administration-upgrade/index.html   |   2 +-
 content/docs/zh-CN/administration-zk-bk.html       |   2 +-
 content/docs/zh-CN/administration-zk-bk/index.html |   2 +-
 content/docs/zh-CN/client-libraries-cpp.html       |   2 +-
 content/docs/zh-CN/client-libraries-cpp/index.html |   2 +-
 content/docs/zh-CN/client-libraries-go.html        |   2 +-
 content/docs/zh-CN/client-libraries-go/index.html  |   2 +-
 content/docs/zh-CN/client-libraries-java.html      |   2 +-
 .../docs/zh-CN/client-libraries-java/index.html    |   2 +-
 content/docs/zh-CN/client-libraries-python.html    |   2 +-
 .../docs/zh-CN/client-libraries-python/index.html  |   2 +-
 content/docs/zh-CN/client-libraries-websocket.html |   2 +-
 .../zh-CN/client-libraries-websocket/index.html    |   2 +-
 content/docs/zh-CN/client-libraries.html           |   2 +-
 content/docs/zh-CN/client-libraries/index.html     |   2 +-
 .../docs/zh-CN/concepts-architecture-overview.html |   2 +-
 .../concepts-architecture-overview/index.html      |   2 +-
 content/docs/zh-CN/concepts-authentication.html    |   2 +-
 .../docs/zh-CN/concepts-authentication/index.html  |   2 +-
 content/docs/zh-CN/concepts-clients.html           |   2 +-
 content/docs/zh-CN/concepts-clients/index.html     |   2 +-
 content/docs/zh-CN/concepts-messaging.html         |   2 +-
 content/docs/zh-CN/concepts-messaging/index.html   |   2 +-
 content/docs/zh-CN/concepts-multi-tenancy.html     |   2 +-
 .../docs/zh-CN/concepts-multi-tenancy/index.html   |   2 +-
 content/docs/zh-CN/concepts-overview.html          |   2 +-
 content/docs/zh-CN/concepts-overview/index.html    |   2 +-
 content/docs/zh-CN/concepts-replication.html       |   2 +-
 content/docs/zh-CN/concepts-replication/index.html |   2 +-
 content/docs/zh-CN/concepts-schema-registry.html   |   2 +-
 .../docs/zh-CN/concepts-schema-registry/index.html |   2 +-
 content/docs/zh-CN/concepts-tiered-storage.html    |   2 +-
 .../docs/zh-CN/concepts-tiered-storage/index.html  |   2 +-
 content/docs/zh-CN/concepts-topic-compaction.html  |   2 +-
 .../zh-CN/concepts-topic-compaction/index.html     |   2 +-
 .../docs/zh-CN/cookbooks-bookkeepermetadata.html   |   2 +-
 .../zh-CN/cookbooks-bookkeepermetadata/index.html  |   2 +-
 content/docs/zh-CN/cookbooks-compaction.html       |   2 +-
 content/docs/zh-CN/cookbooks-compaction/index.html |   2 +-
 content/docs/zh-CN/cookbooks-deduplication.html    |   2 +-
 .../docs/zh-CN/cookbooks-deduplication/index.html  |   2 +-
 content/docs/zh-CN/cookbooks-encryption.html       |   2 +-
 content/docs/zh-CN/cookbooks-encryption/index.html |   2 +-
 content/docs/zh-CN/cookbooks-message-queue.html    |   2 +-
 .../docs/zh-CN/cookbooks-message-queue/index.html  |   2 +-
 content/docs/zh-CN/cookbooks-non-persistent.html   |   2 +-
 .../docs/zh-CN/cookbooks-non-persistent/index.html |   2 +-
 content/docs/zh-CN/cookbooks-partitioned.html      |   2 +-
 .../docs/zh-CN/cookbooks-partitioned/index.html    |   2 +-
 content/docs/zh-CN/cookbooks-retention-expiry.html |   2 +-
 .../zh-CN/cookbooks-retention-expiry/index.html    |   2 +-
 content/docs/zh-CN/cookbooks-tiered-storage.html   |   2 +-
 .../docs/zh-CN/cookbooks-tiered-storage/index.html |   2 +-
 content/docs/zh-CN/deploy-aws.html                 |   2 +-
 content/docs/zh-CN/deploy-aws/index.html           |   2 +-
 .../zh-CN/deploy-bare-metal-multi-cluster.html     |   2 +-
 .../deploy-bare-metal-multi-cluster/index.html     |   2 +-
 content/docs/zh-CN/deploy-bare-metal.html          |   6 +-
 content/docs/zh-CN/deploy-bare-metal/index.html    |   6 +-
 content/docs/zh-CN/deploy-dcos.html                |   2 +-
 content/docs/zh-CN/deploy-dcos/index.html          |   2 +-
 content/docs/zh-CN/deploy-kubernetes.html          |   2 +-
 content/docs/zh-CN/deploy-kubernetes/index.html    |   2 +-
 content/docs/zh-CN/deploy-monitoring.html          |   2 +-
 content/docs/zh-CN/deploy-monitoring/index.html    |   2 +-
 content/docs/zh-CN/develop-binary-protocol.html    |   2 +-
 .../docs/zh-CN/develop-binary-protocol/index.html  |   2 +-
 content/docs/zh-CN/develop-cpp.html                |   2 +-
 content/docs/zh-CN/develop-cpp/index.html          |   2 +-
 content/docs/zh-CN/develop-load-manager.html       |   2 +-
 content/docs/zh-CN/develop-load-manager/index.html |   2 +-
 content/docs/zh-CN/develop-schema.html             |   2 +-
 content/docs/zh-CN/develop-schema/index.html       |   2 +-
 content/docs/zh-CN/develop-tools.html              |   2 +-
 content/docs/zh-CN/develop-tools/index.html        |   2 +-
 content/docs/zh-CN/functions-api.html              |  38 +-
 content/docs/zh-CN/functions-api/index.html        |  38 +-
 content/docs/zh-CN/functions-cli.html              |   8 +-
 content/docs/zh-CN/functions-cli/index.html        |   8 +-
 content/docs/zh-CN/functions-debug.html            |   8 +-
 content/docs/zh-CN/functions-debug/index.html      |   8 +-
 content/docs/zh-CN/functions-debugging.html        |  12 +-
 content/docs/zh-CN/functions-debugging/index.html  |  12 +-
 content/docs/zh-CN/functions-deploy.html           |  18 +-
 content/docs/zh-CN/functions-deploy/index.html     |  18 +-
 content/docs/zh-CN/functions-deploying.html        |  12 +-
 content/docs/zh-CN/functions-deploying/index.html  |  12 +-
 content/docs/zh-CN/functions-develop.html          |  32 +-
 content/docs/zh-CN/functions-develop/index.html    |  32 +-
 content/docs/zh-CN/functions-guarantees.html       |   4 +-
 content/docs/zh-CN/functions-guarantees/index.html |   4 +-
 content/docs/zh-CN/functions-metrics.html          |  10 +-
 content/docs/zh-CN/functions-metrics/index.html    |  10 +-
 content/docs/zh-CN/functions-overview.html         | 341 +-------
 content/docs/zh-CN/functions-overview/index.html   | 341 +-------
 content/docs/zh-CN/functions-quickstart.html       |   4 +-
 content/docs/zh-CN/functions-quickstart/index.html |   4 +-
 content/docs/zh-CN/functions-runtime.html          |   9 +-
 content/docs/zh-CN/functions-runtime/index.html    |   9 +-
 content/docs/zh-CN/functions-state.html            |  10 +-
 content/docs/zh-CN/functions-state/index.html      |  10 +-
 content/docs/zh-CN/functions-worker.html           |  18 +-
 content/docs/zh-CN/functions-worker/index.html     |  18 +-
 content/docs/zh-CN/io-cdc.html                     |   2 +-
 content/docs/zh-CN/io-cdc/index.html               |   2 +-
 content/docs/zh-CN/io-connectors.html              |   2 +-
 content/docs/zh-CN/io-connectors/index.html        |   2 +-
 content/docs/zh-CN/io-debug.html                   |   2 +-
 content/docs/zh-CN/io-debug/index.html             |   2 +-
 content/docs/zh-CN/io-develop.html                 |   2 +-
 content/docs/zh-CN/io-develop/index.html           |   2 +-
 content/docs/zh-CN/io-managing.html                |   2 +-
 content/docs/zh-CN/io-managing/index.html          |   2 +-
 content/docs/zh-CN/io-overview.html                |   2 +-
 content/docs/zh-CN/io-overview/index.html          |   2 +-
 content/docs/zh-CN/io-quickstart.html              |   2 +-
 content/docs/zh-CN/io-quickstart/index.html        |   2 +-
 content/docs/zh-CN/io-use.html                     |   2 +-
 content/docs/zh-CN/io-use/index.html               |   2 +-
 content/docs/zh-CN/next/adaptors-kafka.html        |   2 +-
 content/docs/zh-CN/next/adaptors-kafka/index.html  |   2 +-
 content/docs/zh-CN/next/adaptors-spark.html        |   2 +-
 content/docs/zh-CN/next/adaptors-spark/index.html  |   2 +-
 content/docs/zh-CN/next/adaptors-storm.html        |   2 +-
 content/docs/zh-CN/next/adaptors-storm/index.html  |   2 +-
 content/docs/zh-CN/next/admin-api-brokers.html     |   2 +-
 .../docs/zh-CN/next/admin-api-brokers/index.html   |   2 +-
 content/docs/zh-CN/next/admin-api-clusters.html    |   2 +-
 .../docs/zh-CN/next/admin-api-clusters/index.html  |   2 +-
 content/docs/zh-CN/next/admin-api-namespaces.html  |   2 +-
 .../zh-CN/next/admin-api-namespaces/index.html     |   2 +-
 .../next/admin-api-non-persistent-topics.html      |   2 +-
 .../admin-api-non-persistent-topics/index.html     |   2 +-
 content/docs/zh-CN/next/admin-api-overview.html    |   2 +-
 .../docs/zh-CN/next/admin-api-overview/index.html  |   2 +-
 .../zh-CN/next/admin-api-partitioned-topics.html   |   2 +-
 .../next/admin-api-partitioned-topics/index.html   |   2 +-
 content/docs/zh-CN/next/admin-api-permissions.html |   2 +-
 .../zh-CN/next/admin-api-permissions/index.html    |   2 +-
 .../zh-CN/next/admin-api-persistent-topics.html    |   2 +-
 .../next/admin-api-persistent-topics/index.html    |   2 +-
 content/docs/zh-CN/next/admin-api-tenants.html     |   2 +-
 .../docs/zh-CN/next/admin-api-tenants/index.html   |   2 +-
 .../docs/zh-CN/next/administration-dashboard.html  |   2 +-
 .../zh-CN/next/administration-dashboard/index.html |   2 +-
 content/docs/zh-CN/next/administration-geo.html    |   2 +-
 .../docs/zh-CN/next/administration-geo/index.html  |   2 +-
 .../zh-CN/next/administration-load-balance.html    |   2 +-
 .../next/administration-load-balance/index.html    |   2 +-
 content/docs/zh-CN/next/administration-proxy.html  |   2 +-
 .../zh-CN/next/administration-proxy/index.html     |   2 +-
 content/docs/zh-CN/next/administration-stats.html  |   2 +-
 .../zh-CN/next/administration-stats/index.html     |   2 +-
 .../docs/zh-CN/next/administration-upgrade.html    |   2 +-
 .../zh-CN/next/administration-upgrade/index.html   |   2 +-
 content/docs/zh-CN/next/administration-zk-bk.html  |   2 +-
 .../zh-CN/next/administration-zk-bk/index.html     |   2 +-
 content/docs/zh-CN/next/client-libraries-cpp.html  |   2 +-
 .../zh-CN/next/client-libraries-cpp/index.html     |   2 +-
 content/docs/zh-CN/next/client-libraries-go.html   |   2 +-
 .../docs/zh-CN/next/client-libraries-go/index.html |   2 +-
 content/docs/zh-CN/next/client-libraries-java.html |   2 +-
 .../zh-CN/next/client-libraries-java/index.html    |   2 +-
 .../docs/zh-CN/next/client-libraries-python.html   |   2 +-
 .../zh-CN/next/client-libraries-python/index.html  |   2 +-
 .../zh-CN/next/client-libraries-websocket.html     |   2 +-
 .../next/client-libraries-websocket/index.html     |   2 +-
 content/docs/zh-CN/next/client-libraries.html      |   2 +-
 .../docs/zh-CN/next/client-libraries/index.html    |   2 +-
 .../zh-CN/next/concepts-architecture-overview.html |   2 +-
 .../next/concepts-architecture-overview/index.html |   2 +-
 .../docs/zh-CN/next/concepts-authentication.html   |   2 +-
 .../zh-CN/next/concepts-authentication/index.html  |   2 +-
 content/docs/zh-CN/next/concepts-clients.html      |   2 +-
 .../docs/zh-CN/next/concepts-clients/index.html    |   2 +-
 content/docs/zh-CN/next/concepts-messaging.html    |   2 +-
 .../docs/zh-CN/next/concepts-messaging/index.html  |   2 +-
 .../docs/zh-CN/next/concepts-multi-tenancy.html    |   2 +-
 .../zh-CN/next/concepts-multi-tenancy/index.html   |   2 +-
 content/docs/zh-CN/next/concepts-overview.html     |   2 +-
 .../docs/zh-CN/next/concepts-overview/index.html   |   2 +-
 content/docs/zh-CN/next/concepts-replication.html  |   2 +-
 .../zh-CN/next/concepts-replication/index.html     |   2 +-
 .../docs/zh-CN/next/concepts-tiered-storage.html   |   2 +-
 .../zh-CN/next/concepts-tiered-storage/index.html  |   2 +-
 .../docs/zh-CN/next/concepts-topic-compaction.html |   2 +-
 .../next/concepts-topic-compaction/index.html      |   2 +-
 .../zh-CN/next/cookbooks-bookkeepermetadata.html   |   2 +-
 .../next/cookbooks-bookkeepermetadata/index.html   |   2 +-
 content/docs/zh-CN/next/cookbooks-compaction.html  |   2 +-
 .../zh-CN/next/cookbooks-compaction/index.html     |   2 +-
 .../docs/zh-CN/next/cookbooks-deduplication.html   |   2 +-
 .../zh-CN/next/cookbooks-deduplication/index.html  |   2 +-
 content/docs/zh-CN/next/cookbooks-encryption.html  |   2 +-
 .../zh-CN/next/cookbooks-encryption/index.html     |   2 +-
 .../docs/zh-CN/next/cookbooks-message-queue.html   |   2 +-
 .../zh-CN/next/cookbooks-message-queue/index.html  |   2 +-
 .../docs/zh-CN/next/cookbooks-non-persistent.html  |   2 +-
 .../zh-CN/next/cookbooks-non-persistent/index.html |   2 +-
 content/docs/zh-CN/next/cookbooks-partitioned.html |   2 +-
 .../zh-CN/next/cookbooks-partitioned/index.html    |   2 +-
 .../zh-CN/next/cookbooks-retention-expiry.html     |   2 +-
 .../next/cookbooks-retention-expiry/index.html     |   2 +-
 .../docs/zh-CN/next/cookbooks-tiered-storage.html  |   2 +-
 .../zh-CN/next/cookbooks-tiered-storage/index.html |   2 +-
 content/docs/zh-CN/next/deploy-aws.html            |   2 +-
 content/docs/zh-CN/next/deploy-aws/index.html      |   2 +-
 .../next/deploy-bare-metal-multi-cluster.html      |   2 +-
 .../deploy-bare-metal-multi-cluster/index.html     |   2 +-
 content/docs/zh-CN/next/deploy-bare-metal.html     |   4 +-
 .../docs/zh-CN/next/deploy-bare-metal/index.html   |   4 +-
 content/docs/zh-CN/next/deploy-dcos.html           |   2 +-
 content/docs/zh-CN/next/deploy-dcos/index.html     |   2 +-
 content/docs/zh-CN/next/deploy-kubernetes.html     |   2 +-
 .../docs/zh-CN/next/deploy-kubernetes/index.html   |   2 +-
 content/docs/zh-CN/next/deploy-monitoring.html     |   2 +-
 .../docs/zh-CN/next/deploy-monitoring/index.html   |   2 +-
 .../docs/zh-CN/next/develop-binary-protocol.html   |   2 +-
 .../zh-CN/next/develop-binary-protocol/index.html  |   2 +-
 content/docs/zh-CN/next/develop-cpp.html           |   2 +-
 content/docs/zh-CN/next/develop-cpp/index.html     |   2 +-
 content/docs/zh-CN/next/develop-load-manager.html  |   2 +-
 .../zh-CN/next/develop-load-manager/index.html     |   2 +-
 content/docs/zh-CN/next/develop-tools.html         |   2 +-
 content/docs/zh-CN/next/develop-tools/index.html   |   2 +-
 content/docs/zh-CN/next/functions-cli.html         |   8 +-
 content/docs/zh-CN/next/functions-cli/index.html   |   8 +-
 content/docs/zh-CN/next/functions-debug.html       |   8 +-
 content/docs/zh-CN/next/functions-debug/index.html |   8 +-
 content/docs/zh-CN/next/functions-deploy.html      |  18 +-
 .../docs/zh-CN/next/functions-deploy/index.html    |  18 +-
 content/docs/zh-CN/next/functions-develop.html     |  32 +-
 .../docs/zh-CN/next/functions-develop/index.html   |  32 +-
 content/docs/zh-CN/next/functions-overview.html    | 335 +-------
 .../docs/zh-CN/next/functions-overview/index.html  | 335 +-------
 content/docs/zh-CN/next/functions-runtime.html     |   9 +-
 .../docs/zh-CN/next/functions-runtime/index.html   |   9 +-
 content/docs/zh-CN/next/functions-worker.html      |  18 +-
 .../docs/zh-CN/next/functions-worker/index.html    |  18 +-
 content/docs/zh-CN/next/io-cdc.html                |   2 +-
 content/docs/zh-CN/next/io-cdc/index.html          |   2 +-
 content/docs/zh-CN/next/io-connectors.html         |   2 +-
 content/docs/zh-CN/next/io-connectors/index.html   |   2 +-
 content/docs/zh-CN/next/io-debug.html              |   2 +-
 content/docs/zh-CN/next/io-debug/index.html        |   2 +-
 content/docs/zh-CN/next/io-develop.html            |   2 +-
 content/docs/zh-CN/next/io-develop/index.html      |   2 +-
 content/docs/zh-CN/next/io-managing.html           |   2 +-
 content/docs/zh-CN/next/io-managing/index.html     |   2 +-
 content/docs/zh-CN/next/io-overview.html           |   4 +-
 content/docs/zh-CN/next/io-overview/index.html     |   4 +-
 content/docs/zh-CN/next/io-quickstart.html         |   2 +-
 content/docs/zh-CN/next/io-quickstart/index.html   |   2 +-
 content/docs/zh-CN/next/io-use.html                |   2 +-
 content/docs/zh-CN/next/io-use/index.html          |   2 +-
 content/docs/zh-CN/next/pulsar-2.0.html            |   2 +-
 content/docs/zh-CN/next/pulsar-2.0/index.html      |   2 +-
 content/docs/zh-CN/next/pulsar-admin.html          |   2 +-
 content/docs/zh-CN/next/pulsar-admin/index.html    |   2 +-
 content/docs/zh-CN/next/reference-cli-tools.html   |   2 +-
 .../docs/zh-CN/next/reference-cli-tools/index.html |   2 +-
 .../docs/zh-CN/next/reference-configuration.html   |   2 +-
 .../zh-CN/next/reference-configuration/index.html  |   2 +-
 .../docs/zh-CN/next/reference-connector-admin.html |   2 +-
 .../next/reference-connector-admin/index.html      |   2 +-
 content/docs/zh-CN/next/reference-metrics.html     |   2 +-
 .../docs/zh-CN/next/reference-metrics/index.html   |   2 +-
 content/docs/zh-CN/next/reference-terminology.html |   2 +-
 .../zh-CN/next/reference-terminology/index.html    |   2 +-
 .../zh-CN/next/schema-evolution-compatibility.html |   2 +-
 .../next/schema-evolution-compatibility/index.html |   2 +-
 content/docs/zh-CN/next/schema-get-started.html    |   2 +-
 .../docs/zh-CN/next/schema-get-started/index.html  |   2 +-
 content/docs/zh-CN/next/schema-manage.html         |   2 +-
 content/docs/zh-CN/next/schema-manage/index.html   |   2 +-
 content/docs/zh-CN/next/schema-understand.html     |   2 +-
 .../docs/zh-CN/next/schema-understand/index.html   |   2 +-
 content/docs/zh-CN/next/security-athenz.html       |   2 +-
 content/docs/zh-CN/next/security-athenz/index.html |   2 +-
 .../docs/zh-CN/next/security-authorization.html    |   2 +-
 .../zh-CN/next/security-authorization/index.html   |   2 +-
 content/docs/zh-CN/next/security-encryption.html   |   2 +-
 .../docs/zh-CN/next/security-encryption/index.html |   2 +-
 content/docs/zh-CN/next/security-extending.html    |   2 +-
 .../docs/zh-CN/next/security-extending/index.html  |   2 +-
 content/docs/zh-CN/next/security-kerberos.html     |   2 +-
 .../docs/zh-CN/next/security-kerberos/index.html   |   2 +-
 content/docs/zh-CN/next/security-overview.html     |   2 +-
 .../docs/zh-CN/next/security-overview/index.html   |   2 +-
 .../zh-CN/next/security-tls-authentication.html    |   2 +-
 .../next/security-tls-authentication/index.html    |   2 +-
 .../docs/zh-CN/next/security-tls-transport.html    |   2 +-
 .../zh-CN/next/security-tls-transport/index.html   |   2 +-
 content/docs/zh-CN/next/security-token-admin.html  | 109 ++-
 .../zh-CN/next/security-token-admin/index.html     | 109 ++-
 content/docs/zh-CN/next/security-token-client.html |   2 +-
 .../zh-CN/next/security-token-client/index.html    |   2 +-
 .../zh-CN/next/sql-deployment-configurations.html  |   2 +-
 .../next/sql-deployment-configurations/index.html  |   2 +-
 content/docs/zh-CN/next/sql-getting-started.html   |   2 +-
 .../docs/zh-CN/next/sql-getting-started/index.html |   2 +-
 content/docs/zh-CN/next/sql-overview.html          |   2 +-
 content/docs/zh-CN/next/sql-overview/index.html    |   2 +-
 content/docs/zh-CN/next/standalone-docker.html     |   2 +-
 .../docs/zh-CN/next/standalone-docker/index.html   |   2 +-
 content/docs/zh-CN/next/standalone.html            |   4 +-
 content/docs/zh-CN/next/standalone/index.html      |   4 +-
 content/docs/zh-CN/pulsar-2.0.html                 |   2 +-
 content/docs/zh-CN/pulsar-2.0/index.html           |   2 +-
 content/docs/zh-CN/pulsar-admin.html               |   2 +-
 content/docs/zh-CN/pulsar-admin/index.html         |   2 +-
 content/docs/zh-CN/reference-cli-tools.html        |   2 +-
 content/docs/zh-CN/reference-cli-tools/index.html  |   2 +-
 content/docs/zh-CN/reference-configuration.html    |   2 +-
 .../docs/zh-CN/reference-configuration/index.html  |   2 +-
 content/docs/zh-CN/reference-connector-admin.html  |   2 +-
 .../zh-CN/reference-connector-admin/index.html     |   2 +-
 content/docs/zh-CN/reference-metrics.html          |   2 +-
 content/docs/zh-CN/reference-metrics/index.html    |   2 +-
 content/docs/zh-CN/reference-terminology.html      |   2 +-
 .../docs/zh-CN/reference-terminology/index.html    |   2 +-
 .../docs/zh-CN/schema-evolution-compatibility.html |   2 +-
 .../schema-evolution-compatibility/index.html      |   2 +-
 content/docs/zh-CN/schema-get-started.html         |   2 +-
 content/docs/zh-CN/schema-get-started/index.html   |   2 +-
 content/docs/zh-CN/schema-manage.html              |   2 +-
 content/docs/zh-CN/schema-manage/index.html        |   2 +-
 content/docs/zh-CN/schema-understand.html          |   2 +-
 content/docs/zh-CN/schema-understand/index.html    |   2 +-
 content/docs/zh-CN/security-athenz.html            |   2 +-
 content/docs/zh-CN/security-athenz/index.html      |   2 +-
 content/docs/zh-CN/security-authorization.html     |   2 +-
 .../docs/zh-CN/security-authorization/index.html   |   2 +-
 content/docs/zh-CN/security-encryption.html        |   2 +-
 content/docs/zh-CN/security-encryption/index.html  |   2 +-
 content/docs/zh-CN/security-extending.html         |   2 +-
 content/docs/zh-CN/security-extending/index.html   |   2 +-
 content/docs/zh-CN/security-kerberos.html          |   2 +-
 content/docs/zh-CN/security-kerberos/index.html    |   2 +-
 content/docs/zh-CN/security-overview.html          |   2 +-
 content/docs/zh-CN/security-overview/index.html    |   2 +-
 .../docs/zh-CN/security-tls-authentication.html    |   2 +-
 .../zh-CN/security-tls-authentication/index.html   |   2 +-
 content/docs/zh-CN/security-tls-transport.html     |   2 +-
 .../docs/zh-CN/security-tls-transport/index.html   |   2 +-
 content/docs/zh-CN/security-token-admin.html       |   2 +-
 content/docs/zh-CN/security-token-admin/index.html |   2 +-
 content/docs/zh-CN/security-token-client.html      |   2 +-
 .../docs/zh-CN/security-token-client/index.html    |   2 +-
 .../docs/zh-CN/sql-deployment-configurations.html  |   2 +-
 .../zh-CN/sql-deployment-configurations/index.html |   2 +-
 content/docs/zh-CN/sql-getting-started.html        |   2 +-
 content/docs/zh-CN/sql-getting-started/index.html  |   2 +-
 content/docs/zh-CN/sql-overview.html               |   2 +-
 content/docs/zh-CN/sql-overview/index.html         |   2 +-
 content/docs/zh-CN/standalone-docker.html          |   2 +-
 content/docs/zh-CN/standalone-docker/index.html    |   2 +-
 content/docs/zh-CN/standalone.html                 |   2 +-
 content/docs/zh-CN/standalone/index.html           |   2 +-
 content/sitemap.xml                                |   2 +-
 content/swagger/2.5.0-SNAPSHOT/swagger.json        |  38 +-
 .../swagger/2.5.0-SNAPSHOT/swaggerfunctions.json   |  46 +-
 .../{2.5.0-SNAPSHOT => master}/swagger.json        |  38 +-
 .../swaggerfunctions.json                          |  46 +-
 content/swagger/master/swaggersink.json            | 948 +++++++++++++++++++++
 content/swagger/master/swaggersource.json          | 899 +++++++++++++++++++
 2199 files changed, 8500 insertions(+), 10841 deletions(-)

diff --git a/content/docs/en/2.1.0-incubating/deploy-bare-metal.html b/content/docs/en/2.1.0-incubating/deploy-bare-metal.html
index e85a82d..62e9f16 100644
--- a/content/docs/en/2.1.0-incubating/deploy-bare-metal.html
+++ b/content/docs/en/2.1.0-incubating/deploy-bare-metal.html
@@ -248,7 +248,7 @@ $ <span class="hljs-built_in">echo</span> 1 &gt; data/zookeeper/myid
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.1.0-incubating/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.1.0-incubating/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -328,7 +328,7 @@ verify all the bookies in the cluster are up running.</p>
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.1.0-incubating/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --triggerValue <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.1.0-incubating/deploy-bare-metal/index.html b/content/docs/en/2.1.0-incubating/deploy-bare-metal/index.html
index e85a82d..62e9f16 100644
--- a/content/docs/en/2.1.0-incubating/deploy-bare-metal/index.html
+++ b/content/docs/en/2.1.0-incubating/deploy-bare-metal/index.html
@@ -248,7 +248,7 @@ $ <span class="hljs-built_in">echo</span> 1 &gt; data/zookeeper/myid
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.1.0-incubating/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.1.0-incubating/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -328,7 +328,7 @@ verify all the bookies in the cluster are up running.</p>
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.1.0-incubating/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --triggerValue <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.1.0-incubating/functions-api.html b/content/docs/en/2.1.0-incubating/functions-api.html
index da9e5b2..7919a3b 100644
--- a/content/docs/en/2.1.0-incubating/functions-api.html
+++ b/content/docs/en/2.1.0-incubating/functions-api.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.1.0-incubating/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.1.0-incubating/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.1.0-incubating/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.1.0-incubating/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.1.0-incubating/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --className sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --logTopic sanitizer-logs    <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.1.0-incubating/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -163,7 +163,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.1.0-incubating/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.1.0-incubating/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.1.0-incubating/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -498,7 +498,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.1.0-incubating/functions-deploying">deployment mode</a> you're using, you'll need to install the following Python libraries on any machine that's running Pulsar Functions written in Python:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, you'll need to install the following Python libraries on any machine that's running Pulsar Functions written in Python:</p>
 <ul>
 <li>pulsar-client</li>
 <li>protobuf</li>
@@ -506,7 +506,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>grpcio</li>
 <li>grpcio-tools</li>
 </ul>
-<p>That could be your local machine for <a href="/docs/en/2.1.0-incubating/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.1.0-incubating/reference-terminology#broker">broker</a> for <a href="/docs/en/2.1.0-incubating/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.1.0-incubating/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client protobuf futures grpcio grpcio-tools
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -562,7 +562,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.1.0-incubating/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.1.0-incubating/functions-deploying#local-run-mode">running</a> functions. H [...]
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -666,7 +666,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class=" [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/functions-api/index.html b/content/docs/en/2.1.0-incubating/functions-api/index.html
index da9e5b2..7919a3b 100644
--- a/content/docs/en/2.1.0-incubating/functions-api/index.html
+++ b/content/docs/en/2.1.0-incubating/functions-api/index.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.1.0-incubating/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.1.0-incubating/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.1.0-incubating/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.1.0-incubating/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.1.0-incubating/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --className sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --logTopic sanitizer-logs    <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.1.0-incubating/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -163,7 +163,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.1.0-incubating/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.1.0-incubating/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.1.0-incubating/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -498,7 +498,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.1.0-incubating/functions-deploying">deployment mode</a> you're using, you'll need to install the following Python libraries on any machine that's running Pulsar Functions written in Python:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, you'll need to install the following Python libraries on any machine that's running Pulsar Functions written in Python:</p>
 <ul>
 <li>pulsar-client</li>
 <li>protobuf</li>
@@ -506,7 +506,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>grpcio</li>
 <li>grpcio-tools</li>
 </ul>
-<p>That could be your local machine for <a href="/docs/en/2.1.0-incubating/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.1.0-incubating/reference-terminology#broker">broker</a> for <a href="/docs/en/2.1.0-incubating/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.1.0-incubating/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client protobuf futures grpcio grpcio-tools
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -562,7 +562,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.1.0-incubating/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.1.0-incubating/functions-deploying#local-run-mode">running</a> functions. H [...]
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -666,7 +666,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class=" [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/functions-deploying.html b/content/docs/en/2.1.0-incubating/functions-deploying.html
index c34676d..dda2ae4 100644
--- a/content/docs/en/2.1.0-incubating/functions-deploying.html
+++ b/content/docs/en/2.1.0-incubating/functions-deploying.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.1.0-incubating/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.1.0-incubating/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.1.0-incubating/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.1.0-incubating/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.1.0-incubating/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.1.0-incubating/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.1.0-incubating/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.1.0-incubating/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client l [...]
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.1.0-incubating/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface"> [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/functions-deploying/index.html b/content/docs/en/2.1.0-incubating/functions-deploying/index.html
index c34676d..dda2ae4 100644
--- a/content/docs/en/2.1.0-incubating/functions-deploying/index.html
+++ b/content/docs/en/2.1.0-incubating/functions-deploying/index.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.1.0-incubating/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.1.0-incubating/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.1.0-incubating/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.1.0-incubating/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.1.0-incubating/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.1.0-incubating/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.1.0-incubating/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.1.0-incubating/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client l [...]
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.1.0-incubating/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface"> [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/functions-guarantees.html b/content/docs/en/2.1.0-incubating/functions-guarantees.html
index f90fb31..4997edd 100644
--- a/content/docs/en/2.1.0-incubating/functions-guarantees.html
+++ b/content/docs/en/2.1.0-incubating/functions-guarantees.html
@@ -106,7 +106,7 @@
   --processingGuarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processin [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a fu [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/functions-guarantees/index.html b/content/docs/en/2.1.0-incubating/functions-guarantees/index.html
index f90fb31..4997edd 100644
--- a/content/docs/en/2.1.0-incubating/functions-guarantees/index.html
+++ b/content/docs/en/2.1.0-incubating/functions-guarantees/index.html
@@ -106,7 +106,7 @@
   --processingGuarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processin [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a fu [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/functions-metrics.html b/content/docs/en/2.1.0-incubating/functions-metrics.html
index 190d047..d2f6580 100644
--- a/content/docs/en/2.1.0-incubating/functions-metrics.html
+++ b/content/docs/en/2.1.0-incubating/functions-metrics.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.1.0-incubating/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.1.0-incubating/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.1.0-incubating/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.1.0-incubating/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></ [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><l [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/functions-metrics/index.html b/content/docs/en/2.1.0-incubating/functions-metrics/index.html
index 190d047..d2f6580 100644
--- a/content/docs/en/2.1.0-incubating/functions-metrics/index.html
+++ b/content/docs/en/2.1.0-incubating/functions-metrics/index.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.1.0-incubating/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.1.0-incubating/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.1.0-incubating/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.1.0-incubating/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></ [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><l [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/functions-overview.html b/content/docs/en/2.1.0-incubating/functions-overview.html
index a60e987..2ce55a2 100644
--- a/content/docs/en/2.1.0-incubating/functions-overview.html
+++ b/content/docs/en/2.1.0-incubating/functions-overview.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.1.0-incubating/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.1.0-incubating/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.1.0-incubating/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -221,7 +221,7 @@
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -249,7 +249,7 @@
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-python">Pythnon</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Pythnon</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -344,7 +344,7 @@
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.1.0-incubating/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -352,7 +352,7 @@
   --logTopic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.1.0-incubating/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -384,11 +384,11 @@
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.1.0-incubating/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but  [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.1.0-incubating/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.1.0-incubating/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client l [...]
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.1.0-incubating/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -422,10 +422,10 @@
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.1.0-incubating/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></ [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/functions-overview/index.html b/content/docs/en/2.1.0-incubating/functions-overview/index.html
index a60e987..2ce55a2 100644
--- a/content/docs/en/2.1.0-incubating/functions-overview/index.html
+++ b/content/docs/en/2.1.0-incubating/functions-overview/index.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.1.0-incubating/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.1.0-incubating/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.1.0-incubating/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -221,7 +221,7 @@
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -249,7 +249,7 @@
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-python">Pythnon</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Pythnon</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -344,7 +344,7 @@
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.1.0-incubating/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -352,7 +352,7 @@
   --logTopic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.1.0-incubating/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -384,11 +384,11 @@
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.1.0-incubating/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but  [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.1.0-incubating/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.1.0-incubating/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client l [...]
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.1.0-incubating/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -422,10 +422,10 @@
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.1.0-incubating/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></ [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/functions-quickstart.html b/content/docs/en/2.1.0-incubating/functions-quickstart.html
index bd70ecc..42bb7be 100644
--- a/content/docs/en/2.1.0-incubating/functions-quickstart.html
+++ b/content/docs/en/2.1.0-incubating/functions-quickstart.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -259,10 +259,10 @@ $ bin/pulsar standalone \
 </code></pre>
 <p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
 <ul>
-<li><a href="/docs/en/2.1.0-incubating/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.1.0-incubating/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run  [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/functions-quickstart/index.html b/content/docs/en/2.1.0-incubating/functions-quickstart/index.html
index bd70ecc..42bb7be 100644
--- a/content/docs/en/2.1.0-incubating/functions-quickstart/index.html
+++ b/content/docs/en/2.1.0-incubating/functions-quickstart/index.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.1.0-incubating/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -259,10 +259,10 @@ $ bin/pulsar standalone \
 </code></pre>
 <p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
 <ul>
-<li><a href="/docs/en/2.1.0-incubating/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.1.0-incubating/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run  [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/functions-state.html b/content/docs/en/2.1.0-incubating/functions-state.html
index b41575b..e33b301 100644
--- a/content/docs/en/2.1.0-incubating/functions-state.html
+++ b/content/docs/en/2.1.0-incubating/functions-state.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.1.0-incubating/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.1.0-incubating/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.1.0-incubating/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.1.0-incubating/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/functions-state/index.html b/content/docs/en/2.1.0-incubating/functions-state/index.html
index b41575b..e33b301 100644
--- a/content/docs/en/2.1.0-incubating/functions-state/index.html
+++ b/content/docs/en/2.1.0-incubating/functions-state/index.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.1.0-incubating/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.1.0-incubating/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.1.0-incubating/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.1.0-incubating/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/io-overview.html b/content/docs/en/2.1.0-incubating/io-overview.html
index f670826..7af9873 100644
--- a/content/docs/en/2.1.0-incubating/io-overview.html
+++ b/content/docs/en/2.1.0-incubating/io-overview.html
@@ -107,7 +107,7 @@
 <tr><td><a href="https://developer.twitter.com/en/docs">Twitter Firehose source</a></td><td><a href="https://github.com/apache/incubator-pulsar/blob/master/pulsar-io/twitter/src/main/java/org/apache/pulsar/io/twitter/TwitterFireHose.java">org.apache.pulsar.io.twitter.TwitterFireHose</a></td><td><a href="/docs/en/2.1.0-incubating/io-twitter#source">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connector [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.0-incubating/io-overview/index.html b/content/docs/en/2.1.0-incubating/io-overview/index.html
index f670826..7af9873 100644
--- a/content/docs/en/2.1.0-incubating/io-overview/index.html
+++ b/content/docs/en/2.1.0-incubating/io-overview/index.html
@@ -107,7 +107,7 @@
 <tr><td><a href="https://developer.twitter.com/en/docs">Twitter Firehose source</a></td><td><a href="https://github.com/apache/incubator-pulsar/blob/master/pulsar-io/twitter/src/main/java/org/apache/pulsar/io/twitter/TwitterFireHose.java">org.apache.pulsar.io.twitter.TwitterFireHose</a></td><td><a href="/docs/en/2.1.0-incubating/io-twitter#source">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.0-incubating/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.0-incubating/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connector [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/deploy-bare-metal.html b/content/docs/en/2.1.1-incubating/deploy-bare-metal.html
index 52a0e2a..a48377d 100644
--- a/content/docs/en/2.1.1-incubating/deploy-bare-metal.html
+++ b/content/docs/en/2.1.1-incubating/deploy-bare-metal.html
@@ -248,7 +248,7 @@ $ <span class="hljs-built_in">echo</span> 1 &gt; data/zookeeper/myid
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.1.1-incubating/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.1.1-incubating/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -328,7 +328,7 @@ verify all the bookies in the cluster are up running.</p>
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.1.1-incubating/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --triggerValue <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.1.1-incubating/deploy-bare-metal/index.html b/content/docs/en/2.1.1-incubating/deploy-bare-metal/index.html
index 52a0e2a..a48377d 100644
--- a/content/docs/en/2.1.1-incubating/deploy-bare-metal/index.html
+++ b/content/docs/en/2.1.1-incubating/deploy-bare-metal/index.html
@@ -248,7 +248,7 @@ $ <span class="hljs-built_in">echo</span> 1 &gt; data/zookeeper/myid
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.1.1-incubating/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.1.1-incubating/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -328,7 +328,7 @@ verify all the bookies in the cluster are up running.</p>
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.1.1-incubating/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --triggerValue <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.1.1-incubating/functions-api.html b/content/docs/en/2.1.1-incubating/functions-api.html
index be50f9f..4d5ec0c 100644
--- a/content/docs/en/2.1.1-incubating/functions-api.html
+++ b/content/docs/en/2.1.1-incubating/functions-api.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.1.1-incubating/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.1.1-incubating/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.1.1-incubating/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.1.1-incubating/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.1.1-incubating/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --className sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --logTopic sanitizer-logs    <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.1.1-incubating/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -163,7 +163,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.1.1-incubating/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.1.1-incubating/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.1.1-incubating/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -498,8 +498,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.1.1-incubating/functions-deploying">deployment mode</a> you're using, you'll need to install the following Python libraries on any machine that's running Pulsar Functions written in Python:</p>
-<p>That could be your local machine for <a href="/docs/en/2.1.1-incubating/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.1.1-incubating/reference-terminology#broker">broker</a> for <a href="/docs/en/2.1.1-incubating/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, you'll need to install the following Python libraries on any machine that's running Pulsar Functions written in Python:</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.1.1-incubating/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -555,7 +555,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.1.1-incubating/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.1.1-incubating/functions-deploying#local-run-mode">running</a> functions. H [...]
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -659,7 +659,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class=" [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/functions-api/index.html b/content/docs/en/2.1.1-incubating/functions-api/index.html
index be50f9f..4d5ec0c 100644
--- a/content/docs/en/2.1.1-incubating/functions-api/index.html
+++ b/content/docs/en/2.1.1-incubating/functions-api/index.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.1.1-incubating/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.1.1-incubating/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.1.1-incubating/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.1.1-incubating/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.1.1-incubating/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --className sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --logTopic sanitizer-logs    <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.1.1-incubating/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -163,7 +163,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.1.1-incubating/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.1.1-incubating/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.1.1-incubating/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -498,8 +498,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.1.1-incubating/functions-deploying">deployment mode</a> you're using, you'll need to install the following Python libraries on any machine that's running Pulsar Functions written in Python:</p>
-<p>That could be your local machine for <a href="/docs/en/2.1.1-incubating/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.1.1-incubating/reference-terminology#broker">broker</a> for <a href="/docs/en/2.1.1-incubating/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, you'll need to install the following Python libraries on any machine that's running Pulsar Functions written in Python:</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.1.1-incubating/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -555,7 +555,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.1.1-incubating/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.1.1-incubating/functions-deploying#local-run-mode">running</a> functions. H [...]
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -659,7 +659,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class=" [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/functions-deploying.html b/content/docs/en/2.1.1-incubating/functions-deploying.html
index ce82a25..02601a8 100644
--- a/content/docs/en/2.1.1-incubating/functions-deploying.html
+++ b/content/docs/en/2.1.1-incubating/functions-deploying.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.1.1-incubating/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.1.1-incubating/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.1.1-incubating/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.1.1-incubating/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.1.1-incubating/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.1.1-incubating/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.1.1-incubating/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.1.1-incubating/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client l [...]
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.1.1-incubating/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface"> [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/functions-deploying/index.html b/content/docs/en/2.1.1-incubating/functions-deploying/index.html
index ce82a25..02601a8 100644
--- a/content/docs/en/2.1.1-incubating/functions-deploying/index.html
+++ b/content/docs/en/2.1.1-incubating/functions-deploying/index.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.1.1-incubating/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.1.1-incubating/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.1.1-incubating/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.1.1-incubating/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.1.1-incubating/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.1.1-incubating/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.1.1-incubating/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.1.1-incubating/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client l [...]
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.1.1-incubating/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface"> [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/functions-guarantees.html b/content/docs/en/2.1.1-incubating/functions-guarantees.html
index 2dd6dd0..b51bab1 100644
--- a/content/docs/en/2.1.1-incubating/functions-guarantees.html
+++ b/content/docs/en/2.1.1-incubating/functions-guarantees.html
@@ -106,7 +106,7 @@
   --processingGuarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processin [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a fu [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/functions-guarantees/index.html b/content/docs/en/2.1.1-incubating/functions-guarantees/index.html
index 2dd6dd0..b51bab1 100644
--- a/content/docs/en/2.1.1-incubating/functions-guarantees/index.html
+++ b/content/docs/en/2.1.1-incubating/functions-guarantees/index.html
@@ -106,7 +106,7 @@
   --processingGuarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processin [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a fu [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/functions-metrics.html b/content/docs/en/2.1.1-incubating/functions-metrics.html
index 2fc721a..ac332e3 100644
--- a/content/docs/en/2.1.1-incubating/functions-metrics.html
+++ b/content/docs/en/2.1.1-incubating/functions-metrics.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.1.1-incubating/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.1.1-incubating/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.1.1-incubating/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.1.1-incubating/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></ [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><l [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/functions-metrics/index.html b/content/docs/en/2.1.1-incubating/functions-metrics/index.html
index 2fc721a..ac332e3 100644
--- a/content/docs/en/2.1.1-incubating/functions-metrics/index.html
+++ b/content/docs/en/2.1.1-incubating/functions-metrics/index.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.1.1-incubating/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.1.1-incubating/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.1.1-incubating/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.1.1-incubating/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></ [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><l [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/functions-overview.html b/content/docs/en/2.1.1-incubating/functions-overview.html
index ad59873..eef91a9 100644
--- a/content/docs/en/2.1.1-incubating/functions-overview.html
+++ b/content/docs/en/2.1.1-incubating/functions-overview.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.1.1-incubating/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.1.1-incubating/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.1.1-incubating/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -221,7 +221,7 @@
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -249,7 +249,7 @@
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-python">Pythnon</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Pythnon</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -344,7 +344,7 @@
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.1.1-incubating/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -352,7 +352,7 @@
   --logTopic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.1.1-incubating/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -384,11 +384,11 @@
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.1.1-incubating/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but  [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.1.1-incubating/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.1.1-incubating/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client l [...]
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.1.1-incubating/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -422,10 +422,10 @@
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.1.1-incubating/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></ [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/functions-overview/index.html b/content/docs/en/2.1.1-incubating/functions-overview/index.html
index ad59873..eef91a9 100644
--- a/content/docs/en/2.1.1-incubating/functions-overview/index.html
+++ b/content/docs/en/2.1.1-incubating/functions-overview/index.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.1.1-incubating/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.1.1-incubating/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.1.1-incubating/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -221,7 +221,7 @@
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -249,7 +249,7 @@
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-python">Pythnon</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Pythnon</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -344,7 +344,7 @@
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.1.1-incubating/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -352,7 +352,7 @@
   --logTopic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.1.1-incubating/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -384,11 +384,11 @@
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.1.1-incubating/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but  [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.1.1-incubating/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.1.1-incubating/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client l [...]
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.1.1-incubating/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -422,10 +422,10 @@
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.1.1-incubating/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></ [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li> [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/functions-quickstart.html b/content/docs/en/2.1.1-incubating/functions-quickstart.html
index 3c13e7e..5b0746a 100644
--- a/content/docs/en/2.1.1-incubating/functions-quickstart.html
+++ b/content/docs/en/2.1.1-incubating/functions-quickstart.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -259,10 +259,10 @@ $ bin/pulsar standalone \
 </code></pre>
 <p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
 <ul>
-<li><a href="/docs/en/2.1.1-incubating/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.1.1-incubating/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run  [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/functions-quickstart/index.html b/content/docs/en/2.1.1-incubating/functions-quickstart/index.html
index 3c13e7e..5b0746a 100644
--- a/content/docs/en/2.1.1-incubating/functions-quickstart/index.html
+++ b/content/docs/en/2.1.1-incubating/functions-quickstart/index.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.1.1-incubating/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -259,10 +259,10 @@ $ bin/pulsar standalone \
 </code></pre>
 <p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
 <ul>
-<li><a href="/docs/en/2.1.1-incubating/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.1.1-incubating/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run  [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/functions-state.html b/content/docs/en/2.1.1-incubating/functions-state.html
index 2cc9a5f..3ba4caa 100644
--- a/content/docs/en/2.1.1-incubating/functions-state.html
+++ b/content/docs/en/2.1.1-incubating/functions-state.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.1.1-incubating/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.1.1-incubating/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.1.1-incubating/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.1.1-incubating/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/functions-state/index.html b/content/docs/en/2.1.1-incubating/functions-state/index.html
index 2cc9a5f..3ba4caa 100644
--- a/content/docs/en/2.1.1-incubating/functions-state/index.html
+++ b/content/docs/en/2.1.1-incubating/functions-state/index.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.1.1-incubating/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.1.1-incubating/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.1.1-incubating/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.1.1-incubating/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/io-overview.html b/content/docs/en/2.1.1-incubating/io-overview.html
index 3b5f682..df37cc1 100644
--- a/content/docs/en/2.1.1-incubating/io-overview.html
+++ b/content/docs/en/2.1.1-incubating/io-overview.html
@@ -107,7 +107,7 @@
 <tr><td><a href="https://developer.twitter.com/en/docs">Twitter Firehose source</a></td><td><a href="https://github.com/apache/incubator-pulsar/blob/master/pulsar-io/twitter/src/main/java/org/apache/pulsar/io/twitter/TwitterFireHose.java">org.apache.pulsar.io.twitter.TwitterFireHose</a></td><td><a href="/docs/en/2.1.1-incubating/io-twitter#source">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connector [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.1.1-incubating/io-overview/index.html b/content/docs/en/2.1.1-incubating/io-overview/index.html
index 3b5f682..df37cc1 100644
--- a/content/docs/en/2.1.1-incubating/io-overview/index.html
+++ b/content/docs/en/2.1.1-incubating/io-overview/index.html
@@ -107,7 +107,7 @@
 <tr><td><a href="https://developer.twitter.com/en/docs">Twitter Firehose source</a></td><td><a href="https://github.com/apache/incubator-pulsar/blob/master/pulsar-io/twitter/src/main/java/org/apache/pulsar/io/twitter/TwitterFireHose.java">org.apache.pulsar.io.twitter.TwitterFireHose</a></td><td><a href="/docs/en/2.1.1-incubating/io-twitter#source">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.1.1-incubating/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.1.1-incubating/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connector [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/deploy-bare-metal.html b/content/docs/en/2.2.0/deploy-bare-metal.html
index 84718d0..fb3260c 100644
--- a/content/docs/en/2.2.0/deploy-bare-metal.html
+++ b/content/docs/en/2.2.0/deploy-bare-metal.html
@@ -283,7 +283,7 @@ $ <span class="hljs-built_in">echo</span> 1 &gt; data/zookeeper/myid
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.2.0/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.2.0/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -363,7 +363,7 @@ verify all the bookies in the cluster are up running.</p>
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.2.0/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.2.0/deploy-bare-metal/index.html b/content/docs/en/2.2.0/deploy-bare-metal/index.html
index 84718d0..fb3260c 100644
--- a/content/docs/en/2.2.0/deploy-bare-metal/index.html
+++ b/content/docs/en/2.2.0/deploy-bare-metal/index.html
@@ -283,7 +283,7 @@ $ <span class="hljs-built_in">echo</span> 1 &gt; data/zookeeper/myid
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.2.0/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.2.0/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -363,7 +363,7 @@ verify all the bookies in the cluster are up running.</p>
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.2.0/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.2.0/functions-api.html b/content/docs/en/2.2.0/functions-api.html
index 5210b18..7acc47c 100644
--- a/content/docs/en/2.2.0/functions-api.html
+++ b/content/docs/en/2.2.0/functions-api.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.2.0/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.2.0/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.2.0/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.2.0/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.2.0/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.2.0/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.2.0/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.2.0/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.2.0/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.2.0/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/2.2.0/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.2.0/reference-terminology#broker">broker</a> for <a href="/docs/en/2.2.0/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.2.0/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.2.0/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.2.0/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a h [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-func [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/functions-api/index.html b/content/docs/en/2.2.0/functions-api/index.html
index 5210b18..7acc47c 100644
--- a/content/docs/en/2.2.0/functions-api/index.html
+++ b/content/docs/en/2.2.0/functions-api/index.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.2.0/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.2.0/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.2.0/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.2.0/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.2.0/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.2.0/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.2.0/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.2.0/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.2.0/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.2.0/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/2.2.0/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.2.0/reference-terminology#broker">broker</a> for <a href="/docs/en/2.2.0/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.2.0/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.2.0/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.2.0/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a h [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-func [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/functions-deploying.html b/content/docs/en/2.2.0/functions-deploying.html
index 03c42b5..07d5f47 100644
--- a/content/docs/en/2.2.0/functions-deploying.html
+++ b/content/docs/en/2.2.0/functions-deploying.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.2.0/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.2.0/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.2.0/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.2.0/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.2.0/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.2.0/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.2.0/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.2.0/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.2.0/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.2.0/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface</a><ul clas [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/functions-deploying/index.html b/content/docs/en/2.2.0/functions-deploying/index.html
index 03c42b5..07d5f47 100644
--- a/content/docs/en/2.2.0/functions-deploying/index.html
+++ b/content/docs/en/2.2.0/functions-deploying/index.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.2.0/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.2.0/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.2.0/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.2.0/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.2.0/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.2.0/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.2.0/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.2.0/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.2.0/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.2.0/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface</a><ul clas [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/functions-guarantees.html b/content/docs/en/2.2.0/functions-guarantees.html
index a1789d1..47c100d 100644
--- a/content/docs/en/2.2.0/functions-guarantees.html
+++ b/content/docs/en/2.2.0/functions-guarantees.html
@@ -106,7 +106,7 @@
   --processing-guarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a func [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a function</a></li><li><a  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/functions-guarantees/index.html b/content/docs/en/2.2.0/functions-guarantees/index.html
index a1789d1..47c100d 100644
--- a/content/docs/en/2.2.0/functions-guarantees/index.html
+++ b/content/docs/en/2.2.0/functions-guarantees/index.html
@@ -106,7 +106,7 @@
   --processing-guarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a func [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a function</a></li><li><a  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/functions-metrics.html b/content/docs/en/2.2.0/functions-metrics.html
index 6e2d1dc..a4550db 100644
--- a/content/docs/en/2.2.0/functions-metrics.html
+++ b/content/docs/en/2.2.0/functions-metrics.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.2.0/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.2.0/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.2.0/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.2.0/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.2.0/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#pytho [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#python-sdk [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/functions-metrics/index.html b/content/docs/en/2.2.0/functions-metrics/index.html
index 6e2d1dc..a4550db 100644
--- a/content/docs/en/2.2.0/functions-metrics/index.html
+++ b/content/docs/en/2.2.0/functions-metrics/index.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.2.0/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.2.0/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.2.0/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.2.0/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.2.0/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#pytho [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#python-sdk [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/functions-overview.html b/content/docs/en/2.2.0/functions-overview.html
index d3234cc..8f7401d 100644
--- a/content/docs/en/2.2.0/functions-overview.html
+++ b/content/docs/en/2.2.0/functions-overview.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.2.0/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.2.0/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.2.0/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.2.0/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -221,7 +221,7 @@
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.2.0/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.2.0/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -249,7 +249,7 @@
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.2.0/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.2.0/functions-api#functions-for-python">Pythnon</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Pythnon</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -344,7 +344,7 @@
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.2.0/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -352,7 +352,7 @@
   --<span class="hljs-built_in">log</span>-topic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.2.0/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -384,11 +384,11 @@
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.2.0/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no me [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.2.0/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.2.0/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.2.0/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -422,10 +422,10 @@
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.2.0/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#progr [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#programming- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/functions-overview/index.html b/content/docs/en/2.2.0/functions-overview/index.html
index d3234cc..8f7401d 100644
--- a/content/docs/en/2.2.0/functions-overview/index.html
+++ b/content/docs/en/2.2.0/functions-overview/index.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.2.0/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.2.0/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.2.0/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.2.0/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -221,7 +221,7 @@
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.2.0/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.2.0/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -249,7 +249,7 @@
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.2.0/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.2.0/functions-api#functions-for-python">Pythnon</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Pythnon</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -344,7 +344,7 @@
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.2.0/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -352,7 +352,7 @@
   --<span class="hljs-built_in">log</span>-topic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.2.0/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -384,11 +384,11 @@
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.2.0/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no me [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.2.0/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.2.0/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.2.0/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -422,10 +422,10 @@
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.2.0/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#progr [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#programming- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/functions-quickstart.html b/content/docs/en/2.2.0/functions-quickstart.html
index aa5dc5c..353b03a 100644
--- a/content/docs/en/2.2.0/functions-quickstart.html
+++ b/content/docs/en/2.2.0/functions-quickstart.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.2.0/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -259,10 +259,10 @@ $ bin/pulsar standalone \
 </code></pre>
 <p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
 <ul>
-<li><a href="/docs/en/2.2.0/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.2.0/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cl [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar c [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/functions-quickstart/index.html b/content/docs/en/2.2.0/functions-quickstart/index.html
index aa5dc5c..353b03a 100644
--- a/content/docs/en/2.2.0/functions-quickstart/index.html
+++ b/content/docs/en/2.2.0/functions-quickstart/index.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.2.0/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -259,10 +259,10 @@ $ bin/pulsar standalone \
 </code></pre>
 <p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
 <ul>
-<li><a href="/docs/en/2.2.0/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.2.0/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cl [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar c [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/functions-state.html b/content/docs/en/2.2.0/functions-state.html
index ed76d5d..e76be03 100644
--- a/content/docs/en/2.2.0/functions-state.html
+++ b/content/docs/en/2.2.0/functions-state.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.2.0/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.2.0/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.2.0/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.2.0/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a hr [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a href="#python-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/functions-state/index.html b/content/docs/en/2.2.0/functions-state/index.html
index ed76d5d..e76be03 100644
--- a/content/docs/en/2.2.0/functions-state/index.html
+++ b/content/docs/en/2.2.0/functions-state/index.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.2.0/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.2.0/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.2.0/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.2.0/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a hr [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a href="#python-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/io-overview.html b/content/docs/en/2.2.0/io-overview.html
index 4749f80..4b6a0e7 100644
--- a/content/docs/en/2.2.0/io-overview.html
+++ b/content/docs/en/2.2.0/io-overview.html
@@ -107,7 +107,7 @@
 <tr><td><a href="https://developer.twitter.com/en/docs">Twitter Firehose source</a></td><td><a href="https://github.com/apache/pulsar/blob/master/pulsar-io/twitter/src/main/java/org/apache/pulsar/io/twitter/TwitterFireHose.java"><code>org.apache.pulsar.io.twitter.TwitterFireHose</code></a></td><td><a href="/docs/en/2.2.0/io-twitter#source">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.2.0/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connect [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connec [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.0/io-overview/index.html b/content/docs/en/2.2.0/io-overview/index.html
index 4749f80..4b6a0e7 100644
--- a/content/docs/en/2.2.0/io-overview/index.html
+++ b/content/docs/en/2.2.0/io-overview/index.html
@@ -107,7 +107,7 @@
 <tr><td><a href="https://developer.twitter.com/en/docs">Twitter Firehose source</a></td><td><a href="https://github.com/apache/pulsar/blob/master/pulsar-io/twitter/src/main/java/org/apache/pulsar/io/twitter/TwitterFireHose.java"><code>org.apache.pulsar.io.twitter.TwitterFireHose</code></a></td><td><a href="/docs/en/2.2.0/io-twitter#source">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.2.0/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connect [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.0/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.0/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connec [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/deploy-bare-metal.html b/content/docs/en/2.2.1/deploy-bare-metal.html
index 6a42a93..b038ede 100644
--- a/content/docs/en/2.2.1/deploy-bare-metal.html
+++ b/content/docs/en/2.2.1/deploy-bare-metal.html
@@ -297,7 +297,7 @@ need to start zookeeper by using different stats port.</p>
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.2.1/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.2.1/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -389,7 +389,7 @@ verify all the bookies in the cluster are up running.</p>
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.2.1/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.2.1/deploy-bare-metal/index.html b/content/docs/en/2.2.1/deploy-bare-metal/index.html
index 6a42a93..b038ede 100644
--- a/content/docs/en/2.2.1/deploy-bare-metal/index.html
+++ b/content/docs/en/2.2.1/deploy-bare-metal/index.html
@@ -297,7 +297,7 @@ need to start zookeeper by using different stats port.</p>
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.2.1/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.2.1/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -389,7 +389,7 @@ verify all the bookies in the cluster are up running.</p>
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.2.1/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.2.1/functions-api.html b/content/docs/en/2.2.1/functions-api.html
index 42e9eb0..d8b1cfe 100644
--- a/content/docs/en/2.2.1/functions-api.html
+++ b/content/docs/en/2.2.1/functions-api.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.2.1/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.2.1/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.2.1/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.2.1/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.2.1/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.2.1/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.2.1/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.2.1/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.2.1/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.2.1/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/2.2.1/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.2.1/reference-terminology#broker">broker</a> for <a href="/docs/en/2.2.1/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.2.1/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.2.1/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.2.1/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a h [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-func [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/functions-api/index.html b/content/docs/en/2.2.1/functions-api/index.html
index 42e9eb0..d8b1cfe 100644
--- a/content/docs/en/2.2.1/functions-api/index.html
+++ b/content/docs/en/2.2.1/functions-api/index.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.2.1/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.2.1/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.2.1/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.2.1/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.2.1/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.2.1/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.2.1/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.2.1/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.2.1/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.2.1/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/2.2.1/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.2.1/reference-terminology#broker">broker</a> for <a href="/docs/en/2.2.1/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.2.1/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.2.1/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.2.1/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a h [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-func [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/functions-deploying.html b/content/docs/en/2.2.1/functions-deploying.html
index 41d227f..447fda8 100644
--- a/content/docs/en/2.2.1/functions-deploying.html
+++ b/content/docs/en/2.2.1/functions-deploying.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.2.1/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.2.1/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.2.1/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.2.1/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.2.1/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.2.1/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.2.1/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.2.1/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.2.1/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.2.1/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface</a><ul clas [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/functions-deploying/index.html b/content/docs/en/2.2.1/functions-deploying/index.html
index 41d227f..447fda8 100644
--- a/content/docs/en/2.2.1/functions-deploying/index.html
+++ b/content/docs/en/2.2.1/functions-deploying/index.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.2.1/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.2.1/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.2.1/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.2.1/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.2.1/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.2.1/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.2.1/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.2.1/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.2.1/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.2.1/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface</a><ul clas [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/functions-guarantees.html b/content/docs/en/2.2.1/functions-guarantees.html
index c3168ea..b53a707 100644
--- a/content/docs/en/2.2.1/functions-guarantees.html
+++ b/content/docs/en/2.2.1/functions-guarantees.html
@@ -106,7 +106,7 @@
   --processing-guarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a func [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a function</a></li><li><a  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/functions-guarantees/index.html b/content/docs/en/2.2.1/functions-guarantees/index.html
index c3168ea..b53a707 100644
--- a/content/docs/en/2.2.1/functions-guarantees/index.html
+++ b/content/docs/en/2.2.1/functions-guarantees/index.html
@@ -106,7 +106,7 @@
   --processing-guarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a func [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a function</a></li><li><a  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/functions-metrics.html b/content/docs/en/2.2.1/functions-metrics.html
index 03d4f6e..0f7dae0 100644
--- a/content/docs/en/2.2.1/functions-metrics.html
+++ b/content/docs/en/2.2.1/functions-metrics.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.2.1/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.2.1/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.2.1/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.2.1/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.2.1/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#pytho [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#python-sdk [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/functions-metrics/index.html b/content/docs/en/2.2.1/functions-metrics/index.html
index 03d4f6e..0f7dae0 100644
--- a/content/docs/en/2.2.1/functions-metrics/index.html
+++ b/content/docs/en/2.2.1/functions-metrics/index.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.2.1/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.2.1/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.2.1/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.2.1/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.2.1/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#pytho [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#python-sdk [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/functions-overview.html b/content/docs/en/2.2.1/functions-overview.html
index 67f9825..7f8aec1 100644
--- a/content/docs/en/2.2.1/functions-overview.html
+++ b/content/docs/en/2.2.1/functions-overview.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.2.1/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.2.1/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.2.1/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.2.1/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -221,7 +221,7 @@
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.2.1/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.2.1/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -249,7 +249,7 @@
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.2.1/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.2.1/functions-api#functions-for-python">Python</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -344,7 +344,7 @@
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.2.1/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -352,7 +352,7 @@
   --<span class="hljs-built_in">log</span>-topic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.2.1/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -384,11 +384,11 @@
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.2.1/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no me [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.2.1/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.2.1/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.2.1/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -422,10 +422,10 @@
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.2.1/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#progr [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#programming- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/functions-overview/index.html b/content/docs/en/2.2.1/functions-overview/index.html
index 67f9825..7f8aec1 100644
--- a/content/docs/en/2.2.1/functions-overview/index.html
+++ b/content/docs/en/2.2.1/functions-overview/index.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.2.1/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.2.1/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.2.1/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.2.1/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -221,7 +221,7 @@
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.2.1/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.2.1/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -249,7 +249,7 @@
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.2.1/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.2.1/functions-api#functions-for-python">Python</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -344,7 +344,7 @@
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.2.1/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -352,7 +352,7 @@
   --<span class="hljs-built_in">log</span>-topic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.2.1/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -384,11 +384,11 @@
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.2.1/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no me [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.2.1/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.2.1/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.2.1/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -422,10 +422,10 @@
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.2.1/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#progr [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#programming- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/functions-quickstart.html b/content/docs/en/2.2.1/functions-quickstart.html
index e39658a..1adae9f 100644
--- a/content/docs/en/2.2.1/functions-quickstart.html
+++ b/content/docs/en/2.2.1/functions-quickstart.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.2.1/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -259,10 +259,10 @@ $ bin/pulsar standalone \
 </code></pre>
 <p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
 <ul>
-<li><a href="/docs/en/2.2.1/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.2.1/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cl [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar c [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/functions-quickstart/index.html b/content/docs/en/2.2.1/functions-quickstart/index.html
index e39658a..1adae9f 100644
--- a/content/docs/en/2.2.1/functions-quickstart/index.html
+++ b/content/docs/en/2.2.1/functions-quickstart/index.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.2.1/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -259,10 +259,10 @@ $ bin/pulsar standalone \
 </code></pre>
 <p>Once again, success! We created a brand new Pulsar Function, deployed it in our Pulsar standalone cluster in <a href="#run-a-pulsar-function-in-cluster-mode">cluster mode</a> and successfully triggered the function. If you're ready for more, check out one of these docs:</p>
 <ul>
-<li><a href="/docs/en/2.2.1/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.2.1/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cl [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar c [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/functions-state.html b/content/docs/en/2.2.1/functions-state.html
index 7c9d044..26077ff 100644
--- a/content/docs/en/2.2.1/functions-state.html
+++ b/content/docs/en/2.2.1/functions-state.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.2.1/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.2.1/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.2.1/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.2.1/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a hr [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a href="#python-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/functions-state/index.html b/content/docs/en/2.2.1/functions-state/index.html
index 7c9d044..26077ff 100644
--- a/content/docs/en/2.2.1/functions-state/index.html
+++ b/content/docs/en/2.2.1/functions-state/index.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.2.1/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.2.1/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.2.1/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.2.1/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a hr [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a href="#python-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/io-overview.html b/content/docs/en/2.2.1/io-overview.html
index 97cc1ea..1ad2b16 100644
--- a/content/docs/en/2.2.1/io-overview.html
+++ b/content/docs/en/2.2.1/io-overview.html
@@ -108,7 +108,7 @@
 <tr><td><a href="https://debezium.io/">CDC Connector</a></td><td><a href="https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/KafkaConnectSource.java"><code>org.apache.pulsar.io.kafka.connect.KafkaConnectSource</code></a></td><td><a href="/docs/en/2.2.1/io-cdc">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.2.1/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connect [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connec [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.2.1/io-overview/index.html b/content/docs/en/2.2.1/io-overview/index.html
index 97cc1ea..1ad2b16 100644
--- a/content/docs/en/2.2.1/io-overview/index.html
+++ b/content/docs/en/2.2.1/io-overview/index.html
@@ -108,7 +108,7 @@
 <tr><td><a href="https://debezium.io/">CDC Connector</a></td><td><a href="https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/KafkaConnectSource.java"><code>org.apache.pulsar.io.kafka.connect.KafkaConnectSource</code></a></td><td><a href="/docs/en/2.2.1/io-cdc">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.2.1/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connect [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.2.1/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.2.1/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connec [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/deploy-bare-metal.html b/content/docs/en/2.3.0/deploy-bare-metal.html
index 88e3302..04abdce 100644
--- a/content/docs/en/2.3.0/deploy-bare-metal.html
+++ b/content/docs/en/2.3.0/deploy-bare-metal.html
@@ -288,7 +288,7 @@ need to start zookeeper by using different stats port.</p>
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.3.0/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.3.0/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -390,7 +390,7 @@ Hello Pulsar
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.3.0/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.3.0/deploy-bare-metal/index.html b/content/docs/en/2.3.0/deploy-bare-metal/index.html
index 88e3302..04abdce 100644
--- a/content/docs/en/2.3.0/deploy-bare-metal/index.html
+++ b/content/docs/en/2.3.0/deploy-bare-metal/index.html
@@ -288,7 +288,7 @@ need to start zookeeper by using different stats port.</p>
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.3.0/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.3.0/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -390,7 +390,7 @@ Hello Pulsar
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.3.0/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.3.0/functions-api.html b/content/docs/en/2.3.0/functions-api.html
index 30242f0..5e75f86 100644
--- a/content/docs/en/2.3.0/functions-api.html
+++ b/content/docs/en/2.3.0/functions-api.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.3.0/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.3.0/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.3.0/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.3.0/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.3.0/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.3.0/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.3.0/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.3.0/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.3.0/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.3.0/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/2.3.0/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.3.0/reference-terminology#broker">broker</a> for <a href="/docs/en/2.3.0/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.3.0/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.3.0/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.3.0/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a h [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-func [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/functions-api/index.html b/content/docs/en/2.3.0/functions-api/index.html
index 30242f0..5e75f86 100644
--- a/content/docs/en/2.3.0/functions-api/index.html
+++ b/content/docs/en/2.3.0/functions-api/index.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.3.0/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.3.0/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.3.0/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.3.0/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.3.0/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.3.0/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.3.0/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.3.0/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.3.0/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.3.0/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/2.3.0/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.3.0/reference-terminology#broker">broker</a> for <a href="/docs/en/2.3.0/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.3.0/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.3.0/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.3.0/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a h [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-func [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/functions-deploying.html b/content/docs/en/2.3.0/functions-deploying.html
index 51d3ef9..53153fa 100644
--- a/content/docs/en/2.3.0/functions-deploying.html
+++ b/content/docs/en/2.3.0/functions-deploying.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.3.0/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.3.0/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.3.0/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.3.0/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.3.0/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.3.0/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.3.0/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.3.0/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.3.0/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.3.0/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface</a><ul clas [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/functions-deploying/index.html b/content/docs/en/2.3.0/functions-deploying/index.html
index 51d3ef9..53153fa 100644
--- a/content/docs/en/2.3.0/functions-deploying/index.html
+++ b/content/docs/en/2.3.0/functions-deploying/index.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.3.0/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.3.0/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.3.0/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.3.0/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.3.0/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.3.0/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.3.0/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.3.0/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.3.0/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.3.0/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface</a><ul clas [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/functions-guarantees.html b/content/docs/en/2.3.0/functions-guarantees.html
index 33e0e3b..da08d88 100644
--- a/content/docs/en/2.3.0/functions-guarantees.html
+++ b/content/docs/en/2.3.0/functions-guarantees.html
@@ -106,7 +106,7 @@
   --processing-guarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a func [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a function</a></li><li><a  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/functions-guarantees/index.html b/content/docs/en/2.3.0/functions-guarantees/index.html
index 33e0e3b..da08d88 100644
--- a/content/docs/en/2.3.0/functions-guarantees/index.html
+++ b/content/docs/en/2.3.0/functions-guarantees/index.html
@@ -106,7 +106,7 @@
   --processing-guarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a func [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a function</a></li><li><a  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/functions-metrics.html b/content/docs/en/2.3.0/functions-metrics.html
index e6679ee..ada32ad 100644
--- a/content/docs/en/2.3.0/functions-metrics.html
+++ b/content/docs/en/2.3.0/functions-metrics.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.3.0/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.3.0/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.3.0/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.3.0/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.3.0/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#pytho [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#python-sdk [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/functions-metrics/index.html b/content/docs/en/2.3.0/functions-metrics/index.html
index e6679ee..ada32ad 100644
--- a/content/docs/en/2.3.0/functions-metrics/index.html
+++ b/content/docs/en/2.3.0/functions-metrics/index.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.3.0/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.3.0/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.3.0/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.3.0/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.3.0/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#pytho [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#python-sdk [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/functions-overview.html b/content/docs/en/2.3.0/functions-overview.html
index 94fbb71..24e2d2a 100644
--- a/content/docs/en/2.3.0/functions-overview.html
+++ b/content/docs/en/2.3.0/functions-overview.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.3.0/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.3.0/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.3.0/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.3.0/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -221,7 +221,7 @@
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.3.0/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.3.0/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -249,7 +249,7 @@
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.3.0/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.3.0/functions-api#functions-for-python">Python</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -344,7 +344,7 @@
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.3.0/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -352,7 +352,7 @@
   --<span class="hljs-built_in">log</span>-topic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.3.0/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -384,11 +384,11 @@
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.3.0/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no me [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.3.0/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.3.0/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.3.0/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -422,10 +422,10 @@
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.3.0/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#progr [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#programming- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/functions-overview/index.html b/content/docs/en/2.3.0/functions-overview/index.html
index 94fbb71..24e2d2a 100644
--- a/content/docs/en/2.3.0/functions-overview/index.html
+++ b/content/docs/en/2.3.0/functions-overview/index.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.3.0/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.3.0/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.3.0/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.3.0/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like this...</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -221,7 +221,7 @@
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.3.0/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.3.0/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -249,7 +249,7 @@
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.3.0/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.3.0/functions-api#functions-for-python">Python</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -344,7 +344,7 @@
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.3.0/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -352,7 +352,7 @@
   --<span class="hljs-built_in">log</span>-topic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.3.0/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -384,11 +384,11 @@
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.3.0/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no me [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.3.0/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.3.0/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.3.0/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -422,10 +422,10 @@
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.3.0/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#progr [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#programming- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/functions-quickstart.html b/content/docs/en/2.3.0/functions-quickstart.html
index 65395c3..9612fd0 100644
--- a/content/docs/en/2.3.0/functions-quickstart.html
+++ b/content/docs/en/2.3.0/functions-quickstart.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.3.0/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -303,10 +303,10 @@ zip -r exclamation.zip exclamation
 </code></pre>
 <p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
 <ul>
-<li><a href="/docs/en/2.3.0/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.3.0/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cl [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar c [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/functions-quickstart/index.html b/content/docs/en/2.3.0/functions-quickstart/index.html
index 65395c3..9612fd0 100644
--- a/content/docs/en/2.3.0/functions-quickstart/index.html
+++ b/content/docs/en/2.3.0/functions-quickstart/index.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.3.0/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -303,10 +303,10 @@ zip -r exclamation.zip exclamation
 </code></pre>
 <p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
 <ul>
-<li><a href="/docs/en/2.3.0/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.3.0/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cl [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar c [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/functions-state.html b/content/docs/en/2.3.0/functions-state.html
index 3450524..155ff04 100644
--- a/content/docs/en/2.3.0/functions-state.html
+++ b/content/docs/en/2.3.0/functions-state.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.3.0/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.3.0/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.3.0/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.3.0/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a hr [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a href="#python-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/functions-state/index.html b/content/docs/en/2.3.0/functions-state/index.html
index 3450524..155ff04 100644
--- a/content/docs/en/2.3.0/functions-state/index.html
+++ b/content/docs/en/2.3.0/functions-state/index.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.3.0/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.3.0/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.3.0/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.3.0/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a hr [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a href="#python-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/io-overview.html b/content/docs/en/2.3.0/io-overview.html
index 85fa7ac..931312e 100644
--- a/content/docs/en/2.3.0/io-overview.html
+++ b/content/docs/en/2.3.0/io-overview.html
@@ -108,7 +108,7 @@
 <tr><td><a href="https://debezium.io/">CDC Connector</a></td><td><a href="https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/KafkaConnectSource.java"><code>org.apache.pulsar.io.kafka.connect.KafkaConnectSource</code></a></td><td><a href="/docs/en/2.3.0/io-cdc">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.3.0/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connect [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connec [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.0/io-overview/index.html b/content/docs/en/2.3.0/io-overview/index.html
index 85fa7ac..931312e 100644
--- a/content/docs/en/2.3.0/io-overview/index.html
+++ b/content/docs/en/2.3.0/io-overview/index.html
@@ -108,7 +108,7 @@
 <tr><td><a href="https://debezium.io/">CDC Connector</a></td><td><a href="https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/KafkaConnectSource.java"><code>org.apache.pulsar.io.kafka.connect.KafkaConnectSource</code></a></td><td><a href="/docs/en/2.3.0/io-cdc">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.3.0/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connect [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.0/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.0/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connec [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/deploy-bare-metal.html b/content/docs/en/2.3.1/deploy-bare-metal.html
index 8550e3d..bf38813 100644
--- a/content/docs/en/2.3.1/deploy-bare-metal.html
+++ b/content/docs/en/2.3.1/deploy-bare-metal.html
@@ -288,7 +288,7 @@ need to start zookeeper by using different stats port.</p>
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.3.1/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.3.1/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -396,7 +396,7 @@ Hello Pulsar
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.3.1/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.3.1/deploy-bare-metal/index.html b/content/docs/en/2.3.1/deploy-bare-metal/index.html
index 8550e3d..bf38813 100644
--- a/content/docs/en/2.3.1/deploy-bare-metal/index.html
+++ b/content/docs/en/2.3.1/deploy-bare-metal/index.html
@@ -288,7 +288,7 @@ need to start zookeeper by using different stats port.</p>
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.3.1/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.3.1/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -396,7 +396,7 @@ Hello Pulsar
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.3.1/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.3.1/functions-api.html b/content/docs/en/2.3.1/functions-api.html
index 095aba3..7d31181 100644
--- a/content/docs/en/2.3.1/functions-api.html
+++ b/content/docs/en/2.3.1/functions-api.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.3.1/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.3.1/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.3.1/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.3.1/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.3.1/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.3.1/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.3.1/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.3.1/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.3.1/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.3.1/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/2.3.1/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.3.1/reference-terminology#broker">broker</a> for <a href="/docs/en/2.3.1/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.3.1/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.3.1/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.3.1/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a h [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-func [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/functions-api/index.html b/content/docs/en/2.3.1/functions-api/index.html
index 095aba3..7d31181 100644
--- a/content/docs/en/2.3.1/functions-api/index.html
+++ b/content/docs/en/2.3.1/functions-api/index.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.3.1/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.3.1/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.3.1/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.3.1/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.3.1/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.3.1/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.3.1/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.3.1/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.3.1/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.3.1/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/2.3.1/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.3.1/reference-terminology#broker">broker</a> for <a href="/docs/en/2.3.1/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.3.1/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.3.1/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.3.1/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a h [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-func [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/functions-deploying.html b/content/docs/en/2.3.1/functions-deploying.html
index d9d286a..abc8841 100644
--- a/content/docs/en/2.3.1/functions-deploying.html
+++ b/content/docs/en/2.3.1/functions-deploying.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.3.1/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.3.1/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.3.1/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.3.1/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.3.1/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.3.1/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.3.1/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.3.1/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.3.1/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.3.1/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface</a><ul clas [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/functions-deploying/index.html b/content/docs/en/2.3.1/functions-deploying/index.html
index d9d286a..abc8841 100644
--- a/content/docs/en/2.3.1/functions-deploying/index.html
+++ b/content/docs/en/2.3.1/functions-deploying/index.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.3.1/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.3.1/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.3.1/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.3.1/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.3.1/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.3.1/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.3.1/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.3.1/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.3.1/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.3.1/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface</a><ul clas [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/functions-guarantees.html b/content/docs/en/2.3.1/functions-guarantees.html
index a37d0bc..ddd06bf 100644
--- a/content/docs/en/2.3.1/functions-guarantees.html
+++ b/content/docs/en/2.3.1/functions-guarantees.html
@@ -106,7 +106,7 @@
   --processing-guarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a func [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a function</a></li><li><a  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/functions-guarantees/index.html b/content/docs/en/2.3.1/functions-guarantees/index.html
index a37d0bc..ddd06bf 100644
--- a/content/docs/en/2.3.1/functions-guarantees/index.html
+++ b/content/docs/en/2.3.1/functions-guarantees/index.html
@@ -106,7 +106,7 @@
   --processing-guarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a func [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a function</a></li><li><a  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/functions-metrics.html b/content/docs/en/2.3.1/functions-metrics.html
index e7131cc..7547f07 100644
--- a/content/docs/en/2.3.1/functions-metrics.html
+++ b/content/docs/en/2.3.1/functions-metrics.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.3.1/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.3.1/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.3.1/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.3.1/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.3.1/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#pytho [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#python-sdk [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/functions-metrics/index.html b/content/docs/en/2.3.1/functions-metrics/index.html
index e7131cc..7547f07 100644
--- a/content/docs/en/2.3.1/functions-metrics/index.html
+++ b/content/docs/en/2.3.1/functions-metrics/index.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.3.1/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.3.1/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.3.1/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.3.1/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.3.1/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#pytho [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></li><li><a href="#python-sdk [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/functions-overview.html b/content/docs/en/2.3.1/functions-overview.html
index da8bcc4..6202456 100644
--- a/content/docs/en/2.3.1/functions-overview.html
+++ b/content/docs/en/2.3.1/functions-overview.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.3.1/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.3.1/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.3.1/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.3.1/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like below:</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like below:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -222,7 +222,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.3.1/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.3.1/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -250,7 +250,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.3.1/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.3.1/functions-api#functions-for-python">Python</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -345,7 +345,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.3.1/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -353,7 +353,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   --<span class="hljs-built_in">log</span>-topic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.3.1/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -385,11 +385,11 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.3.1/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no me [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.3.1/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.3.1/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.3.1/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -423,10 +423,10 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.3.1/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#progr [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#programming- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/functions-overview/index.html b/content/docs/en/2.3.1/functions-overview/index.html
index da8bcc4..6202456 100644
--- a/content/docs/en/2.3.1/functions-overview/index.html
+++ b/content/docs/en/2.3.1/functions-overview/index.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.3.1/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.3.1/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.3.1/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.3.1/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like below:</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like below:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -222,7 +222,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.3.1/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.3.1/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -250,7 +250,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.3.1/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.3.1/functions-api#functions-for-python">Python</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -345,7 +345,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.3.1/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -353,7 +353,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   --<span class="hljs-built_in">log</span>-topic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.3.1/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -385,11 +385,11 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.3.1/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no me [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.3.1/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.3.1/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.3.1/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -423,10 +423,10 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.3.1/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#progr [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#programming- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/functions-quickstart.html b/content/docs/en/2.3.1/functions-quickstart.html
index 69810e4..39de455 100644
--- a/content/docs/en/2.3.1/functions-quickstart.html
+++ b/content/docs/en/2.3.1/functions-quickstart.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.3.1/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -303,10 +303,10 @@ zip -r exclamation.zip exclamation
 </code></pre>
 <p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
 <ul>
-<li><a href="/docs/en/2.3.1/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.3.1/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cl [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar c [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/functions-quickstart/index.html b/content/docs/en/2.3.1/functions-quickstart/index.html
index 69810e4..39de455 100644
--- a/content/docs/en/2.3.1/functions-quickstart/index.html
+++ b/content/docs/en/2.3.1/functions-quickstart/index.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.3.1/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -303,10 +303,10 @@ zip -r exclamation.zip exclamation
 </code></pre>
 <p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
 <ul>
-<li><a href="/docs/en/2.3.1/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.3.1/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cl [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar c [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/functions-state.html b/content/docs/en/2.3.1/functions-state.html
index f78d107..6872c02 100644
--- a/content/docs/en/2.3.1/functions-state.html
+++ b/content/docs/en/2.3.1/functions-state.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.3.1/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.3.1/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.3.1/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.3.1/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a hr [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a href="#python-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/functions-state/index.html b/content/docs/en/2.3.1/functions-state/index.html
index f78d107..6872c02 100644
--- a/content/docs/en/2.3.1/functions-state/index.html
+++ b/content/docs/en/2.3.1/functions-state/index.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.3.1/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.3.1/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.3.1/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.3.1/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a hr [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a href="#python-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/io-overview.html b/content/docs/en/2.3.1/io-overview.html
index e4e1170..64404cc 100644
--- a/content/docs/en/2.3.1/io-overview.html
+++ b/content/docs/en/2.3.1/io-overview.html
@@ -108,7 +108,7 @@
 <tr><td><a href="https://debezium.io/">CDC Connector</a></td><td><a href="https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/KafkaConnectSource.java"><code>org.apache.pulsar.io.kafka.connect.KafkaConnectSource</code></a></td><td><a href="/docs/en/2.3.1/io-cdc">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.3.1/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connect [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connec [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.1/io-overview/index.html b/content/docs/en/2.3.1/io-overview/index.html
index e4e1170..64404cc 100644
--- a/content/docs/en/2.3.1/io-overview/index.html
+++ b/content/docs/en/2.3.1/io-overview/index.html
@@ -108,7 +108,7 @@
 <tr><td><a href="https://debezium.io/">CDC Connector</a></td><td><a href="https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/KafkaConnectSource.java"><code>org.apache.pulsar.io.kafka.connect.KafkaConnectSource</code></a></td><td><a href="/docs/en/2.3.1/io-cdc">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.3.1/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connect [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.1/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.1/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with connec [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/deploy-bare-metal.html b/content/docs/en/2.3.2/deploy-bare-metal.html
index c77661d..e070a11 100644
--- a/content/docs/en/2.3.2/deploy-bare-metal.html
+++ b/content/docs/en/2.3.2/deploy-bare-metal.html
@@ -288,7 +288,7 @@ need to start zookeeper by using different stats port.</p>
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.3.2/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.3.2/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -397,7 +397,7 @@ Hello Pulsar
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.3.2/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.3.2/deploy-bare-metal/index.html b/content/docs/en/2.3.2/deploy-bare-metal/index.html
index c77661d..e070a11 100644
--- a/content/docs/en/2.3.2/deploy-bare-metal/index.html
+++ b/content/docs/en/2.3.2/deploy-bare-metal/index.html
@@ -288,7 +288,7 @@ need to start zookeeper by using different stats port.</p>
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.3.2/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.3.2/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -397,7 +397,7 @@ Hello Pulsar
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.3.2/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.3.2/functions-api.html b/content/docs/en/2.3.2/functions-api.html
index 22540a5..1033f38 100644
--- a/content/docs/en/2.3.2/functions-api.html
+++ b/content/docs/en/2.3.2/functions-api.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.3.2/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.3.2/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.3.2/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.3.2/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.3.2/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.3.2/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.3.2/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.3.2/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.3.2/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.3.2/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/2.3.2/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.3.2/reference-terminology#broker">broker</a> for <a href="/docs/en/2.3.2/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.3.2/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.3.2/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.3.2/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a h [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-func [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-api/index.html b/content/docs/en/2.3.2/functions-api/index.html
index 22540a5..1033f38 100644
--- a/content/docs/en/2.3.2/functions-api/index.html
+++ b/content/docs/en/2.3.2/functions-api/index.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.3.2/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.3.2/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.3.2/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.3.2/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.3.2/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.3.2/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.3.2/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.3.2/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.3.2/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="getting-started-1"></a><a href="#getting-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
-<p>Regardless of which <a href="/docs/en/2.3.2/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/2.3.2/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.3.2/reference-terminology#broker">broker</a> for <a href="/docs/en/2.3.2/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.3.2/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.3.2/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.3.2/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a h [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-func [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-deploying.html b/content/docs/en/2.3.2/functions-deploying.html
index 220be4e..4a0adf3 100644
--- a/content/docs/en/2.3.2/functions-deploying.html
+++ b/content/docs/en/2.3.2/functions-deploying.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.3.2/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.3.2/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.3.2/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.3.2/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.3.2/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.3.2/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.3.2/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.3.2/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.3.2/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.3.2/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface</a><ul clas [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-deploying/index.html b/content/docs/en/2.3.2/functions-deploying/index.html
index 220be4e..4a0adf3 100644
--- a/content/docs/en/2.3.2/functions-deploying/index.html
+++ b/content/docs/en/2.3.2/functions-deploying/index.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.3.2/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.3.2/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.3.2/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.3.2/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.3.2/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.3.2/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.3.2/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.3.2/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.3.2/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.3.2/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface</a><ul clas [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-guarantees.html b/content/docs/en/2.3.2/functions-guarantees.html
index a48cc07..48978b0 100644
--- a/content/docs/en/2.3.2/functions-guarantees.html
+++ b/content/docs/en/2.3.2/functions-guarantees.html
@@ -106,7 +106,7 @@
   --processing-guarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a func [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a function</a></li><li><a  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-guarantees/index.html b/content/docs/en/2.3.2/functions-guarantees/index.html
index a48cc07..48978b0 100644
--- a/content/docs/en/2.3.2/functions-guarantees/index.html
+++ b/content/docs/en/2.3.2/functions-guarantees/index.html
@@ -106,7 +106,7 @@
   --processing-guarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a func [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a function</a></li><li><a  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-metrics.html b/content/docs/en/2.3.2/functions-metrics.html
index c7305ac..0b52d5b 100644
--- a/content/docs/en/2.3.2/functions-metrics.html
+++ b/content/docs/en/2.3.2/functions-metrics.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.3.2/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.3.2/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.3.2/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.3.2/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-worker"><span>Admin: Pulsar Functions Worker</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK< [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-worker"><span>Setup: Pulsar Functions Worker</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></ [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-metrics/index.html b/content/docs/en/2.3.2/functions-metrics/index.html
index c7305ac..0b52d5b 100644
--- a/content/docs/en/2.3.2/functions-metrics/index.html
+++ b/content/docs/en/2.3.2/functions-metrics/index.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.3.2/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.3.2/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.3.2/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.3.2/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-worker"><span>Admin: Pulsar Functions Worker</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK< [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-worker"><span>Setup: Pulsar Functions Worker</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></ [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-overview.html b/content/docs/en/2.3.2/functions-overview.html
index e5ad3be..c3562f3 100644
--- a/content/docs/en/2.3.2/functions-overview.html
+++ b/content/docs/en/2.3.2/functions-overview.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.3.2/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.3.2/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.3.2/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.3.2/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like below:</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like below:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -222,7 +222,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.3.2/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.3.2/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -250,7 +250,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.3.2/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.3.2/functions-api#functions-for-python">Python</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -345,7 +345,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.3.2/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -353,7 +353,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   --<span class="hljs-built_in">log</span>-topic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.3.2/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -385,11 +385,11 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.3.2/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no me [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.3.2/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.3.2/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.3.2/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -423,10 +423,10 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.3.2/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#progr [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#programming- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-overview/index.html b/content/docs/en/2.3.2/functions-overview/index.html
index e5ad3be..c3562f3 100644
--- a/content/docs/en/2.3.2/functions-overview/index.html
+++ b/content/docs/en/2.3.2/functions-overview/index.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic</li>
 </ul>
-<p>Here's an example Pulsar Function for Java (using the <a href="/docs/en/2.3.2/functions-api#java-native-functions">native interface</a>):</p>
+<p>Here's an example Pulsar Function for Java (using the <a href="functions-api.md#java-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>Here's an equivalent function in Python (also using the <a href="/docs/en/2.3.2/functions-api#python-native-functions">native interface</a>):</p>
+<p>Here's an equivalent function in Python (also using the <a href="functions-api.md#python-native-functions">native interface</a>):</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -129,7 +129,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you were to implement the classic word count example using Pulsar Functions, it might look something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>If you were writing the function in <a href="/docs/en/2.3.2/functions-api#functions-for-java">Java</a> using the <a href="/docs/en/2.3.2/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like below:</p>
+<p>If you were writing the function in <a href="functions-api.md#functions-for-java">Java</a> using the <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you could write the function like below:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -222,7 +222,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 </code></pre>
 <p>You can also mix and match configuration methods by specifying some function attributes via the CLI and others via YAML configuration.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Pulsar Functions can currently be written in <a href="/docs/en/2.3.2/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.3.2/functions-api#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
+<p>Pulsar Functions can currently be written in <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-api"></a><a href="#the-pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
 <p>The Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -250,7 +250,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 <p>Both Java and Python support writing &quot;native&quot; functions, i.e. Pulsar Functions with no dependencies.</p>
 <p>The benefit of native functions is that they don't have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they don't provide access to the function's <a href="#function-context">context</a>, which is necessary for a variety of functionality, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="the-pulsar-functions-sdk"></a><a href="#the-pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="/docs/en/2.3.2/functions-api#functions-for-java">Java</a> and <a href="/docs/en/2.3.2/functions-api#functions-for-python">Python</a>.</p>
+<p>If you'd like a Pulsar Function to have access to a <a href="#function-context">context object</a>, you can use the <strong>Pulsar Functions SDK</strong>, available for both <a href="functions-api.md#functions-for-java">Java</a> and <a href="functions-api.md#functions-for-python">Python</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>Here's an example Java function that uses information about its context:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -345,7 +345,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.3.2/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function's configuration. The function created using the command below, for example, would produce all logs on the <code>persistent://public/default/my-func-1-log</code> topic:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -353,7 +353,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   --<span class="hljs-built_in">log</span>-topic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>Here's an example <a href="/docs/en/2.3.2/functions-api#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
+<p>Here's an example <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function's input:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -385,11 +385,11 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="triggering-pulsar-functions"></a><a href="#triggering-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 1 [...]
-<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="/docs/en/2.3.2/functions-deploying#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no me [...]
+<p>Pulsar Functions running in <a href="#cluster-run-mode">cluster mode</a> can be <a href="functions-deploying.md#triggering-pulsar-functions">triggered</a> via the <a href="#command-line-interface">command line</a>. With triggering you can easily pass a specific value to a function and get the function's return value <em>without</em> needing to worry about creating a client, sending a message to the right input topic, etc. Triggering can be very useful for---but is by no means limited  [...]
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.3.2/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.3.2/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>Let's take an example Pulsar Function written in Python (using the <a href="/docs/en/2.3.2/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
+<p>Let's take an example Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -423,10 +423,10 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.3.2/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use the <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. All Pulsar installations, including local standalone installations, include a deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#progr [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#programming- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-quickstart.html b/content/docs/en/2.3.2/functions-quickstart.html
index 42919d1..aa2343e 100644
--- a/content/docs/en/2.3.2/functions-quickstart.html
+++ b/content/docs/en/2.3.2/functions-quickstart.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.3.2/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -303,10 +303,10 @@ zip -r exclamation.zip exclamation
 </code></pre>
 <p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
 <ul>
-<li><a href="/docs/en/2.3.2/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.3.2/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cl [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar c [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-quickstart/index.html b/content/docs/en/2.3.2/functions-quickstart/index.html
index 42919d1..aa2343e 100644
--- a/content/docs/en/2.3.2/functions-quickstart/index.html
+++ b/content/docs/en/2.3.2/functions-quickstart/index.html
@@ -225,7 +225,7 @@ $ bin/pulsar standalone \
 <p>If you see <code>Deleted successfully</code> in the output, then you've succesfully run, updated, and shut down a Pulsar Function running in cluster mode. Congrats! Now, let's go even further and run a brand new function in the next section.</p>
 <h2><a class="anchor" aria-hidden="true" id="writing-and-running-a-new-function"></a><a href="#writing-and-running-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5 [...]
 <blockquote>
-<p>In order to write and run the <a href="/docs/en/2.3.2/functions-api#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
+<p>In order to write and run the <a href="functions-api.md#functions-for-python">Python</a> function below, you'll need to install a few dependencies:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 </blockquote>
@@ -303,10 +303,10 @@ zip -r exclamation.zip exclamation
 </code></pre>
 <p>Archive <strong>exclamation.zip</strong> can we deployed as function into a pulsar worker, the worker does not need internet connectivity to download packages as they are all included in the zip file.</p>
 <ul>
-<li><a href="/docs/en/2.3.2/functions-api">The Pulsar Functions API</a></li>
-<li><a href="/docs/en/2.3.2/functions-deploying">Deploying Pulsar Functions</a></li>
+<li><a href="functions-api.md">The Pulsar Functions API</a></li>
+<li><a href="functions-deploying.md">Deploying Pulsar Functions</a></li>
 </ul>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cl [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar c [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-state.html b/content/docs/en/2.3.2/functions-state.html
index e2dae1a..021d711 100644
--- a/content/docs/en/2.3.2/functions-state.html
+++ b/content/docs/en/2.3.2/functions-state.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.3.2/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.3.2/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.3.2/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.3.2/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a hr [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a href="#python-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-state/index.html b/content/docs/en/2.3.2/functions-state/index.html
index e2dae1a..021d711 100644
--- a/content/docs/en/2.3.2/functions-state/index.html
+++ b/content/docs/en/2.3.2/functions-state/index.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.3.2/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.3.2/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.3.2/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.3.2/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a hr [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a href="#python-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-worker.html b/content/docs/en/2.3.2/functions-worker.html
index 23cad94..4259a2e 100644
--- a/content/docs/en/2.3.2/functions-worker.html
+++ b/content/docs/en/2.3.2/functions-worker.html
@@ -251,7 +251,7 @@ start proxies.</p>
 <ol start="3">
 <li>Set the correct cluster name in <code>pulsarFunctionsCluster</code> in the <code>conf/functions_worker.yml</code> file.</li>
 </ol>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.3.2/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#run-functions-worker-with-brokers">Run Functions-worker with brokers</a><ul class="toc-headings"><li><a href= [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#run-functions-worker-with-brokers">Run Functions-worker with brokers</a><ul class="toc-headings"><li><a href [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/functions-worker/index.html b/content/docs/en/2.3.2/functions-worker/index.html
index 23cad94..4259a2e 100644
--- a/content/docs/en/2.3.2/functions-worker/index.html
+++ b/content/docs/en/2.3.2/functions-worker/index.html
@@ -251,7 +251,7 @@ start proxies.</p>
 <ol start="3">
 <li>Set the correct cluster name in <code>pulsarFunctionsCluster</code> in the <code>conf/functions_worker.yml</code> file.</li>
 </ol>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.3.2/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#run-functions-worker-with-brokers">Run Functions-worker with brokers</a><ul class="toc-headings"><li><a href= [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.3.2/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#run-functions-worker-with-brokers">Run Functions-worker with brokers</a><ul class="toc-headings"><li><a href [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/io-overview.html b/content/docs/en/2.3.2/io-overview.html
index 33c7e25..303c0b9 100644
--- a/content/docs/en/2.3.2/io-overview.html
+++ b/content/docs/en/2.3.2/io-overview.html
@@ -108,7 +108,7 @@
 <tr><td><a href="https://debezium.io/">CDC Connector</a></td><td><a href="https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/KafkaConnectSource.java"><code>org.apache.pulsar.io.kafka.connect.KafkaConnectSource</code></a></td><td><a href="/docs/en/2.3.2/io-cdc">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-worker"><span class="arrow-prev">← </span><span>Admin: Pulsar Functions Worker</span></a><a class="docs-next button" href="/docs/en/2.3.2/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-worker"><span class="arrow-prev">← </span><span>Setup: Pulsar Functions Worker</span></a><a class="docs-next button" href="/docs/en/2.3.2/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.3.2/io-overview/index.html b/content/docs/en/2.3.2/io-overview/index.html
index 33c7e25..303c0b9 100644
--- a/content/docs/en/2.3.2/io-overview/index.html
+++ b/content/docs/en/2.3.2/io-overview/index.html
@@ -108,7 +108,7 @@
 <tr><td><a href="https://debezium.io/">CDC Connector</a></td><td><a href="https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/KafkaConnectSource.java"><code>org.apache.pulsar.io.kafka.connect.KafkaConnectSource</code></a></td><td><a href="/docs/en/2.3.2/io-cdc">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-worker"><span class="arrow-prev">← </span><span>Admin: Pulsar Functions Worker</span></a><a class="docs-next button" href="/docs/en/2.3.2/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.3.2/functions-worker"><span class="arrow-prev">← </span><span>Setup: Pulsar Functions Worker</span></a><a class="docs-next button" href="/docs/en/2.3.2/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/deploy-bare-metal.html b/content/docs/en/2.4.0/deploy-bare-metal.html
index ae0ae39..0b3bac2 100644
--- a/content/docs/en/2.4.0/deploy-bare-metal.html
+++ b/content/docs/en/2.4.0/deploy-bare-metal.html
@@ -291,7 +291,7 @@ need to start zookeeper by using different stats port.</p>
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.4.0/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.4.0/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -400,7 +400,7 @@ Hello Pulsar
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.4.0/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.4.0/deploy-bare-metal/index.html b/content/docs/en/2.4.0/deploy-bare-metal/index.html
index ae0ae39..0b3bac2 100644
--- a/content/docs/en/2.4.0/deploy-bare-metal/index.html
+++ b/content/docs/en/2.4.0/deploy-bare-metal/index.html
@@ -291,7 +291,7 @@ need to start zookeeper by using different stats port.</p>
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/2.4.0/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/2.4.0/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -400,7 +400,7 @@ Hello Pulsar
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/2.4.0/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/2.4.0/functions-api.html b/content/docs/en/2.4.0/functions-api.html
index 23be919..5e3492d 100644
--- a/content/docs/en/2.4.0/functions-api.html
+++ b/content/docs/en/2.4.0/functions-api.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.4.0/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.4.0/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.4.0/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.4.0/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.4.0/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.4.0/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.4.0/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.4.0/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.4.0/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="get-started-1"></a><a href="#get-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>Regardless of which <a href="/docs/en/2.4.0/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/2.4.0/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.4.0/reference-terminology#broker">broker</a> for <a href="/docs/en/2.4.0/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.4.0/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.4.0/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.4.0/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a h [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-func [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-api/index.html b/content/docs/en/2.4.0/functions-api/index.html
index 23be919..5e3492d 100644
--- a/content/docs/en/2.4.0/functions-api/index.html
+++ b/content/docs/en/2.4.0/functions-api/index.html
@@ -108,7 +108,7 @@
 <li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.4.0/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.4.0/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="/docs/en/2.4.0/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/2.4.0/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/2.4.0/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/2.4.0/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/2.4.0/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/2.4.0/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/2.4.0/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="get-started-1"></a><a href="#get-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>Regardless of which <a href="/docs/en/2.4.0/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/2.4.0/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.4.0/reference-terminology#broker">broker</a> for <a href="/docs/en/2.4.0/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/2.4.0/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/2.4.0/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/2.4.0/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a h [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-func [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-debugging.html b/content/docs/en/2.4.0/functions-debugging.html
index 86673fa..dc9b9ca 100644
--- a/content/docs/en/2.4.0/functions-debugging.html
+++ b/content/docs/en/2.4.0/functions-debugging.html
@@ -76,10 +76,10 @@
             });
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-debugging.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">How to debug Pulsar Functions</h1></header><article><div><span><p>You can use the following methods to debug Pulsar Functions:</p>
 <ul>
-<li><a href="/docs/en/2.4.0/functions-debugging#use-unit-test">Use unit test</a></li>
-<li><a href="/docs/en/2.4.0/functions-debugging#debug-with-localrun-mode">Debug with localrun mode</a></li>
-<li><a href="/docs/en/2.4.0/functions-debugging#use-log-topic">Use log topic</a></li>
-<li><a href="/docs/en/2.4.0/functions-debugging#use-functions-cli">Use Functions CLI</a></li>
+<li><a href="functions-debugging.md#use-unit-test">Use unit test</a></li>
+<li><a href="functions-debugging.md#debug-with-localrun-mode">Debug with localrun mode</a></li>
+<li><a href="functions-debugging.md#use-log-topic">Use log topic</a></li>
+<li><a href="functions-debugging.md#use-functions-cli">Use Functions CLI</a></li>
 </ul>
 <h2><a class="anchor" aria-hidden="true" id="use-unit-test"></a><a href="#use-unit-test" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>A Pulsar Function at its core is just a function with inputs and outputs, thus testing a Pulsar Function can be done in a similar way as testing any function.</p>
@@ -436,7 +436,7 @@ ExclamationFunctio3
 Reason: Function in trigger function has unidentified topic
 </code></pre>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-runtime"><span class="arrow-prev">← </span><span>Admin: Configure Functions runtime</span></a><a class="docs-next button" href="/docs/en/2.4.0/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#use-unit-test">Use unit test</a></li><li><a href="#debug-with-localrun-mode">Debug [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-runtime"><span class="arrow-prev">← </span><span>Setup: Configure Functions runtime</span></a><a class="docs-next button" href="/docs/en/2.4.0/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#use-unit-test">Use unit test</a></li><li><a href="#debug-with-localrun-mode">Debug [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-debugging/index.html b/content/docs/en/2.4.0/functions-debugging/index.html
index 86673fa..dc9b9ca 100644
--- a/content/docs/en/2.4.0/functions-debugging/index.html
+++ b/content/docs/en/2.4.0/functions-debugging/index.html
@@ -76,10 +76,10 @@
             });
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-debugging.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">How to debug Pulsar Functions</h1></header><article><div><span><p>You can use the following methods to debug Pulsar Functions:</p>
 <ul>
-<li><a href="/docs/en/2.4.0/functions-debugging#use-unit-test">Use unit test</a></li>
-<li><a href="/docs/en/2.4.0/functions-debugging#debug-with-localrun-mode">Debug with localrun mode</a></li>
-<li><a href="/docs/en/2.4.0/functions-debugging#use-log-topic">Use log topic</a></li>
-<li><a href="/docs/en/2.4.0/functions-debugging#use-functions-cli">Use Functions CLI</a></li>
+<li><a href="functions-debugging.md#use-unit-test">Use unit test</a></li>
+<li><a href="functions-debugging.md#debug-with-localrun-mode">Debug with localrun mode</a></li>
+<li><a href="functions-debugging.md#use-log-topic">Use log topic</a></li>
+<li><a href="functions-debugging.md#use-functions-cli">Use Functions CLI</a></li>
 </ul>
 <h2><a class="anchor" aria-hidden="true" id="use-unit-test"></a><a href="#use-unit-test" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>A Pulsar Function at its core is just a function with inputs and outputs, thus testing a Pulsar Function can be done in a similar way as testing any function.</p>
@@ -436,7 +436,7 @@ ExclamationFunctio3
 Reason: Function in trigger function has unidentified topic
 </code></pre>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-runtime"><span class="arrow-prev">← </span><span>Admin: Configure Functions runtime</span></a><a class="docs-next button" href="/docs/en/2.4.0/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#use-unit-test">Use unit test</a></li><li><a href="#debug-with-localrun-mode">Debug [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-runtime"><span class="arrow-prev">← </span><span>Setup: Configure Functions runtime</span></a><a class="docs-next button" href="/docs/en/2.4.0/io-overview"><span>Overview</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#use-unit-test">Use unit test</a></li><li><a href="#debug-with-localrun-mode">Debug [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-deploying.html b/content/docs/en/2.4.0/functions-deploying.html
index 8b072ae..eea1c38 100644
--- a/content/docs/en/2.4.0/functions-deploying.html
+++ b/content/docs/en/2.4.0/functions-deploying.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.4.0/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.4.0/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.4.0/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.4.0/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.4.0/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.4.0/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.4.0/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.4.0/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.4.0/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.4.0/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface</a><ul clas [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-deploying/index.html b/content/docs/en/2.4.0/functions-deploying/index.html
index 8b072ae..eea1c38 100644
--- a/content/docs/en/2.4.0/functions-deploying/index.html
+++ b/content/docs/en/2.4.0/functions-deploying/index.html
@@ -114,8 +114,8 @@
 <tr><td style="text-align:left">Tenant</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/{namespace}/{topicName}</code>---then the tenant will be <code>marketing</code>.</td></tr>
 <tr><td style="text-align:left">Namespace</td><td style="text-align:left">Derived from the input topics' names. If the input topics are under the <code>asia</code> namespace under the <code>marketing</code> tenant---i.e. the topic names have the form <code>persistent://marketing/asia/{topicName}</code>, then the namespace will be <code>asia</code>.</td></tr>
 <tr><td style="text-align:left">Output topic</td><td style="text-align:left"><code>{input topic}-{function name}-output</code>. A function with an input topic name of <code>incoming</code> and a function name of <code>exclamation</code>, for example, would have an output topic of <code>incoming-exclamation-output</code>.</td></tr>
-<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="/docs/en/2.4.0/functions-guarantees">processing guarantees</a>, the <a href="/docs/en/2.4.0/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.4.0/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
-<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="/docs/en/2.4.0/functions-guarantees"><code>ATLEAST_ONCE</code></a></td></tr>
+<tr><td style="text-align:left">Subscription type</td><td style="text-align:left">For at-least-once and at-most-once <a href="functions-guarantees.md">processing guarantees</a>, the <a href="/docs/en/2.4.0/concepts-messaging#shared"><code>SHARED</code></a> is applied by default; for effectively-once guarantees, <a href="/docs/en/2.4.0/concepts-messaging#failover"><code>FAILOVER</code></a> is applied</td></tr>
+<tr><td style="text-align:left">Processing guarantees</td><td style="text-align:left"><a href="functions-guarantees.md"><code>ATLEAST_ONCE</code></a></td></tr>
 <tr><td style="text-align:left">Pulsar service URL</td><td style="text-align:left"><code>pulsar://localhost:6650</code></td></tr>
 </tbody>
 </table>
@@ -209,12 +209,12 @@
 <blockquote>
 <p>Triggering a function is ultimately no different from invoking a function by producing a message on one of the function's input topics. The <a href="/docs/en/2.4.0/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is essentially a convenient mechanism for sending messages to functions without needing to use the <a href="/docs/en/2.4.0/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>To show an example of function triggering, let's start with a simple <a href="/docs/en/2.4.0/functions-api#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
+<p>To show an example of function triggering, let's start with a simple <a href="functions-api.md#functions-for-python">Python function</a> that returns a simple string based on the input:</p>
 <pre><code class="hljs css language-python"><span class="hljs-comment"># myfunc.py</span>
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"This function has been triggered with a value of {0}"</span>.format(input)
 </code></pre>
-<p>Let's run that function in <a href="/docs/en/2.4.0/functions-deploying#local-run-mode">local run mode</a>:</p>
+<p>Let's run that function in <a href="functions-deploying.md#local-run-mode">local run mode</a>:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -244,7 +244,7 @@ This <span class="hljs-keyword">function</span> <span class="hljs-title">has</sp
 <h4><a class="anchor" aria-hidden="true" id="topic-info-not-required"></a><a href="#topic-info-not-required" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 [...]
 <p>In the <code>trigger</code> command above, you may have noticed that you only need to specify basic information about the function (tenant, namespace, and name). To trigger the function, you didn't need to know the function's input topic(s).</p>
 </blockquote>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-api"><span class="arrow-prev">← </span><span>API</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-guarantees"><span>Processing guarantees</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-api"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-guarantees"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#requirements">Requirements</a></li><li><a href="#command-line-interface">Command-line interface</a><ul clas [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-guarantees.html b/content/docs/en/2.4.0/functions-guarantees.html
index 5a2f762..fd7f2e6 100644
--- a/content/docs/en/2.4.0/functions-guarantees.html
+++ b/content/docs/en/2.4.0/functions-guarantees.html
@@ -106,7 +106,7 @@
   --processing-guarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a func [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a function</a></li><li><a  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-guarantees/index.html b/content/docs/en/2.4.0/functions-guarantees/index.html
index 5a2f762..fd7f2e6 100644
--- a/content/docs/en/2.4.0/functions-guarantees/index.html
+++ b/content/docs/en/2.4.0/functions-guarantees/index.html
@@ -106,7 +106,7 @@
   --processing-guarantees ATMOST_ONCE \
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-deploying"><span class="arrow-prev">← </span><span>Deploying functions</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-state"><span>State Storage</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a func [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-deploying"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-state"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#applying-processing-guarantees-to-a-function">Applying processing guarantees to a function</a></li><li><a  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-metrics.html b/content/docs/en/2.4.0/functions-metrics.html
index a192b53..df674b8 100644
--- a/content/docs/en/2.4.0/functions-metrics.html
+++ b/content/docs/en/2.4.0/functions-metrics.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.4.0/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.4.0/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.4.0/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.4.0/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-worker"><span>Admin: Pulsar Functions Worker</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK< [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-worker"><span>Setup: Pulsar Functions Worker</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></ [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-metrics/index.html b/content/docs/en/2.4.0/functions-metrics/index.html
index a192b53..df674b8 100644
--- a/content/docs/en/2.4.0/functions-metrics/index.html
+++ b/content/docs/en/2.4.0/functions-metrics/index.html
@@ -77,12 +77,12 @@
         </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-metrics.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Metrics for Pulsar Functions</h1></header><article><div><span><p>Pulsar Functions can publish arbitrary metrics to the metrics interface which can then be  [...]
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="metrics-and-stats-not-available-through-language-native-interfaces"></a><a href="#metrics-and-stats-not-available-through-language-native-interfaces" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98  [...]
-<p>If a Pulsar Function uses the language-native interface for <a href="/docs/en/2.4.0/functions-api#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
+<p>If a Pulsar Function uses the language-native interface for <a href="functions-api.md#java-native-functions">Java</a> or <a href="#python-native-functions">Python</a>, that function will not be able to publish metrics and stats to Pulsar.</p>
 </blockquote>
 <h2><a class="anchor" aria-hidden="true" id="accessing-metrics"></a><a href="#accessing-metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2- [...]
 <p>For a guide to accessing metrics created by Pulsar Functions, see the guide to <a href="/docs/en/2.4.0/deploy-monitoring">Monitoring</a> in Pulsar.</p>
 <h2><a class="anchor" aria-hidden="true" id="java-sdk"></a><a href="#java-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>If you're creating a Pulsar Function using the <a href="/docs/en/2.4.0/functions-api#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+<p>If you're creating a Pulsar Function using the <a href="functions-api.md#java-sdk-functions">Java SDK</a>, the <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object has a <code>recordMetric</code> method that you can use to register both a name for the metric and a value. Here's the signature for that method:</p>
 <pre><code class="hljs css language-java"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">recordMetric</span><span class="hljs-params">(String metricName, <span class="hljs-keyword">double</span> value)</span></span>;
 </code></pre>
@@ -100,8 +100,8 @@
 </code></pre>
 <p>This function counts the length of each incoming message (of type <code>String</code>) and then registers that under the <code>number-of-characters</code> metric.</p>
 <h2><a class="anchor" aria-hidden="true" id="python-sdk"></a><a href="#python-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>Documentation for the <a href="/docs/en/2.4.0/functions-api#python-sdk-functions">Python SDK</a> is coming soon.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-state"><span class="arrow-prev">← </span><span>State Storage</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-worker"><span>Admin: Pulsar Functions Worker</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK< [...]
+<p>Documentation for the <a href="functions-api.md#python-sdk-functions">Python SDK</a> is coming soon.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-state"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-worker"><span>Setup: Pulsar Functions Worker</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#accessing-metrics">Accessing metrics</a></li><li><a href="#java-sdk">Java SDK</a></ [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-overview.html b/content/docs/en/2.4.0/functions-overview.html
index 510120b..bfbb00f 100644
--- a/content/docs/en/2.4.0/functions-overview.html
+++ b/content/docs/en/2.4.0/functions-overview.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic.</li>
 </ul>
-<p>The following is an example of a Pulsar Function written in Java (using the <a href="/docs/en/2.4.0/functions-api#java-native-functions">native interface</a>).</p>
+<p>The following is an example of a Pulsar Function written in Java (using the <a href="functions-api.md#java-native-functions">native interface</a>).</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>The following is an example of a Pulsar Function written in Python (using the <a href="/docs/en/2.4.0/functions-api#python-native-functions">native interface</a>).</p>
+<p>The following is an example of a Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>).</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -143,7 +143,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you implement the classic word count example using Pulsar Functions, it looks something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>To write the function in <a href="/docs/en/2.4.0/functions-api#functions-for-java">Java</a> with <a href="/docs/en/2.4.0/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you can write the function as follows.</p>
+<p>To write the function in <a href="functions-api.md#functions-for-java">Java</a> with <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you can write the function as follows.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -236,7 +236,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 </code></pre>
 <p>You can specify some function attributes via CLI arguments or in a configuration file in YAML format.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Currently, you can write Pulsar Functions in <a href="/docs/en/2.4.0/functions-api#functions-for-java">Java</a>, <a href="/docs/en/2.4.0/functions-api#functions-for-python">Python</a>, and <a href="/docs/en/2.4.0/functions-api#functions-for-go">Go</a>. Support for additional languages is coming soon.</p>
+<p>Currently, you can write Pulsar Functions in <a href="functions-api.md#functions-for-java">Java</a>, <a href="functions-api.md#functions-for-python">Python</a>, and <a href="functions-api.md#functions-for-go">Go</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="pulsar-functions-api"></a><a href="#pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
 <p>Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -264,7 +264,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 <p>&quot;Native&quot; functions are supported in Java and Python, which means a Pulsar Function can have no dependencies.</p>
 <p>The benefit of native functions is that they do not have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they do not provide access to the function <a href="#function-context">context</a>, which is necessary for a variety of functionalities, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="pulsar-functions-sdk"></a><a href="#pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
-<p>To enable a Pulsar Function to access to a <a href="#function-context">context object</a>, you can use <strong>Pulsar Functions SDK</strong>, available for <a href="/docs/en/2.4.0/functions-api#functions-for-java">Java</a>, <a href="/docs/en/2.4.0/functions-api#functions-for-python">Python</a>, and <a href="/docs/en/2.4.0/functions-api#functions-for-go">Go</a>.</p>
+<p>To enable a Pulsar Function to access to a <a href="#function-context">context object</a>, you can use <strong>Pulsar Functions SDK</strong>, available for <a href="functions-api.md#functions-for-java">Java</a>, <a href="functions-api.md#functions-for-python">Python</a>, and <a href="functions-api.md#functions-for-go">Go</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>The following is a Java function example that uses information about its context.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -383,7 +383,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.4.0/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function configuration. The function created using the following command produces all logs on the <code>persistent://public/default/my-func-1-log</code> topic.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -391,7 +391,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   --<span class="hljs-built_in">log</span>-topic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>The following is an example of <a href="/docs/en/2.4.0/functions-api#java-logging">Java function</a> that logs at different log levels based on the function input.</p>
+<p>The following is an example of <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function input.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -404,7 +404,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
     }
 }
 </code></pre>
-<p>The following is an example of <a href="/docs/en/2.4.0/functions-api#go-logging">Go function</a> that logs at different log levels based on the function input.</p>
+<p>The following is an example of <a href="functions-api.md#go-logging">Go function</a> that logs at different log levels based on the function input.</p>
 <pre><code class="hljs">import (
     <span class="hljs-string">"context"</span>
 
@@ -444,12 +444,12 @@ func main<span class="hljs-literal">()</span> {
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="trigger-pulsar-functions"></a><a href="#trigger-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>You can <a href="/docs/en/2.4.0/functions-deploying#triggering-pulsar-functions">trigger</a> a Pulsar Function running in the <a href="#cluster-mode">cluster mode</a> with the <a href="#command-line-interface">command line</a>. When triggering a Pulsar Function, you can pass a specific value to the Function and get the return value <em>without</em> creating a client. Triggering is useful for, but not limited to, testing and debugging purposes.</p>
+<p>You can <a href="functions-deploying.md#triggering-pulsar-functions">trigger</a> a Pulsar Function running in the <a href="#cluster-mode">cluster mode</a> with the <a href="#command-line-interface">command line</a>. When triggering a Pulsar Function, you can pass a specific value to the Function and get the return value <em>without</em> creating a client. Triggering is useful for, but not limited to, testing and debugging purposes.</p>
 <blockquote>
 <p>Note<br>
 Triggering a function is no different from invoking a function by producing a message on one of the function input topics. The <a href="/docs/en/2.4.0/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is a convenient mechanism for sending messages to functions without using the <a href="/docs/en/2.4.0/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>The following is an example of Pulsar Functions written in Python (using the <a href="/docs/en/2.4.0/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs.</p>
+<p>The following is an example of Pulsar Functions written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs.</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -484,10 +484,10 @@ Instead of passing a string via the CLI, you can trigger Pulsar Functions with t
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.4.0/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. Pulsar installation, including the local standalone installation, includes deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#progr [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#programming- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-overview/index.html b/content/docs/en/2.4.0/functions-overview/index.html
index 510120b..bfbb00f 100644
--- a/content/docs/en/2.4.0/functions-overview/index.html
+++ b/content/docs/en/2.4.0/functions-overview/index.html
@@ -80,7 +80,7 @@
 <li>apply a user-supplied processing logic to each message,</li>
 <li>publish the results of the computation to another topic.</li>
 </ul>
-<p>The following is an example of a Pulsar Function written in Java (using the <a href="/docs/en/2.4.0/functions-api#java-native-functions">native interface</a>).</p>
+<p>The following is an example of a Pulsar Function written in Java (using the <a href="functions-api.md#java-native-functions">native interface</a>).</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
@@ -88,7 +88,7 @@
     <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{ <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input); }
 }
 </code></pre>
-<p>The following is an example of a Pulsar Function written in Python (using the <a href="/docs/en/2.4.0/functions-api#python-native-functions">native interface</a>).</p>
+<p>The following is an example of a Pulsar Function written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>).</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> <span class="hljs-string">"{0}!"</span>.format(input)
 </code></pre>
@@ -143,7 +143,7 @@
 <h3><a class="anchor" aria-hidden="true" id="word-count-example"></a><a href="#word-count-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>If you implement the classic word count example using Pulsar Functions, it looks something like this:</p>
 <p><img src="/docs/assets/pulsar-functions-word-count.png" alt="Pulsar Functions word count example"></p>
-<p>To write the function in <a href="/docs/en/2.4.0/functions-api#functions-for-java">Java</a> with <a href="/docs/en/2.4.0/functions-api#java-sdk-functions">Pulsar Functions SDK for Java</a>, you can write the function as follows.</p>
+<p>To write the function in <a href="functions-api.md#functions-for-java">Java</a> with <a href="functions-api.md#java-sdk-functions">Pulsar Functions SDK for Java</a>, you can write the function as follows.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">package</span> org.example.functions;
 
 <span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -236,7 +236,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 </code></pre>
 <p>You can specify some function attributes via CLI arguments or in a configuration file in YAML format.</p>
 <h2><a class="anchor" aria-hidden="true" id="supported-languages"></a><a href="#supported-languages" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.2 [...]
-<p>Currently, you can write Pulsar Functions in <a href="/docs/en/2.4.0/functions-api#functions-for-java">Java</a>, <a href="/docs/en/2.4.0/functions-api#functions-for-python">Python</a>, and <a href="/docs/en/2.4.0/functions-api#functions-for-go">Go</a>. Support for additional languages is coming soon.</p>
+<p>Currently, you can write Pulsar Functions in <a href="functions-api.md#functions-for-java">Java</a>, <a href="functions-api.md#functions-for-python">Python</a>, and <a href="functions-api.md#functions-for-go">Go</a>. Support for additional languages is coming soon.</p>
 <h2><a class="anchor" aria-hidden="true" id="pulsar-functions-api"></a><a href="#pulsar-functions-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
 <p>Pulsar Functions API enables you to create processing logic that is:</p>
 <ul>
@@ -264,7 +264,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
 <p>&quot;Native&quot; functions are supported in Java and Python, which means a Pulsar Function can have no dependencies.</p>
 <p>The benefit of native functions is that they do not have any dependencies beyond what's already available in Java/Python &quot;out of the box.&quot; The downside is that they do not provide access to the function <a href="#function-context">context</a>, which is necessary for a variety of functionalities, including <a href="#logging">logging</a>, <a href="#user-configuration">user configuration</a>, and more.</p>
 <h2><a class="anchor" aria-hidden="true" id="pulsar-functions-sdk"></a><a href="#pulsar-functions-sdk" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1 [...]
-<p>To enable a Pulsar Function to access to a <a href="#function-context">context object</a>, you can use <strong>Pulsar Functions SDK</strong>, available for <a href="/docs/en/2.4.0/functions-api#functions-for-java">Java</a>, <a href="/docs/en/2.4.0/functions-api#functions-for-python">Python</a>, and <a href="/docs/en/2.4.0/functions-api#functions-for-go">Go</a>.</p>
+<p>To enable a Pulsar Function to access to a <a href="#function-context">context object</a>, you can use <strong>Pulsar Functions SDK</strong>, available for <a href="functions-api.md#functions-for-java">Java</a>, <a href="functions-api.md#functions-for-python">Python</a>, and <a href="functions-api.md#functions-for-go">Go</a>.</p>
 <h3><a class="anchor" aria-hidden="true" id="java"></a><a href="#java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
 <p>The following is a Java function example that uses information about its context.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> org.apache.pulsar.functions.api.Context;
@@ -383,7 +383,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   --ram 8589934592 \
   --disk 10737418240
 </code></pre>
-<p>For more information on resources, see the <a href="/docs/en/2.4.0/functions-deploying#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
+<p>For more information on resources, see the <a href="functions-deploying.md#resources">Deploying and Managing Pulsar Functions</a> documentation.</p>
 <h3><a class="anchor" aria-hidden="true" id="logging"></a><a href="#logging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
 <p>Pulsar Functions created using <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can send logs to a log topic that you specify as part of the function configuration. The function created using the following command produces all logs on the <code>persistent://public/default/my-func-1-log</code> topic.</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
@@ -391,7 +391,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
   --<span class="hljs-built_in">log</span>-topic persistent://public/default/my-func-1-log \
   <span class="hljs-comment"># Other configs</span>
 </code></pre>
-<p>The following is an example of <a href="/docs/en/2.4.0/functions-api#java-logging">Java function</a> that logs at different log levels based on the function input.</p>
+<p>The following is an example of <a href="functions-api.md#java-logging">Java function</a> that logs at different log levels based on the function input.</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">LoggerFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">Void</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
     <span class="hljs-function"><span class="hljs-keyword">public</span> Void <span class="hljs-title">process</span><span class="hljs-params">(String input, Context context)</span> </span>{
@@ -404,7 +404,7 @@ Then <a href="#cluster-run-mode">deploy it</a> in your Pulsar cluster using the
     }
 }
 </code></pre>
-<p>The following is an example of <a href="/docs/en/2.4.0/functions-api#go-logging">Go function</a> that logs at different log levels based on the function input.</p>
+<p>The following is an example of <a href="functions-api.md#go-logging">Go function</a> that logs at different log levels based on the function input.</p>
 <pre><code class="hljs">import (
     <span class="hljs-string">"context"</span>
 
@@ -444,12 +444,12 @@ func main<span class="hljs-literal">()</span> {
 }
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="trigger-pulsar-functions"></a><a href="#trigger-pulsar-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-. [...]
-<p>You can <a href="/docs/en/2.4.0/functions-deploying#triggering-pulsar-functions">trigger</a> a Pulsar Function running in the <a href="#cluster-mode">cluster mode</a> with the <a href="#command-line-interface">command line</a>. When triggering a Pulsar Function, you can pass a specific value to the Function and get the return value <em>without</em> creating a client. Triggering is useful for, but not limited to, testing and debugging purposes.</p>
+<p>You can <a href="functions-deploying.md#triggering-pulsar-functions">trigger</a> a Pulsar Function running in the <a href="#cluster-mode">cluster mode</a> with the <a href="#command-line-interface">command line</a>. When triggering a Pulsar Function, you can pass a specific value to the Function and get the return value <em>without</em> creating a client. Triggering is useful for, but not limited to, testing and debugging purposes.</p>
 <blockquote>
 <p>Note<br>
 Triggering a function is no different from invoking a function by producing a message on one of the function input topics. The <a href="/docs/en/2.4.0/pulsar-admin#trigger"><code>pulsar-admin functions trigger</code></a> command is a convenient mechanism for sending messages to functions without using the <a href="/docs/en/2.4.0/reference-cli-tools#pulsar-client"><code>pulsar-client</code></a> tool or a language-specific client library.</p>
 </blockquote>
-<p>The following is an example of Pulsar Functions written in Python (using the <a href="/docs/en/2.4.0/functions-api#python-native-functions">native interface</a>) that simply reverses string inputs.</p>
+<p>The following is an example of Pulsar Functions written in Python (using the <a href="functions-api.md#python-native-functions">native interface</a>) that simply reverses string inputs.</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> input[::<span class="hljs-number">-1</span>]
 </code></pre>
@@ -484,10 +484,10 @@ Instead of passing a string via the CLI, you can trigger Pulsar Functions with t
   <span class="hljs-comment"># Other function configs</span>
 </code></pre>
 <h2><a class="anchor" aria-hidden="true" id="metrics"></a><a href="#metrics" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
-<p>Pulsar Functions that use <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="/docs/en/2.4.0/functions-metrics">Metrics for Pulsar Functions</a>.</p>
+<p>Pulsar Functions that use <a href="#the-pulsar-functions-sdk">Pulsar Functions SDK</a> can publish metrics to Pulsar. For more information, see <a href="functions-metrics.md">Metrics for Pulsar Functions</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="state-storage"></a><a href="#state-storage" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
 <p>Pulsar Functions use <a href="https://bookkeeper.apache.org">Apache BookKeeper</a> as a state storage interface. Pulsar installation, including the local standalone installation, includes deployment of BookKeeper bookies.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#progr [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/concepts-schema-registry"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-quickstart"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#goals">Goals</a></li><li><a href="#inspirations">Inspirations</a></li><li><a href="#programming- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-quickstart.html b/content/docs/en/2.4.0/functions-quickstart.html
index c753763..1ac7fd2 100644
--- a/content/docs/en/2.4.0/functions-quickstart.html
+++ b/content/docs/en/2.4.0/functions-quickstart.html
@@ -223,7 +223,7 @@ $ bin/pulsar standalone \
 </code></pre>
 <p>When you see <code>Deleted successfully</code> in the output, you've successfully run, updated, and shut down functions running in cluster mode.</p>
 <h2><a class="anchor" aria-hidden="true" id="write-and-run-a-new-function"></a><a href="#write-and-run-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 [...]
-<p>In order to write and run <a href="/docs/en/2.4.0/functions-api#functions-for-python">Python</a> functions, you need to install some dependencies.</p>
+<p>In order to write and run <a href="functions-api.md#functions-for-python">Python</a> functions, you need to install some dependencies.</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <p>In the examples above, you run and manage pre-written Pulsar Functions and learn how they work. You can also write your own functions with Python API. In the following example, the function takes a string as input, reverses the string, and publishes the reversed string to the specified topic.</p>
@@ -353,7 +353,7 @@ drwxr-xr-x   <span class="hljs-number">3</span> a.ahmed  staff   <span class="hl
 zip -r exclamation.zip exclamation
 </code></pre>
 <p>After package all the required dependencies into the <strong>exclamation.zip</strong> file, you can deploy functions in a Pulsar worker. The Pulsar worker does not need internet connectivity to download packages, because they are all included in the ZIP file.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cl [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar c [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-quickstart/index.html b/content/docs/en/2.4.0/functions-quickstart/index.html
index c753763..1ac7fd2 100644
--- a/content/docs/en/2.4.0/functions-quickstart/index.html
+++ b/content/docs/en/2.4.0/functions-quickstart/index.html
@@ -223,7 +223,7 @@ $ bin/pulsar standalone \
 </code></pre>
 <p>When you see <code>Deleted successfully</code> in the output, you've successfully run, updated, and shut down functions running in cluster mode.</p>
 <h2><a class="anchor" aria-hidden="true" id="write-and-run-a-new-function"></a><a href="#write-and-run-a-new-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 [...]
-<p>In order to write and run <a href="/docs/en/2.4.0/functions-api#functions-for-python">Python</a> functions, you need to install some dependencies.</p>
+<p>In order to write and run <a href="functions-api.md#functions-for-python">Python</a> functions, you need to install some dependencies.</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <p>In the examples above, you run and manage pre-written Pulsar Functions and learn how they work. You can also write your own functions with Python API. In the following example, the function takes a string as input, reverses the string, and publishes the reversed string to the specified topic.</p>
@@ -353,7 +353,7 @@ drwxr-xr-x   <span class="hljs-number">3</span> a.ahmed  staff   <span class="hl
 zip -r exclamation.zip exclamation
 </code></pre>
 <p>After package all the required dependencies into the <strong>exclamation.zip</strong> file, you can deploy functions in a Pulsar worker. The Pulsar worker does not need internet connectivity to download packages, because they are all included in the ZIP file.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-api"><span>API</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar cl [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-overview"><span class="arrow-prev">← </span><span>Overview</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-api"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#prerequisites">Prerequisites</a></li><li><a href="#run-a-standalone-pulsar-cluster">Run a standalone Pulsar c [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-runtime.html b/content/docs/en/2.4.0/functions-runtime.html
index a624179..fd9656a 100644
--- a/content/docs/en/2.4.0/functions-runtime.html
+++ b/content/docs/en/2.4.0/functions-runtime.html
@@ -189,7 +189,7 @@ io.kubernetes.client.ApiException: Forbidden
 <span class="hljs-attr">- kind:</span> <span class="hljs-string">ServiceAccount</span>
 <span class="hljs-attr">  name:</span> <span class="hljs-string">functions-worker</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-worker"><span class="arrow-prev">← </span><span>Admin: Pulsar Functions Worker</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-debugging"><span>Debugging</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#configure-thread-runtime">Configure thread runtime</a></li><li><a href="#confi [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-worker"><span class="arrow-prev">← </span><span>Setup: Pulsar Functions Worker</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-debugging"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#configure-thread-runtime">Configure thread runtime</a></li><li><a href="#configure- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-runtime/index.html b/content/docs/en/2.4.0/functions-runtime/index.html
index a624179..fd9656a 100644
--- a/content/docs/en/2.4.0/functions-runtime/index.html
+++ b/content/docs/en/2.4.0/functions-runtime/index.html
@@ -189,7 +189,7 @@ io.kubernetes.client.ApiException: Forbidden
 <span class="hljs-attr">- kind:</span> <span class="hljs-string">ServiceAccount</span>
 <span class="hljs-attr">  name:</span> <span class="hljs-string">functions-worker</span>
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-worker"><span class="arrow-prev">← </span><span>Admin: Pulsar Functions Worker</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-debugging"><span>Debugging</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#configure-thread-runtime">Configure thread runtime</a></li><li><a href="#confi [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-worker"><span class="arrow-prev">← </span><span>Setup: Pulsar Functions Worker</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-debugging"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#configure-thread-runtime">Configure thread runtime</a></li><li><a href="#configure- [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-state.html b/content/docs/en/2.4.0/functions-state.html
index 88e5dc4..a399a98 100644
--- a/content/docs/en/2.4.0/functions-state.html
+++ b/content/docs/en/2.4.0/functions-state.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.4.0/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.4.0/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.4.0/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.4.0/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a hr [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a href="#python-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-state/index.html b/content/docs/en/2.4.0/functions-state/index.html
index 88e5dc4..a399a98 100644
--- a/content/docs/en/2.4.0/functions-state/index.html
+++ b/content/docs/en/2.4.0/functions-state/index.html
@@ -78,8 +78,8 @@
 for storing the <code>State</code> for functions. For example, A <code>WordCount</code> function can store its <code>counters</code> state into BookKeeper's table service via Pulsar Functions <a href="#api">State API</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="api"></a><a href="#api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
 <h3><a class="anchor" aria-hidden="true" id="java-api"></a><a href="#java-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
-<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="/docs/en/2.4.0/functions-api#context">Context</a> object when
-you are using <a href="/docs/en/2.4.0/functions-api#java-sdk-functions">Java SDK</a> functions.</p>
+<p>Currently Pulsar Functions expose following APIs for mutating and accessing State. These APIs are avaible in the <a href="functions-api.md#context">Context</a> object when
+you are using <a href="functions-api.md#java-sdk-functions">Java SDK</a> functions.</p>
 <h4><a class="anchor" aria-hidden="true" id="incrcounter"></a><a href="#incrcounter" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <pre><code class="hljs css language-java">    <span class="hljs-comment">/**
      * Increment the builtin distributed counter refered by key
@@ -120,7 +120,7 @@ general key/value state.</p>
     ByteBuffer getState(String key);
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="python-api"></a><a href="#python-api" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1 [...]
-<p>State currently is not supported at <a href="/docs/en/2.4.0/functions-api#python-sdk-functions">Python SDK</a>.</p>
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
 <h2><a class="anchor" aria-hidden="true" id="query-state"></a><a href="#query-state" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
 <p>A Pulsar Function can use the <a href="#api">State API</a> for storing state into Pulsar's state storage
 and retrieving state back from Pulsar's state storage. Additionally Pulsar also provides
@@ -153,8 +153,8 @@ demonstrating on how Application can easily store <code>state</code> in Pulsar F
 <li>For each <code>word</code>, the function increments the corresponding <code>counter</code> by 1 (via <code>incrCounter(key, amount)</code>).</li>
 </ol>
 <h3><a class="anchor" aria-hidden="true" id="python-example"></a><a href="#python-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
-<p>State currently is not supported at <a href="/docs/en/2.4.0/functions-api#python-sdk-functions">Python SDK</a>.</p>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-guarantees"><span class="arrow-prev">← </span><span>Processing guarantees</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-metrics"><span>Metrics</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a hr [...]
+<p>State currently is not supported at <a href="functions-api.md#python-sdk-functions">Python SDK</a>.</p>
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-guarantees"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-metrics"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#api">API</a><ul class="toc-headings"><li><a href="#java-api">Java API</a></li><li><a href="#python-api" [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-worker.html b/content/docs/en/2.4.0/functions-worker.html
index 60a5a30..fc63462 100644
--- a/content/docs/en/2.4.0/functions-worker.html
+++ b/content/docs/en/2.4.0/functions-worker.html
@@ -252,7 +252,7 @@ start proxies.</p>
 <ol start="3">
 <li>Set the correct cluster name in <code>pulsarFunctionsCluster</code> in the <code>conf/functions_worker.yml</code> file.</li>
 </ol>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-runtime"><span>Admin: Configure Functions runtime</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#run-functions-worker-with-brokers">Run Functions-worker with brokers</a><ul c [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-runtime"><span>Setup: Configure Functions runtime</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#run-functions-worker-with-brokers">Run Functions-worker with brokers</a><ul  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/functions-worker/index.html b/content/docs/en/2.4.0/functions-worker/index.html
index 60a5a30..fc63462 100644
--- a/content/docs/en/2.4.0/functions-worker/index.html
+++ b/content/docs/en/2.4.0/functions-worker/index.html
@@ -252,7 +252,7 @@ start proxies.</p>
 <ol start="3">
 <li>Set the correct cluster name in <code>pulsarFunctionsCluster</code> in the <code>conf/functions_worker.yml</code> file.</li>
 </ol>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-metrics"><span class="arrow-prev">← </span><span>Metrics</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-runtime"><span>Admin: Configure Functions runtime</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#run-functions-worker-with-brokers">Run Functions-worker with brokers</a><ul c [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-metrics"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/functions-runtime"><span>Setup: Configure Functions runtime</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#run-functions-worker-with-brokers">Run Functions-worker with brokers</a><ul  [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/io-overview.html b/content/docs/en/2.4.0/io-overview.html
index ac55a6f..81912d8 100644
--- a/content/docs/en/2.4.0/io-overview.html
+++ b/content/docs/en/2.4.0/io-overview.html
@@ -108,7 +108,7 @@
 <tr><td><a href="https://debezium.io/">CDC Connector</a></td><td><a href="https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/KafkaConnectSource.java"><code>org.apache.pulsar.io.kafka.connect.KafkaConnectSource</code></a></td><td><a href="/docs/en/2.4.0/io-cdc">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-debugging"><span class="arrow-prev">← </span><span>Debugging</span></a><a class="docs-next button" href="/docs/en/2.4.0/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with con [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-debugging"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with conn [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/2.4.0/io-overview/index.html b/content/docs/en/2.4.0/io-overview/index.html
index ac55a6f..81912d8 100644
--- a/content/docs/en/2.4.0/io-overview/index.html
+++ b/content/docs/en/2.4.0/io-overview/index.html
@@ -108,7 +108,7 @@
 <tr><td><a href="https://debezium.io/">CDC Connector</a></td><td><a href="https://github.com/apache/pulsar/blob/master/pulsar-io/kafka-connect-adaptor/src/main/java/org/apache/pulsar/io/kafka/connect/KafkaConnectSource.java"><code>org.apache.pulsar.io.kafka.connect.KafkaConnectSource</code></a></td><td><a href="/docs/en/2.4.0/io-cdc">Documentation</a></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-debugging"><span class="arrow-prev">← </span><span>Debugging</span></a><a class="docs-next button" href="/docs/en/2.4.0/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with con [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/2.4.0/functions-debugging"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/2.4.0/io-quickstart"><span>Get started</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#sources-and-sinks">Sources and sinks</a></li><li><a href="#working-with-connectors">Working with conn [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/adaptors-kafka.html b/content/docs/en/adaptors-kafka.html
index 4ecf2aa..f9d0965 100644
--- a/content/docs/en/adaptors-kafka.html
+++ b/content/docs/en/adaptors-kafka.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/adaptors-kafka/index.html b/content/docs/en/adaptors-kafka/index.html
index 4ecf2aa..f9d0965 100644
--- a/content/docs/en/adaptors-kafka/index.html
+++ b/content/docs/en/adaptors-kafka/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/adaptors-spark.html b/content/docs/en/adaptors-spark.html
index f9d83b5..f07659d 100644
--- a/content/docs/en/adaptors-spark.html
+++ b/content/docs/en/adaptors-spark.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/adaptors-spark/index.html b/content/docs/en/adaptors-spark/index.html
index f9d83b5..f07659d 100644
--- a/content/docs/en/adaptors-spark/index.html
+++ b/content/docs/en/adaptors-spark/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/adaptors-storm.html b/content/docs/en/adaptors-storm.html
index 886effb..02666db 100644
--- a/content/docs/en/adaptors-storm.html
+++ b/content/docs/en/adaptors-storm.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/adaptors-storm/index.html b/content/docs/en/adaptors-storm/index.html
index 886effb..02666db 100644
--- a/content/docs/en/adaptors-storm/index.html
+++ b/content/docs/en/adaptors-storm/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-brokers.html b/content/docs/en/admin-api-brokers.html
index e2b6e98..ddd36e9 100644
--- a/content/docs/en/admin-api-brokers.html
+++ b/content/docs/en/admin-api-brokers.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-brokers/index.html b/content/docs/en/admin-api-brokers/index.html
index e2b6e98..ddd36e9 100644
--- a/content/docs/en/admin-api-brokers/index.html
+++ b/content/docs/en/admin-api-brokers/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-clusters.html b/content/docs/en/admin-api-clusters.html
index 708234b..291d8b0 100644
--- a/content/docs/en/admin-api-clusters.html
+++ b/content/docs/en/admin-api-clusters.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-clusters/index.html b/content/docs/en/admin-api-clusters/index.html
index 708234b..291d8b0 100644
--- a/content/docs/en/admin-api-clusters/index.html
+++ b/content/docs/en/admin-api-clusters/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-namespaces.html b/content/docs/en/admin-api-namespaces.html
index f92dd6b..91fcac6 100644
--- a/content/docs/en/admin-api-namespaces.html
+++ b/content/docs/en/admin-api-namespaces.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-namespaces/index.html b/content/docs/en/admin-api-namespaces/index.html
index f92dd6b..91fcac6 100644
--- a/content/docs/en/admin-api-namespaces/index.html
+++ b/content/docs/en/admin-api-namespaces/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-non-persistent-topics.html b/content/docs/en/admin-api-non-persistent-topics.html
index 99aee82..d497301 100644
--- a/content/docs/en/admin-api-non-persistent-topics.html
+++ b/content/docs/en/admin-api-non-persistent-topics.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-non-persistent-topics/index.html b/content/docs/en/admin-api-non-persistent-topics/index.html
index 99aee82..d497301 100644
--- a/content/docs/en/admin-api-non-persistent-topics/index.html
+++ b/content/docs/en/admin-api-non-persistent-topics/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-overview.html b/content/docs/en/admin-api-overview.html
index 06fe911..fdd7ae1 100644
--- a/content/docs/en/admin-api-overview.html
+++ b/content/docs/en/admin-api-overview.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-overview/index.html b/content/docs/en/admin-api-overview/index.html
index 06fe911..fdd7ae1 100644
--- a/content/docs/en/admin-api-overview/index.html
+++ b/content/docs/en/admin-api-overview/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-partitioned-topics.html b/content/docs/en/admin-api-partitioned-topics.html
index 8612224..048a526 100644
--- a/content/docs/en/admin-api-partitioned-topics.html
+++ b/content/docs/en/admin-api-partitioned-topics.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-partitioned-topics/index.html b/content/docs/en/admin-api-partitioned-topics/index.html
index 8612224..048a526 100644
--- a/content/docs/en/admin-api-partitioned-topics/index.html
+++ b/content/docs/en/admin-api-partitioned-topics/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-permissions.html b/content/docs/en/admin-api-permissions.html
index bf16605..ca05b45 100644
--- a/content/docs/en/admin-api-permissions.html
+++ b/content/docs/en/admin-api-permissions.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-permissions/index.html b/content/docs/en/admin-api-permissions/index.html
index bf16605..ca05b45 100644
--- a/content/docs/en/admin-api-permissions/index.html
+++ b/content/docs/en/admin-api-permissions/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-persistent-topics.html b/content/docs/en/admin-api-persistent-topics.html
index 4cf30af..75df66a 100644
--- a/content/docs/en/admin-api-persistent-topics.html
+++ b/content/docs/en/admin-api-persistent-topics.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-persistent-topics/index.html b/content/docs/en/admin-api-persistent-topics/index.html
index 4cf30af..75df66a 100644
--- a/content/docs/en/admin-api-persistent-topics/index.html
+++ b/content/docs/en/admin-api-persistent-topics/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-schemas.html b/content/docs/en/admin-api-schemas.html
index bb84841..135743e 100644
--- a/content/docs/en/admin-api-schemas.html
+++ b/content/docs/en/admin-api-schemas.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-schemas/index.html b/content/docs/en/admin-api-schemas/index.html
index bb84841..135743e 100644
--- a/content/docs/en/admin-api-schemas/index.html
+++ b/content/docs/en/admin-api-schemas/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-tenants.html b/content/docs/en/admin-api-tenants.html
index a664fb3..afd348a 100644
--- a/content/docs/en/admin-api-tenants.html
+++ b/content/docs/en/admin-api-tenants.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/admin-api-tenants/index.html b/content/docs/en/admin-api-tenants/index.html
index a664fb3..afd348a 100644
--- a/content/docs/en/admin-api-tenants/index.html
+++ b/content/docs/en/admin-api-tenants/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-dashboard.html b/content/docs/en/administration-dashboard.html
index c5a0b6b..afdf079 100644
--- a/content/docs/en/administration-dashboard.html
+++ b/content/docs/en/administration-dashboard.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-dashboard/index.html b/content/docs/en/administration-dashboard/index.html
index c5a0b6b..afdf079 100644
--- a/content/docs/en/administration-dashboard/index.html
+++ b/content/docs/en/administration-dashboard/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-geo.html b/content/docs/en/administration-geo.html
index 8262ffb..0a23c6f 100644
--- a/content/docs/en/administration-geo.html
+++ b/content/docs/en/administration-geo.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-geo/index.html b/content/docs/en/administration-geo/index.html
index 8262ffb..0a23c6f 100644
--- a/content/docs/en/administration-geo/index.html
+++ b/content/docs/en/administration-geo/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-load-balance.html b/content/docs/en/administration-load-balance.html
index 4ffd514..3eaf463 100644
--- a/content/docs/en/administration-load-balance.html
+++ b/content/docs/en/administration-load-balance.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-load-balance/index.html b/content/docs/en/administration-load-balance/index.html
index 4ffd514..3eaf463 100644
--- a/content/docs/en/administration-load-balance/index.html
+++ b/content/docs/en/administration-load-balance/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-proxy.html b/content/docs/en/administration-proxy.html
index ba6e2d6..3767b4e 100644
--- a/content/docs/en/administration-proxy.html
+++ b/content/docs/en/administration-proxy.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-proxy/index.html b/content/docs/en/administration-proxy/index.html
index ba6e2d6..3767b4e 100644
--- a/content/docs/en/administration-proxy/index.html
+++ b/content/docs/en/administration-proxy/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-stats.html b/content/docs/en/administration-stats.html
index f306ced..fad2c10 100644
--- a/content/docs/en/administration-stats.html
+++ b/content/docs/en/administration-stats.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-stats/index.html b/content/docs/en/administration-stats/index.html
index f306ced..fad2c10 100644
--- a/content/docs/en/administration-stats/index.html
+++ b/content/docs/en/administration-stats/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-upgrade.html b/content/docs/en/administration-upgrade.html
index 2a10abd..99bdcca 100644
--- a/content/docs/en/administration-upgrade.html
+++ b/content/docs/en/administration-upgrade.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-upgrade/index.html b/content/docs/en/administration-upgrade/index.html
index 2a10abd..99bdcca 100644
--- a/content/docs/en/administration-upgrade/index.html
+++ b/content/docs/en/administration-upgrade/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-zk-bk.html b/content/docs/en/administration-zk-bk.html
index 3165c4b..7e9d23e 100644
--- a/content/docs/en/administration-zk-bk.html
+++ b/content/docs/en/administration-zk-bk.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/administration-zk-bk/index.html b/content/docs/en/administration-zk-bk/index.html
index 3165c4b..7e9d23e 100644
--- a/content/docs/en/administration-zk-bk/index.html
+++ b/content/docs/en/administration-zk-bk/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/client-libraries-cpp.html b/content/docs/en/client-libraries-cpp.html
index 31dfe4b..3a4e380 100644
--- a/content/docs/en/client-libraries-cpp.html
+++ b/content/docs/en/client-libraries-cpp.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/client-libraries-cpp/index.html b/content/docs/en/client-libraries-cpp/index.html
index 31dfe4b..3a4e380 100644
--- a/content/docs/en/client-libraries-cpp/index.html
+++ b/content/docs/en/client-libraries-cpp/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/client-libraries-go.html b/content/docs/en/client-libraries-go.html
index 5802ddb..eb4f40f 100644
--- a/content/docs/en/client-libraries-go.html
+++ b/content/docs/en/client-libraries-go.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/client-libraries-go/index.html b/content/docs/en/client-libraries-go/index.html
index 5802ddb..eb4f40f 100644
--- a/content/docs/en/client-libraries-go/index.html
+++ b/content/docs/en/client-libraries-go/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/client-libraries-java.html b/content/docs/en/client-libraries-java.html
index cc5053b..a8fb2d0 100644
--- a/content/docs/en/client-libraries-java.html
+++ b/content/docs/en/client-libraries-java.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/client-libraries-java/index.html b/content/docs/en/client-libraries-java/index.html
index cc5053b..a8fb2d0 100644
--- a/content/docs/en/client-libraries-java/index.html
+++ b/content/docs/en/client-libraries-java/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/client-libraries-python.html b/content/docs/en/client-libraries-python.html
index 5d239be..cc0931a 100644
--- a/content/docs/en/client-libraries-python.html
+++ b/content/docs/en/client-libraries-python.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/client-libraries-python/index.html b/content/docs/en/client-libraries-python/index.html
index 5d239be..cc0931a 100644
--- a/content/docs/en/client-libraries-python/index.html
+++ b/content/docs/en/client-libraries-python/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/client-libraries-websocket.html b/content/docs/en/client-libraries-websocket.html
index d3209fd..18d7af7 100644
--- a/content/docs/en/client-libraries-websocket.html
+++ b/content/docs/en/client-libraries-websocket.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/client-libraries-websocket/index.html b/content/docs/en/client-libraries-websocket/index.html
index d3209fd..18d7af7 100644
--- a/content/docs/en/client-libraries-websocket/index.html
+++ b/content/docs/en/client-libraries-websocket/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/client-libraries.html b/content/docs/en/client-libraries.html
index 9933473..d82c7e4 100644
--- a/content/docs/en/client-libraries.html
+++ b/content/docs/en/client-libraries.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/client-libraries/index.html b/content/docs/en/client-libraries/index.html
index 9933473..d82c7e4 100644
--- a/content/docs/en/client-libraries/index.html
+++ b/content/docs/en/client-libraries/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-architecture-overview.html b/content/docs/en/concepts-architecture-overview.html
index 352f1cb..2515e50 100644
--- a/content/docs/en/concepts-architecture-overview.html
+++ b/content/docs/en/concepts-architecture-overview.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-architecture-overview/index.html b/content/docs/en/concepts-architecture-overview/index.html
index 352f1cb..2515e50 100644
--- a/content/docs/en/concepts-architecture-overview/index.html
+++ b/content/docs/en/concepts-architecture-overview/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-authentication.html b/content/docs/en/concepts-authentication.html
index 75121c9..6796f48 100644
--- a/content/docs/en/concepts-authentication.html
+++ b/content/docs/en/concepts-authentication.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-authentication/index.html b/content/docs/en/concepts-authentication/index.html
index 75121c9..6796f48 100644
--- a/content/docs/en/concepts-authentication/index.html
+++ b/content/docs/en/concepts-authentication/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-clients.html b/content/docs/en/concepts-clients.html
index 55db5d9..aa38f7f 100644
--- a/content/docs/en/concepts-clients.html
+++ b/content/docs/en/concepts-clients.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-clients/index.html b/content/docs/en/concepts-clients/index.html
index 55db5d9..aa38f7f 100644
--- a/content/docs/en/concepts-clients/index.html
+++ b/content/docs/en/concepts-clients/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-messaging.html b/content/docs/en/concepts-messaging.html
index a4109f7..76bca49 100644
--- a/content/docs/en/concepts-messaging.html
+++ b/content/docs/en/concepts-messaging.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-messaging/index.html b/content/docs/en/concepts-messaging/index.html
index a4109f7..76bca49 100644
--- a/content/docs/en/concepts-messaging/index.html
+++ b/content/docs/en/concepts-messaging/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-multi-tenancy.html b/content/docs/en/concepts-multi-tenancy.html
index 059f28e..8156d90 100644
--- a/content/docs/en/concepts-multi-tenancy.html
+++ b/content/docs/en/concepts-multi-tenancy.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-multi-tenancy/index.html b/content/docs/en/concepts-multi-tenancy/index.html
index 059f28e..8156d90 100644
--- a/content/docs/en/concepts-multi-tenancy/index.html
+++ b/content/docs/en/concepts-multi-tenancy/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-overview.html b/content/docs/en/concepts-overview.html
index f439a5c..9144ad6 100644
--- a/content/docs/en/concepts-overview.html
+++ b/content/docs/en/concepts-overview.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-overview/index.html b/content/docs/en/concepts-overview/index.html
index f439a5c..9144ad6 100644
--- a/content/docs/en/concepts-overview/index.html
+++ b/content/docs/en/concepts-overview/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-replication.html b/content/docs/en/concepts-replication.html
index 345f62f..7e5c3c0 100644
--- a/content/docs/en/concepts-replication.html
+++ b/content/docs/en/concepts-replication.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-replication/index.html b/content/docs/en/concepts-replication/index.html
index 345f62f..7e5c3c0 100644
--- a/content/docs/en/concepts-replication/index.html
+++ b/content/docs/en/concepts-replication/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-schema-registry.html b/content/docs/en/concepts-schema-registry.html
index 6417d58..e76028e 100644
--- a/content/docs/en/concepts-schema-registry.html
+++ b/content/docs/en/concepts-schema-registry.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-schema-registry/index.html b/content/docs/en/concepts-schema-registry/index.html
index 6417d58..e76028e 100644
--- a/content/docs/en/concepts-schema-registry/index.html
+++ b/content/docs/en/concepts-schema-registry/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-tiered-storage.html b/content/docs/en/concepts-tiered-storage.html
index 6c05a61..0709870 100644
--- a/content/docs/en/concepts-tiered-storage.html
+++ b/content/docs/en/concepts-tiered-storage.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-tiered-storage/index.html b/content/docs/en/concepts-tiered-storage/index.html
index 6c05a61..0709870 100644
--- a/content/docs/en/concepts-tiered-storage/index.html
+++ b/content/docs/en/concepts-tiered-storage/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-topic-compaction.html b/content/docs/en/concepts-topic-compaction.html
index d7a69a2..fe46037 100644
--- a/content/docs/en/concepts-topic-compaction.html
+++ b/content/docs/en/concepts-topic-compaction.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/concepts-topic-compaction/index.html b/content/docs/en/concepts-topic-compaction/index.html
index d7a69a2..fe46037 100644
--- a/content/docs/en/concepts-topic-compaction/index.html
+++ b/content/docs/en/concepts-topic-compaction/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-bookkeepermetadata.html b/content/docs/en/cookbooks-bookkeepermetadata.html
index 39fab3c..e7ed285 100644
--- a/content/docs/en/cookbooks-bookkeepermetadata.html
+++ b/content/docs/en/cookbooks-bookkeepermetadata.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-bookkeepermetadata/index.html b/content/docs/en/cookbooks-bookkeepermetadata/index.html
index 39fab3c..e7ed285 100644
--- a/content/docs/en/cookbooks-bookkeepermetadata/index.html
+++ b/content/docs/en/cookbooks-bookkeepermetadata/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-compaction.html b/content/docs/en/cookbooks-compaction.html
index f604fe5..f4fa6f2 100644
--- a/content/docs/en/cookbooks-compaction.html
+++ b/content/docs/en/cookbooks-compaction.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-compaction/index.html b/content/docs/en/cookbooks-compaction/index.html
index f604fe5..f4fa6f2 100644
--- a/content/docs/en/cookbooks-compaction/index.html
+++ b/content/docs/en/cookbooks-compaction/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-deduplication.html b/content/docs/en/cookbooks-deduplication.html
index 6de5b9f..3e784bc 100644
--- a/content/docs/en/cookbooks-deduplication.html
+++ b/content/docs/en/cookbooks-deduplication.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-deduplication/index.html b/content/docs/en/cookbooks-deduplication/index.html
index 6de5b9f..3e784bc 100644
--- a/content/docs/en/cookbooks-deduplication/index.html
+++ b/content/docs/en/cookbooks-deduplication/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-encryption.html b/content/docs/en/cookbooks-encryption.html
index 6da53cf..0d75a32 100644
--- a/content/docs/en/cookbooks-encryption.html
+++ b/content/docs/en/cookbooks-encryption.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-encryption/index.html b/content/docs/en/cookbooks-encryption/index.html
index 6da53cf..0d75a32 100644
--- a/content/docs/en/cookbooks-encryption/index.html
+++ b/content/docs/en/cookbooks-encryption/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-message-queue.html b/content/docs/en/cookbooks-message-queue.html
index a4895b9..ded612d 100644
--- a/content/docs/en/cookbooks-message-queue.html
+++ b/content/docs/en/cookbooks-message-queue.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-message-queue/index.html b/content/docs/en/cookbooks-message-queue/index.html
index a4895b9..ded612d 100644
--- a/content/docs/en/cookbooks-message-queue/index.html
+++ b/content/docs/en/cookbooks-message-queue/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-non-persistent.html b/content/docs/en/cookbooks-non-persistent.html
index d410526..745b314 100644
--- a/content/docs/en/cookbooks-non-persistent.html
+++ b/content/docs/en/cookbooks-non-persistent.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-non-persistent/index.html b/content/docs/en/cookbooks-non-persistent/index.html
index d410526..745b314 100644
--- a/content/docs/en/cookbooks-non-persistent/index.html
+++ b/content/docs/en/cookbooks-non-persistent/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-partitioned.html b/content/docs/en/cookbooks-partitioned.html
index ca66e14..290f36f 100644
--- a/content/docs/en/cookbooks-partitioned.html
+++ b/content/docs/en/cookbooks-partitioned.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-partitioned/index.html b/content/docs/en/cookbooks-partitioned/index.html
index ca66e14..290f36f 100644
--- a/content/docs/en/cookbooks-partitioned/index.html
+++ b/content/docs/en/cookbooks-partitioned/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-retention-expiry.html b/content/docs/en/cookbooks-retention-expiry.html
index 1ce68d4..6a2956a 100644
--- a/content/docs/en/cookbooks-retention-expiry.html
+++ b/content/docs/en/cookbooks-retention-expiry.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-retention-expiry/index.html b/content/docs/en/cookbooks-retention-expiry/index.html
index 1ce68d4..6a2956a 100644
--- a/content/docs/en/cookbooks-retention-expiry/index.html
+++ b/content/docs/en/cookbooks-retention-expiry/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-tiered-storage.html b/content/docs/en/cookbooks-tiered-storage.html
index 8bdea32..5d11db9 100644
--- a/content/docs/en/cookbooks-tiered-storage.html
+++ b/content/docs/en/cookbooks-tiered-storage.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/cookbooks-tiered-storage/index.html b/content/docs/en/cookbooks-tiered-storage/index.html
index 8bdea32..5d11db9 100644
--- a/content/docs/en/cookbooks-tiered-storage/index.html
+++ b/content/docs/en/cookbooks-tiered-storage/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/deploy-aws.html b/content/docs/en/deploy-aws.html
index d6aaa77..75b822e 100644
--- a/content/docs/en/deploy-aws.html
+++ b/content/docs/en/deploy-aws.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/deploy-aws/index.html b/content/docs/en/deploy-aws/index.html
index d6aaa77..75b822e 100644
--- a/content/docs/en/deploy-aws/index.html
+++ b/content/docs/en/deploy-aws/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/deploy-bare-metal-multi-cluster.html b/content/docs/en/deploy-bare-metal-multi-cluster.html
index 0a2998c..94500ab 100644
--- a/content/docs/en/deploy-bare-metal-multi-cluster.html
+++ b/content/docs/en/deploy-bare-metal-multi-cluster.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/deploy-bare-metal-multi-cluster/index.html b/content/docs/en/deploy-bare-metal-multi-cluster/index.html
index 0a2998c..94500ab 100644
--- a/content/docs/en/deploy-bare-metal-multi-cluster/index.html
+++ b/content/docs/en/deploy-bare-metal-multi-cluster/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/deploy-bare-metal.html b/content/docs/en/deploy-bare-metal.html
index 9f47229..e8a3e88 100644
--- a/content/docs/en/deploy-bare-metal.html
+++ b/content/docs/en/deploy-bare-metal.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
@@ -291,7 +291,7 @@ need to start zookeeper by using different stats port.</p>
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -400,7 +400,7 @@ Hello Pulsar
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/deploy-bare-metal/index.html b/content/docs/en/deploy-bare-metal/index.html
index 9f47229..e8a3e88 100644
--- a/content/docs/en/deploy-bare-metal/index.html
+++ b/content/docs/en/deploy-bare-metal/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
@@ -291,7 +291,7 @@ need to start zookeeper by using different stats port.</p>
 <p>Once you've appropriately modified the <code>zkServers</code> parameter, you can provide any other configuration modifications you need. You can find a full listing of the available BookKeeper configuration parameters <a href="/docs/en/reference-configuration#bookkeeper">here</a>, although we would recommend consulting the <a href="http://bookkeeper.apache.org/docs/latest/reference/config/">BookKeeper documentation</a> for a more in-depth guide.</p>
 <blockquote>
 <h5><a class="anchor" aria-hidden="true" id="notes"></a><a href="#notes" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
-<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="/docs/en/functions-state">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
+<p>Since Pulsar 2.1.0 release, Pulsar introduces <a href="functions-state.md">stateful function</a> for Pulsar Functions. If you would like to enable that feature,
 you need to enable table service on BookKeeper by setting following setting in <code>conf/bookkeeper.conf</code> file.</p>
 <pre><code class="hljs css language-conf">extraServerComponents=org<span class="hljs-selector-class">.apache</span><span class="hljs-selector-class">.bookkeeper</span><span class="hljs-selector-class">.stream</span><span class="hljs-selector-class">.server</span><span class="hljs-selector-class">.StreamStorageLifecycleComponent</span>
 </code></pre>
@@ -400,7 +400,7 @@ Hello Pulsar
   --namespace default \
   --name exclamation
 </code></pre>
-<p>Check if the function is running as expected by <a href="/docs/en/functions-deploying#triggering-pulsar-functions">triggering</a> the function.</p>
+<p>Check if the function is running as expected by <a href="functions-deploying.md#triggering-pulsar-functions">triggering</a> the function.</p>
 <pre><code class="hljs css language-bash">bin/pulsar-admin <span class="hljs-built_in">functions</span> trigger --name exclamation --trigger-value <span class="hljs-string">"hello world"</span>
 </code></pre>
 <p>You will see output as below:</p>
diff --git a/content/docs/en/deploy-dcos.html b/content/docs/en/deploy-dcos.html
index b74612e..1522850 100644
--- a/content/docs/en/deploy-dcos.html
+++ b/content/docs/en/deploy-dcos.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/deploy-dcos/index.html b/content/docs/en/deploy-dcos/index.html
index b74612e..1522850 100644
--- a/content/docs/en/deploy-dcos/index.html
+++ b/content/docs/en/deploy-dcos/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/deploy-kubernetes.html b/content/docs/en/deploy-kubernetes.html
index 721b806..07bebda 100644
--- a/content/docs/en/deploy-kubernetes.html
+++ b/content/docs/en/deploy-kubernetes.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/deploy-kubernetes/index.html b/content/docs/en/deploy-kubernetes/index.html
index 721b806..07bebda 100644
--- a/content/docs/en/deploy-kubernetes/index.html
+++ b/content/docs/en/deploy-kubernetes/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/deploy-monitoring.html b/content/docs/en/deploy-monitoring.html
index ed2e8b1..2b4bfca 100644
--- a/content/docs/en/deploy-monitoring.html
+++ b/content/docs/en/deploy-monitoring.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/deploy-monitoring/index.html b/content/docs/en/deploy-monitoring/index.html
index ed2e8b1..2b4bfca 100644
--- a/content/docs/en/deploy-monitoring/index.html
+++ b/content/docs/en/deploy-monitoring/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/develop-binary-protocol.html b/content/docs/en/develop-binary-protocol.html
index ff2bfe4..564869c 100644
--- a/content/docs/en/develop-binary-protocol.html
+++ b/content/docs/en/develop-binary-protocol.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/develop-binary-protocol/index.html b/content/docs/en/develop-binary-protocol/index.html
index ff2bfe4..564869c 100644
--- a/content/docs/en/develop-binary-protocol/index.html
+++ b/content/docs/en/develop-binary-protocol/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/develop-cpp.html b/content/docs/en/develop-cpp.html
index a1c0323..2f69585 100644
--- a/content/docs/en/develop-cpp.html
+++ b/content/docs/en/develop-cpp.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/develop-cpp/index.html b/content/docs/en/develop-cpp/index.html
index a1c0323..2f69585 100644
--- a/content/docs/en/develop-cpp/index.html
+++ b/content/docs/en/develop-cpp/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/develop-load-manager.html b/content/docs/en/develop-load-manager.html
index 6e829ce..f0212fd 100644
--- a/content/docs/en/develop-load-manager.html
+++ b/content/docs/en/develop-load-manager.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/develop-load-manager/index.html b/content/docs/en/develop-load-manager/index.html
index 6e829ce..f0212fd 100644
--- a/content/docs/en/develop-load-manager/index.html
+++ b/content/docs/en/develop-load-manager/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/develop-schema.html b/content/docs/en/develop-schema.html
index 1ba3418..1fbef20 100644
--- a/content/docs/en/develop-schema.html
+++ b/content/docs/en/develop-schema.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/develop-schema/index.html b/content/docs/en/develop-schema/index.html
index 1ba3418..1fbef20 100644
--- a/content/docs/en/develop-schema/index.html
+++ b/content/docs/en/develop-schema/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/develop-tools.html b/content/docs/en/develop-tools.html
index ce813d6..8d6fbbf 100644
--- a/content/docs/en/develop-tools.html
+++ b/content/docs/en/develop-tools.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/develop-tools/index.html b/content/docs/en/develop-tools/index.html
index ce813d6..8d6fbbf 100644
--- a/content/docs/en/develop-tools/index.html
+++ b/content/docs/en/develop-tools/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
diff --git a/content/docs/en/functions-api.html b/content/docs/en/functions-api.html
index c15c6bd..8323773 100644
--- a/content/docs/en/functions-api.html
+++ b/content/docs/en/functions-api.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
@@ -94,21 +94,21 @@
 <li>A <a href="#functions-for-java">Java</a> function listens on the <code>sanitized-sentences</code> topic, counts the number of times each word appears within a specified time window, and publishes the results to a <code>results</code> topic</li>
 <li>Finally, a Python function listens on the <code>results</code> topic and writes the results to a MySQL table</li>
 </ul>
-<h3><a class="anchor" aria-hidden="true" id="function-example"></a><a href="#function-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>The following &quot;input sanitizer&quot; function is written in Python and stored in a <code>sanitizer.py</code> file.</p>
+<h3><a class="anchor" aria-hidden="true" id="example-function"></a><a href="#example-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>Here's an example &quot;input sanitizer&quot; function written in Python and stored in a <code>sanitizer.py</code> file:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">clean_string</span><span class="hljs-params">(s)</span>:</span>
     <span class="hljs-keyword">return</span> s.strip().lower()
 
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> clean_string(input)
 </code></pre>
-<p><strong>Note</strong></p>
+<p>Some things to note about this Pulsar Function:</p>
 <ul>
-<li>In the example, no client, producer, or consumer object is involved. All message &quot;plumbing&quot; are already done, so you only need to deal with processing logic.</li>
-<li>No topics, subscription types, tenants, or namespaces are specified in the function logic. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
+<li>There is no client, producer, or consumer object involved. All message &quot;plumbing&quot; is already taken care of for you, enabling you to worry only about processing logic.</li>
+<li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/pulsar-admin#functions"><code>functions</code></a> command. The following example runs <a href="#example-function">sanitizer</a> function in <a href="/docs/en/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -199,9 +199,9 @@
 <h2><a class="anchor" aria-hidden="true" id="functions-for-java"></a><a href="#functions-for-java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>Writing Pulsar Functions in Java involves implementing one of two interfaces:</p>
 <ul>
-<li>The <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html"><code>java.util.function.Function</code></a> interface</li>
+<li>The <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html"><code>java.util.Function</code></a> interface</li>
 <li>The <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Function">Function</a>
- interface. This interface works much like the <code>java.util.function.Function</code> interface, but with the important difference that it provides a <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+ interface. This interface works much like the <code>java.util.Function</code> interface, but with the important difference that it provides a <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object that you can use in a <a href="#context">variety of ways</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="get-started"></a><a href="#get-started" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -225,23 +225,23 @@
 </code></pre></li>
 </ul>
 <h4><a class="anchor" aria-hidden="true" id="packaging"></a><a href="#packaging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
-<p>Whether you're writing Java Pulsar Functions using the <a href="#java-native-functions">native</a> Java <code>java.util.function.Function</code> interface or using the <a href="#java-sdk-functions">Java SDK</a>, you'll need to package your function(s) as a &quot;fat&quot; JAR.</p>
+<p>Whether you're writing Java Pulsar Functions using the <a href="#java-native-functions">native</a> Java <code>java.util.Function</code> interface or using the <a href="#java-sdk-functions">Java SDK</a>, you'll need to package your function(s) as a &quot;fat&quot; JAR.</p>
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="starter-repo"></a><a href="#starter-repo" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
 <p>If you'd like to get up and running quickly, you can use <a href="https://github.com/streamlio/pulsar-functions-java-starter">this repo</a>, which contains the necessary Maven configuration to build a fat JAR as well as some example functions.</p>
 </blockquote>
 <h3><a class="anchor" aria-hidden="true" id="java-native-functions"></a><a href="#java-native-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
-<p>If your function doesn't require access to its <a href="#context">context</a>, you can create a Pulsar Function by implementing the <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html"><code>java.util.function.Function</code></a> interface, which has this very simple, single-method signature:</p>
+<p>If your function doesn't require access to its <a href="#context">context</a>, you can create a Pulsar Function by implementing the <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html"><code>java.util.Function</code></a> interface, which has this very simple, single-method signature:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">I</span>, <span class="hljs-title">O</span>&gt; </span>{
     <span class="hljs-function">O <span class="hljs-title">apply</span><span class="hljs-params">(I input)</span></span>;
 }
 </code></pre>
 <p>Here's an example function that takes a string as its input, adds an exclamation point to the end of the string, and then publishes the resulting string:</p>
-<pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.function.Function;
+<pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
-    <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{
+    <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">process</span><span class="hljs-params">(String input)</span> </span>{
         <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input);
     }
 }
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="get-started-1"></a><a href="#get-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>Regardless of which <a href="/docs/en/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/reference-terminology#broker">broker</a> for <a href="/docs/en/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#functi [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-function">Exampl [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/functions-api/index.html b/content/docs/en/functions-api/index.html
index c15c6bd..8323773 100644
--- a/content/docs/en/functions-api/index.html
+++ b/content/docs/en/functions-api/index.html
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
@@ -94,21 +94,21 @@
 <li>A <a href="#functions-for-java">Java</a> function listens on the <code>sanitized-sentences</code> topic, counts the number of times each word appears within a specified time window, and publishes the results to a <code>results</code> topic</li>
 <li>Finally, a Python function listens on the <code>results</code> topic and writes the results to a MySQL table</li>
 </ul>
-<h3><a class="anchor" aria-hidden="true" id="function-example"></a><a href="#function-example" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
-<p>The following &quot;input sanitizer&quot; function is written in Python and stored in a <code>sanitizer.py</code> file.</p>
+<h3><a class="anchor" aria-hidden="true" id="example-function"></a><a href="#example-function" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2. [...]
+<p>Here's an example &quot;input sanitizer&quot; function written in Python and stored in a <code>sanitizer.py</code> file:</p>
 <pre><code class="hljs css language-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">clean_string</span><span class="hljs-params">(s)</span>:</span>
     <span class="hljs-keyword">return</span> s.strip().lower()
 
 <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process</span><span class="hljs-params">(input)</span>:</span>
     <span class="hljs-keyword">return</span> clean_string(input)
 </code></pre>
-<p><strong>Note</strong></p>
+<p>Some things to note about this Pulsar Function:</p>
 <ul>
-<li>In the example, no client, producer, or consumer object is involved. All message &quot;plumbing&quot; are already done, so you only need to deal with processing logic.</li>
-<li>No topics, subscription types, tenants, or namespaces are specified in the function logic. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
+<li>There is no client, producer, or consumer object involved. All message &quot;plumbing&quot; is already taken care of for you, enabling you to worry only about processing logic.</li>
+<li>No topics, subscription types, tenants, or namespaces are specified in the function logic itself. Instead, topics are specified upon <a href="#example-deployment">deployment</a>. This means that you can use and re-use Pulsar Functions across topics, tenants, and namespaces without needing to hard-code those attributes.</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="example-deployment"></a><a href="#example-deployment" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
-<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/pulsar-admin#functions"><code>functions</code></a> command. The following example runs <a href="#example-function">sanitizer</a> function in <a href="/docs/en/functions-deploying#local-run-mode">local run</a> mode:</p>
+<p>Deploying Pulsar Functions is handled by the <a href="/docs/en/pulsar-admin"><code>pulsar-admin</code></a> CLI tool, in particular the <a href="/docs/en/pulsar-admin#functions"><code>functions</code></a> command. Here's an example command that would run our <a href="#example-function">sanitizer</a> function from above in <a href="functions-deploying.md#local-run-mode">local run</a> mode:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> localrun \
   --py sanitizer.py \          <span class="hljs-comment"># The Python file with the function's code</span>
   --classname sanitizer \      <span class="hljs-comment"># The class or function holding the processing logic</span>
@@ -119,7 +119,7 @@
   --output clean-strings-out \ <span class="hljs-comment"># The output topic for the function</span>
   --<span class="hljs-built_in">log</span>-topic sanitizer-logs   <span class="hljs-comment"># The topic to which all functions logs are published</span>
 </code></pre>
-<p>For instructions on running functions in your Pulsar cluster, see the <a href="/docs/en/functions-deploying">Deploying Pulsar Functions</a> guide.</p>
+<p>For instructions on running functions in your Pulsar cluster, see the <a href="functions-deploying.md">Deploying Pulsar Functions</a> guide.</p>
 <h3><a class="anchor" aria-hidden="true" id="available-apis"></a><a href="#available-apis" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0- [...]
 <p>In both Java and Python, you have two options for writing Pulsar Functions:</p>
 <table>
@@ -171,7 +171,7 @@
 <li>The version of the function</li>
 <li>The <a href="/docs/en/functions-overview#logging">logger object</a> used by the function, which can be used to create function log messages</li>
 <li>Access to arbitrary <a href="#user-config">user config</a> values supplied via the CLI</li>
-<li>An interface for recording <a href="/docs/en/functions-metrics">metrics</a></li>
+<li>An interface for recording <a href="functions-metrics.md">metrics</a></li>
 <li>An interface for storing and retrieving state in <a href="/docs/en/functions-overview#state-storage">state storage</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="user-config"></a><a href="#user-config" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -199,9 +199,9 @@
 <h2><a class="anchor" aria-hidden="true" id="functions-for-java"></a><a href="#functions-for-java" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22- [...]
 <p>Writing Pulsar Functions in Java involves implementing one of two interfaces:</p>
 <ul>
-<li>The <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html"><code>java.util.function.Function</code></a> interface</li>
+<li>The <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html"><code>java.util.Function</code></a> interface</li>
 <li>The <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Function">Function</a>
- interface. This interface works much like the <code>java.util.function.Function</code> interface, but with the important difference that it provides a <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
+ interface. This interface works much like the <code>java.util.Function</code> interface, but with the important difference that it provides a <a href="https://pulsar.incubator.apache.org/api/pulsar-functions/org/apache/pulsar/functions/api/Context">Context</a>
  object that you can use in a <a href="#context">variety of ways</a></li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="get-started"></a><a href="#get-started" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -225,23 +225,23 @@
 </code></pre></li>
 </ul>
 <h4><a class="anchor" aria-hidden="true" id="packaging"></a><a href="#packaging" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.6 [...]
-<p>Whether you're writing Java Pulsar Functions using the <a href="#java-native-functions">native</a> Java <code>java.util.function.Function</code> interface or using the <a href="#java-sdk-functions">Java SDK</a>, you'll need to package your function(s) as a &quot;fat&quot; JAR.</p>
+<p>Whether you're writing Java Pulsar Functions using the <a href="#java-native-functions">native</a> Java <code>java.util.Function</code> interface or using the <a href="#java-sdk-functions">Java SDK</a>, you'll need to package your function(s) as a &quot;fat&quot; JAR.</p>
 <blockquote>
 <h4><a class="anchor" aria-hidden="true" id="starter-repo"></a><a href="#starter-repo" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
 <p>If you'd like to get up and running quickly, you can use <a href="https://github.com/streamlio/pulsar-functions-java-starter">this repo</a>, which contains the necessary Maven configuration to build a fat JAR as well as some example functions.</p>
 </blockquote>
 <h3><a class="anchor" aria-hidden="true" id="java-native-functions"></a><a href="#java-native-functions" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 [...]
-<p>If your function doesn't require access to its <a href="#context">context</a>, you can create a Pulsar Function by implementing the <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html"><code>java.util.function.Function</code></a> interface, which has this very simple, single-method signature:</p>
+<p>If your function doesn't require access to its <a href="#context">context</a>, you can create a Pulsar Function by implementing the <a href="https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html"><code>java.util.Function</code></a> interface, which has this very simple, single-method signature:</p>
 <pre><code class="hljs css language-java"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">I</span>, <span class="hljs-title">O</span>&gt; </span>{
     <span class="hljs-function">O <span class="hljs-title">apply</span><span class="hljs-params">(I input)</span></span>;
 }
 </code></pre>
 <p>Here's an example function that takes a string as its input, adds an exclamation point to the end of the string, and then publishes the resulting string:</p>
-<pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.function.Function;
+<pre><code class="hljs css language-java"><span class="hljs-keyword">import</span> java.util.Function;
 
 <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ExclamationFunction</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Function</span>&lt;<span class="hljs-title">String</span>, <span class="hljs-title">String</span>&gt; </span>{
     <span class="hljs-meta">@Override</span>
-    <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">apply</span><span class="hljs-params">(String input)</span> </span>{
+    <span class="hljs-function"><span class="hljs-keyword">public</span> String <span class="hljs-title">process</span><span class="hljs-params">(String input)</span> </span>{
         <span class="hljs-keyword">return</span> String.format(<span class="hljs-string">"%s!"</span>, input);
     }
 }
@@ -508,8 +508,8 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 <li>A <code>Function</code> class that has a <code>process</code> method that provides a message input to process and a <a href="#context">context</a> object</li>
 </ul>
 <h3><a class="anchor" aria-hidden="true" id="get-started-1"></a><a href="#get-started-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.8 [...]
-<p>Regardless of which <a href="/docs/en/functions-deploying">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
-<p>That could be your local machine for <a href="/docs/en/functions-deploying#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/reference-terminology#broker">broker</a> for <a href="/docs/en/functions-deploying#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
+<p>Regardless of which <a href="functions-deploying.md">deployment mode</a> you're using, 'pulsar-client' python library has to installed on any machine that's running Pulsar Functions written in Python.</p>
+<p>That could be your local machine for <a href="functions-deploying.md#local-run-mode">local run mode</a> or a machine running a Pulsar <a href="/docs/en/reference-terminology#broker">broker</a> for <a href="functions-deploying.md#cluster-mode">cluster mode</a>. To install those libraries using pip:</p>
 <pre><code class="hljs css language-bash">$ pip install pulsar-client
 </code></pre>
 <h3><a class="anchor" aria-hidden="true" id="packaging-1"></a><a href="#packaging-1" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42 [...]
@@ -567,7 +567,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
 </tbody>
 </table>
 <h3><a class="anchor" aria-hidden="true" id="python-serde"></a><a href="#python-serde" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83. [...]
-<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="/docs/en/functions-deploying#cluster-mode">creating</a> or <a href="/docs/en/functions-deploying#local-run-mode">running</a> functions. Here's an example:</p>
+<p>Pulsar Functions use <a href="#serialization-and-deserialization-serde">SerDe</a> when publishing data to and consuming data from Pulsar topics (this is true of both <a href="#python-native-functions">native</a> functions and <a href="#python-sdk-functions">SDK</a> functions). You can specify the SerDe when <a href="functions-deploying.md#cluster-mode">creating</a> or <a href="functions-deploying.md#local-run-mode">running</a> functions. Here's an example:</p>
 <pre><code class="hljs css language-bash">$ bin/pulsar-admin <span class="hljs-built_in">functions</span> create \
   --tenant public \
   --namespace default \
@@ -671,7 +671,7 @@ String wotd = context.getUserConfigValueOrDefault(<span class="hljs-string">"wor
         <span class="hljs-keyword">if</span> input == <span class="hljs-number">11</span>:
             context.record_metric(<span class="hljs-string">'elevens-count'</span>, <span class="hljs-number">1</span>)
 </code></pre>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/functions-quickstart"><span class="arrow-prev">← </span><span>Get started</span></a><a class="docs-next button" href="/docs/en/functions-deploying"><span>Deploying functions</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#functi [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/functions-quickstart"><span class="arrow-prev">← </span><span>Previous</span></a><a class="docs-next button" href="/docs/en/functions-deploying"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#core-programming-model">Core programming model</a><ul class="toc-headings"><li><a href="#example-function">Exampl [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/functions-cli.html b/content/docs/en/functions-cli.html
index 8f02450..faee593 100644
--- a/content/docs/en/functions-cli.html
+++ b/content/docs/en/functions-cli.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar Functions CLI · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="The following tables list Pulsar Functions command-line tools. You can learn Pulsar Functions modes, commands, and parameters."/><meta name="docsearch:version" content="2.4.1"/><meta name="docsear [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar Functions command line tool · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="The following tables list Pulsar Functions command-line tools. You can learn Pulsar Functions modes, commands, and parameters."/><meta name="docsearch:version" content="2.4.1"/><meta [...]
               (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
               (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
               m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
@@ -74,7 +74,7 @@
                 };
               }
             });
-        </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-cli.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Pulsar Functions CLI</h1></header><article><div><span><p>The following tables list Pulsar Functions command-line tools. You can learn Pulsar Functions modes, c [...]
+        </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-cli.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Pulsar Functions command line tool</h1></header><article><div><span><p>The following tables list Pulsar Functions command-line tools. You can learn Pulsar Func [...]
 <h2><a class="anchor" aria-hidden="true" id="localrun"></a><a href="#localrun" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
 <p>Run Pulsar Functions locally, rather than deploying it to the Pulsar cluster.</p>
 <table>
@@ -83,46 +83,46 @@
 </thead>
 <tbody>
 <tr><td>auto-ack</td><td>Whether or not the framework acknowledges messages automatically.</td><td>false</td></tr>
-<tr><td>broker-service-url</td><td>The URL for the Pulsar broker.</td></tr>
-<tr><td>classname</td><td>The class name of a Pulsar Function.</td></tr>
-<tr><td>client-auth-params</td><td>Client authentication parameter.</td></tr>
-<tr><td>client-auth-plugin</td><td>Client authentication plugin using which function-process can connect to broker.</td></tr>
-<tr><td>CPU</td><td>The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).</td></tr>
-<tr><td>custom-schema-inputs</td><td>The map of input topics to Schema class names (as a JSON string).</td></tr>
-<tr><td>custom-serde-inputs</td><td>The map of input topics to SerDe class names (as a JSON string).</td></tr>
-<tr><td>dead-letter-topic</td><td>The topic where all messages that were not processed successfully are sent.</td></tr>
-<tr><td>disk</td><td>The disk in bytes that need to be allocated per function instance (applicable only to docker runtime).</td></tr>
-<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td></tr>
-<tr><td>function-config-file</td><td>The path to a YAML config file specifying the configuration of a Pulsar Function.</td></tr>
-<tr><td>go</td><td>Path to the main Go executable binary for the function (if the function is written in Go).</td></tr>
+<tr><td>broker-service-url</td><td>The URL for the Pulsar broker.</td><td></td></tr>
+<tr><td>classname</td><td>The class name of a Pulsar Function.</td><td></td></tr>
+<tr><td>client-auth-params</td><td>Client authentication parameter.</td><td></td></tr>
+<tr><td>client-auth-plugin</td><td>Client authentication plugin using which function-process can connect to broker.</td><td></td></tr>
+<tr><td>CPU</td><td>The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).</td><td></td></tr>
+<tr><td>custom-schema-inputs</td><td>The map of input topics to Schema class names (as a JSON string).</td><td></td></tr>
+<tr><td>custom-serde-inputs</td><td>The map of input topics to SerDe class names (as a JSON string).</td><td></td></tr>
+<tr><td>dead-letter-topic</td><td>The topic where all messages that were not processed successfully are sent.</td><td></td></tr>
+<tr><td>disk</td><td>The disk in bytes that need to be allocated per function instance (applicable only to docker runtime).</td><td></td></tr>
+<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td><td></td></tr>
+<tr><td>function-config-file</td><td>The path to a YAML config file specifying the configuration of a Pulsar Function.</td><td></td></tr>
+<tr><td>go</td><td>Path to the main Go executable binary for the function (if the function is written in Go).</td><td></td></tr>
 <tr><td>hostname-verification-enabled</td><td>Enable hostname verification.</td><td>false</td></tr>
-<tr><td>inputs</td><td>The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list).</td></tr>
-<tr><td>jar</td><td>Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package.</td></tr>
+<tr><td>inputs</td><td>The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list).</td><td></td></tr>
+<tr><td>jar</td><td>Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package.</td><td></td></tr>
 <tr><td>instance-id-offset</td><td>Start the instanceIds from this offset.</td><td>0</td></tr>
-<tr><td>log-topic</td><td>The topic to which the logs  a Pulsar Function are produced.</td></tr>
-<tr><td>max-message-retries</td><td>How many times should we try to process a message before giving up.</td></tr>
-<tr><td>name</td><td>The name of a Pulsar Function.</td></tr>
-<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td></tr>
-<tr><td>output</td><td>The output topic of a Pulsar Function (If none is specified, no output is written).</td></tr>
-<tr><td>output-serde-classname</td><td>The SerDe class to be used for messages output by the function.</td></tr>
-<tr><td>parallelism</td><td>The parallelism factor of  a Pulsar Function (i.e. the number of function instances to run).</td></tr>
+<tr><td>log-topic</td><td>The topic to which the logs  a Pulsar Function are produced.</td><td></td></tr>
+<tr><td>max-message-retries</td><td>How many times should we try to process a message before giving up.</td><td></td></tr>
+<tr><td>name</td><td>The name of a Pulsar Function.</td><td></td></tr>
+<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td><td></td></tr>
+<tr><td>output</td><td>The output topic of a Pulsar Function (If none is specified, no output is written).</td><td></td></tr>
+<tr><td>output-serde-classname</td><td>The SerDe class to be used for messages output by the function.</td><td></td></tr>
+<tr><td>parallelism</td><td>The parallelism factor of  a Pulsar Function (i.e. the number of function instances to run).</td><td></td></tr>
 <tr><td>processing-guarantees</td><td>The processing guarantees (delivery semantics) applied to the function. Available values: [ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE].</td><td>ATLEAST_ONCE</td></tr>
-<tr><td>py</td><td>Path to the main Python file/Python Wheel file for the function (if the function is written in Python).</td></tr>
-<tr><td>ram</td><td>The ram in bytes that need to be allocated per function instance (applicable only to process/docker runtime).</td></tr>
-<tr><td>retain-ordering</td><td>Function consumes and processes messages in order.</td></tr>
+<tr><td>py</td><td>Path to the main Python file/Python Wheel file for the function (if the function is written in Python).</td><td></td></tr>
+<tr><td>ram</td><td>The ram in bytes that need to be allocated per function instance (applicable only to process/docker runtime).</td><td></td></tr>
+<tr><td>retain-ordering</td><td>Function consumes and processes messages in order.</td><td></td></tr>
 <tr><td>schema-type</td><td>The builtin schema type or custom schema class name to be used for messages output by the function.</td><td><empty string></td></tr>
-<tr><td>sliding-interval-count</td><td>The number of messages after which the window slides.</td></tr>
-<tr><td>sliding-interval-duration-ms</td><td>The time duration after which the window slides.</td></tr>
-<tr><td>subs-name</td><td>Pulsar source subscription name if user wants a specific subscription-name for the input-topic consumer.</td></tr>
-<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td></tr>
-<tr><td>timeout-ms</td><td>The message timeout in milliseconds.</td></tr>
+<tr><td>sliding-interval-count</td><td>The number of messages after which the window slides.</td><td></td></tr>
+<tr><td>sliding-interval-duration-ms</td><td>The time duration after which the window slides.</td><td></td></tr>
+<tr><td>subs-name</td><td>Pulsar source subscription name if user wants a specific subscription-name for the input-topic consumer.</td><td></td></tr>
+<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td><td></td></tr>
+<tr><td>timeout-ms</td><td>The message timeout in milliseconds.</td><td></td></tr>
 <tr><td>tls-allow-insecure</td><td>Allow insecure tls connection.</td><td>false</td></tr>
-<tr><td>tls-trust-cert-path</td><td>tls trust cert file path.</td></tr>
-<tr><td>topics-pattern</td><td>The topic pattern to consume from list of topics under a namespace that match the pattern. [--input] and [--topic-pattern] are mutually exclusive. Add SerDe class name for a pattern in --custom-serde-inputs (only supported in Java Function).</td></tr>
+<tr><td>tls-trust-cert-path</td><td>tls trust cert file path.</td><td></td></tr>
+<tr><td>topics-pattern</td><td>The topic pattern to consume from list of topics under a namespace that match the pattern. [--input] and [--topic-pattern] are mutually exclusive. Add SerDe class name for a pattern in --custom-serde-inputs (only supported in Java Function).</td><td></td></tr>
 <tr><td>use-tls</td><td>Use tls connection.</td><td>false</td></tr>
-<tr><td>user-config</td><td>User-defined config key/values.</td></tr>
-<tr><td>window-length-count</td><td>The number of messages per window.</td></tr>
-<tr><td>window-length-duration-ms</td><td>The time duration of the window in milliseconds.</td></tr>
+<tr><td>user-config</td><td>User-defined config key/values.</td><td></td></tr>
+<tr><td>window-length-count</td><td>The number of messages per window.</td><td></td></tr>
+<tr><td>window-length-duration-ms</td><td>The time duration of the window in milliseconds.</td><td></td></tr>
 </tbody>
 </table>
 <h2><a class="anchor" aria-hidden="true" id="create"></a><a href="#create" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
@@ -133,38 +133,38 @@
 </thead>
 <tbody>
 <tr><td>auto-ack</td><td>Whether or not the framework acknowledges messages automatically.</td><td>false</td></tr>
-<tr><td>classname</td><td>The class name of a Pulsar Function.</td></tr>
-<tr><td>CPU</td><td>The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).</td></tr>
-<tr><td>custom-schema-inputs</td><td>The map of input topics to Schema class names (as a JSON string).</td></tr>
-<tr><td>custom-serde-inputs</td><td>The map of input topics to SerDe class names (as a JSON string).</td></tr>
-<tr><td>dead-letter-topic</td><td>The topic where all messages that were not processed successfully are sent.</td></tr>
-<tr><td>disk</td><td>The disk in bytes that need to be allocated per function instance (applicable only to docker runtime).</td></tr>
-<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td></tr>
-<tr><td>function-config-file</td><td>The path to a YAML config file specifying the configuration of a Pulsar Function.</td></tr>
-<tr><td>go</td><td>Path to the main Go executable binary for the function (if the function is written in Go).</td></tr>
-<tr><td>inputs</td><td>The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list).</td></tr>
-<tr><td>jar</td><td>Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package.</td></tr>
-<tr><td>log-topic</td><td>The topic to which the logs of a Pulsar Function are produced.</td></tr>
-<tr><td>max-message-retries</td><td>How many times should we try to process a message before giving up.</td></tr>
-<tr><td>name</td><td>The name of a Pulsar Function.</td></tr>
-<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td></tr>
-<tr><td>output</td><td>The output topic of a Pulsar Function (If none is specified, no output is written).</td></tr>
-<tr><td>output-serde-classname</td><td>The SerDe class to be used for messages output by the function.</td></tr>
-<tr><td>parallelism</td><td>The parallelism factor of a Pulsar Function (i.e. the number of function instances to run).</td></tr>
+<tr><td>classname</td><td>The class name of a Pulsar Function.</td><td></td></tr>
+<tr><td>CPU</td><td>The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).</td><td></td></tr>
+<tr><td>custom-schema-inputs</td><td>The map of input topics to Schema class names (as a JSON string).</td><td></td></tr>
+<tr><td>custom-serde-inputs</td><td>The map of input topics to SerDe class names (as a JSON string).</td><td></td></tr>
+<tr><td>dead-letter-topic</td><td>The topic where all messages that were not processed successfully are sent.</td><td></td></tr>
+<tr><td>disk</td><td>The disk in bytes that need to be allocated per function instance (applicable only to docker runtime).</td><td></td></tr>
+<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td><td></td></tr>
+<tr><td>function-config-file</td><td>The path to a YAML config file specifying the configuration of a Pulsar Function.</td><td></td></tr>
+<tr><td>go</td><td>Path to the main Go executable binary for the function (if the function is written in Go).</td><td></td></tr>
+<tr><td>inputs</td><td>The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list).</td><td></td></tr>
+<tr><td>jar</td><td>Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package.</td><td></td></tr>
+<tr><td>log-topic</td><td>The topic to which the logs of a Pulsar Function are produced.</td><td></td></tr>
+<tr><td>max-message-retries</td><td>How many times should we try to process a message before giving up.</td><td></td></tr>
+<tr><td>name</td><td>The name of a Pulsar Function.</td><td></td></tr>
+<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td><td></td></tr>
+<tr><td>output</td><td>The output topic of a Pulsar Function (If none is specified, no output is written).</td><td></td></tr>
+<tr><td>output-serde-classname</td><td>The SerDe class to be used for messages output by the function.</td><td></td></tr>
+<tr><td>parallelism</td><td>The parallelism factor of a Pulsar Function (i.e. the number of function instances to run).</td><td></td></tr>
 <tr><td>processing-guarantees</td><td>The processing guarantees (delivery semantics) applied to the function. Available values: [ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE].</td><td>ATLEAST_ONCE</td></tr>
-<tr><td>py</td><td>Path to the main Python file/Python Wheel file for the function (if the function is written in Python).</td></tr>
-<tr><td>ram</td><td>The ram in bytes that need to be allocated per function instance (applicable only to process/docker runtime).</td></tr>
-<tr><td>retain-ordering</td><td>Function consumes and processes messages in order.</td></tr>
+<tr><td>py</td><td>Path to the main Python file/Python Wheel file for the function (if the function is written in Python).</td><td></td></tr>
+<tr><td>ram</td><td>The ram in bytes that need to be allocated per function instance (applicable only to process/docker runtime).</td><td></td></tr>
+<tr><td>retain-ordering</td><td>Function consumes and processes messages in order.</td><td></td></tr>
 <tr><td>schema-type</td><td>The builtin schema type or custom schema class name to be used for messages output by the function.</td><td><empty string></td></tr>
-<tr><td>sliding-interval-count</td><td>The number of messages after which the window slides.</td></tr>
-<tr><td>sliding-interval-duration-ms</td><td>The time duration after which the window slides.</td></tr>
-<tr><td>subs-name</td><td>Pulsar source subscription name if user wants a specific subscription-name for the input-topic consumer.</td></tr>
-<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td></tr>
-<tr><td>timeout-ms</td><td>The message timeout in milliseconds.</td></tr>
-<tr><td>topics-pattern</td><td>The topic pattern to consume from list of topics under a namespace that match the pattern. [--input] and [--topic-pattern] are mutually exclusive. Add SerDe class name for a pattern in --custom-serde-inputs (only supported in Java Function).</td></tr>
-<tr><td>user-config</td><td>User-defined config key/values.</td></tr>
-<tr><td>window-length-count</td><td>The number of messages per window.</td></tr>
-<tr><td>window-length-duration-ms</td><td>The time duration of the window in milliseconds.</td></tr>
+<tr><td>sliding-interval-count</td><td>The number of messages after which the window slides.</td><td></td></tr>
+<tr><td>sliding-interval-duration-ms</td><td>The time duration after which the window slides.</td><td></td></tr>
+<tr><td>subs-name</td><td>Pulsar source subscription name if user wants a specific subscription-name for the input-topic consumer.</td><td></td></tr>
+<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td><td></td></tr>
+<tr><td>timeout-ms</td><td>The message timeout in milliseconds.</td><td></td></tr>
+<tr><td>topics-pattern</td><td>The topic pattern to consume from list of topics under a namespace that match the pattern. [--input] and [--topic-pattern] are mutually exclusive. Add SerDe class name for a pattern in --custom-serde-inputs (only supported in Java Function).</td><td></td></tr>
+<tr><td>user-config</td><td>User-defined config key/values.</td><td></td></tr>
+<tr><td>window-length-count</td><td>The number of messages per window.</td><td></td></tr>
+<tr><td>window-length-duration-ms</td><td>The time duration of the window in milliseconds.</td><td></td></tr>
 </tbody>
 </table>
 <h2><a class="anchor" aria-hidden="true" id="delete"></a><a href="#delete" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
@@ -174,10 +174,10 @@
 <tr><th>Name</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td></tr>
-<tr><td>name</td><td>The name of a Pulsar Function.</td></tr>
-<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td></tr>
-<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td></tr>
+<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td><td></td></tr>
+<tr><td>name</td><td>The name of a Pulsar Function.</td><td></td></tr>
+<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td><td></td></tr>
+<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td><td></td></tr>
 </tbody>
 </table>
 <h2><a class="anchor" aria-hidden="true" id="update"></a><a href="#update" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
@@ -188,39 +188,39 @@
 </thead>
 <tbody>
 <tr><td>auto-ack</td><td>Whether or not the framework acknowledges messages automatically.</td><td>false</td></tr>
-<tr><td>classname</td><td>The class name of a Pulsar Function.</td></tr>
-<tr><td>CPU</td><td>The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).</td></tr>
-<tr><td>custom-schema-inputs</td><td>The map of input topics to Schema class names (as a JSON string).</td></tr>
-<tr><td>custom-serde-inputs</td><td>The map of input topics to SerDe class names (as a JSON string).</td></tr>
-<tr><td>dead-letter-topic</td><td>The topic where all messages that were not processed successfully are sent.</td></tr>
-<tr><td>disk</td><td>The disk in bytes that need to be allocated per function instance (applicable only to docker runtime).</td></tr>
-<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td></tr>
-<tr><td>function-config-file</td><td>The path to a YAML config file specifying the configuration of a Pulsar Function.</td></tr>
-<tr><td>go</td><td>Path to the main Go executable binary for the function (if the function is written in Go).</td></tr>
-<tr><td>inputs</td><td>The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list).</td></tr>
-<tr><td>jar</td><td>Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package.</td></tr>
-<tr><td>log-topic</td><td>The topic to which the logs of a Pulsar Function are produced.</td></tr>
-<tr><td>max-message-retries</td><td>How many times should we try to process a message before giving up.</td></tr>
-<tr><td>name</td><td>The name of a Pulsar Function.</td></tr>
-<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td></tr>
-<tr><td>output</td><td>The output topic of a Pulsar Function (If none is specified, no output is written).</td></tr>
-<tr><td>output-serde-classname</td><td>The SerDe class to be used for messages output by the function.</td></tr>
-<tr><td>parallelism</td><td>The parallelism factor of a Pulsar Function (i.e. the number of function instances to run).</td></tr>
+<tr><td>classname</td><td>The class name of a Pulsar Function.</td><td></td></tr>
+<tr><td>CPU</td><td>The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).</td><td></td></tr>
+<tr><td>custom-schema-inputs</td><td>The map of input topics to Schema class names (as a JSON string).</td><td></td></tr>
+<tr><td>custom-serde-inputs</td><td>The map of input topics to SerDe class names (as a JSON string).</td><td></td></tr>
+<tr><td>dead-letter-topic</td><td>The topic where all messages that were not processed successfully are sent.</td><td></td></tr>
+<tr><td>disk</td><td>The disk in bytes that need to be allocated per function instance (applicable only to docker runtime).</td><td></td></tr>
+<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td><td></td></tr>
+<tr><td>function-config-file</td><td>The path to a YAML config file specifying the configuration of a Pulsar Function.</td><td></td></tr>
+<tr><td>go</td><td>Path to the main Go executable binary for the function (if the function is written in Go).</td><td></td></tr>
+<tr><td>inputs</td><td>The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list).</td><td></td></tr>
+<tr><td>jar</td><td>Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package.</td><td></td></tr>
+<tr><td>log-topic</td><td>The topic to which the logs of a Pulsar Function are produced.</td><td></td></tr>
+<tr><td>max-message-retries</td><td>How many times should we try to process a message before giving up.</td><td></td></tr>
+<tr><td>name</td><td>The name of a Pulsar Function.</td><td></td></tr>
+<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td><td></td></tr>
+<tr><td>output</td><td>The output topic of a Pulsar Function (If none is specified, no output is written).</td><td></td></tr>
+<tr><td>output-serde-classname</td><td>The SerDe class to be used for messages output by the function.</td><td></td></tr>
+<tr><td>parallelism</td><td>The parallelism factor of a Pulsar Function (i.e. the number of function instances to run).</td><td></td></tr>
 <tr><td>processing-guarantees</td><td>The processing guarantees (delivery semantics) applied to the function. Available values: [ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE].</td><td>ATLEAST_ONCE</td></tr>
-<tr><td>py</td><td>Path to the main Python file/Python Wheel file for the function (if the function is written in Python).</td></tr>
-<tr><td>ram</td><td>The ram in bytes that need to be allocated per function instance (applicable only to process/docker runtime).</td></tr>
-<tr><td>retain-ordering</td><td>Function consumes and processes messages in order.</td></tr>
+<tr><td>py</td><td>Path to the main Python file/Python Wheel file for the function (if the function is written in Python).</td><td></td></tr>
+<tr><td>ram</td><td>The ram in bytes that need to be allocated per function instance (applicable only to process/docker runtime).</td><td></td></tr>
+<tr><td>retain-ordering</td><td>Function consumes and processes messages in order.</td><td></td></tr>
 <tr><td>schema-type</td><td>The builtin schema type or custom schema class name to be used for messages output by the function.</td><td><empty string></td></tr>
-<tr><td>sliding-interval-count</td><td>The number of messages after which the window slides.</td></tr>
-<tr><td>sliding-interval-duration-ms</td><td>The time duration after which the window slides.</td></tr>
-<tr><td>subs-name</td><td>Pulsar source subscription name if user wants a specific subscription-name for the input-topic consumer.</td></tr>
-<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td></tr>
-<tr><td>timeout-ms</td><td>The message timeout in milliseconds.</td></tr>
-<tr><td>topics-pattern</td><td>The topic pattern to consume from list of topics under a namespace that match the pattern. [--input] and [--topic-pattern] are mutually exclusive. Add SerDe class name for a pattern in --custom-serde-inputs (only supported in Java Function).</td></tr>
+<tr><td>sliding-interval-count</td><td>The number of messages after which the window slides.</td><td></td></tr>
+<tr><td>sliding-interval-duration-ms</td><td>The time duration after which the window slides.</td><td></td></tr>
+<tr><td>subs-name</td><td>Pulsar source subscription name if user wants a specific subscription-name for the input-topic consumer.</td><td></td></tr>
+<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td><td></td></tr>
+<tr><td>timeout-ms</td><td>The message timeout in milliseconds.</td><td></td></tr>
+<tr><td>topics-pattern</td><td>The topic pattern to consume from list of topics under a namespace that match the pattern. [--input] and [--topic-pattern] are mutually exclusive. Add SerDe class name for a pattern in --custom-serde-inputs (only supported in Java Function).</td><td></td></tr>
 <tr><td>update-auth-data</td><td>Whether or not to update the auth data.</td><td>false</td></tr>
-<tr><td>user-config</td><td>User-defined config key/values.</td></tr>
-<tr><td>window-length-count</td><td>The number of messages per window.</td></tr>
-<tr><td>window-length-duration-ms</td><td>The time duration of the window in milliseconds.</td></tr>
+<tr><td>user-config</td><td>User-defined config key/values.</td><td></td></tr>
+<tr><td>window-length-count</td><td>The number of messages per window.</td><td></td></tr>
+<tr><td>window-length-duration-ms</td><td>The time duration of the window in milliseconds.</td><td></td></tr>
 </tbody>
 </table>
 <h2><a class="anchor" aria-hidden="true" id="get"></a><a href="#get" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.2 [...]
@@ -230,10 +230,10 @@
 <tr><th>Name</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td></tr>
-<tr><td>name</td><td>The name of a Pulsar Function.</td></tr>
-<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td></tr>
-<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td></tr>
+<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td><td></td></tr>
+<tr><td>name</td><td>The name of a Pulsar Function.</td><td></td></tr>
+<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td><td></td></tr>
+<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td><td></td></tr>
 </tbody>
 </table>
 <h2><a class="anchor" aria-hidden="true" id="restart"></a><a href="#restart" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1- [...]
@@ -243,11 +243,11 @@
 <tr><th>Name</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td></tr>
-<tr><td>instance-id</td><td>The function instanceId (restart all instances if instance-id is not provided.</td></tr>
-<tr><td>name</td><td>The name of a Pulsar Function.</td></tr>
-<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td></tr>
-<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td></tr>
+<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td><td></td></tr>
+<tr><td>instance-id</td><td>The function instanceId (restart all instances if instance-id is not provided.</td><td></td></tr>
+<tr><td>name</td><td>The name of a Pulsar Function.</td><td></td></tr>
+<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td><td></td></tr>
+<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td><td></td></tr>
 </tbody>
 </table>
 <h2><a class="anchor" aria-hidden="true" id="stop"></a><a href="#stop" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6 [...]
@@ -257,11 +257,11 @@
 <tr><th>Name</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td></tr>
-<tr><td>instance-id</td><td>The function instanceId (restart all instances if instance-id is not provided.</td></tr>
-<tr><td>name</td><td>The name of a Pulsar Function.</td></tr>
-<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td></tr>
-<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td></tr>
+<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td><td></td></tr>
+<tr><td>instance-id</td><td>The function instanceId (restart all instances if instance-id is not provided.</td><td></td></tr>
+<tr><td>name</td><td>The name of a Pulsar Function.</td><td></td></tr>
+<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td><td></td></tr>
+<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td><td></td></tr>
 </tbody>
 </table>
 <h2><a class="anchor" aria-hidden="true" id="start"></a><a href="#start" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09 [...]
@@ -271,14 +271,14 @@
 <tr><th>Name</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td></tr>
-<tr><td>instance-id</td><td>The function instanceId (restart all instances if instance-id is not provided.</td></tr>
-<tr><td>name</td><td>The name of a Pulsar Function.</td></tr>
-<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td></tr>
-<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td></tr>
+<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td><td></td></tr>
+<tr><td>instance-id</td><td>The function instanceId (restart all instances if instance-id is not provided.</td><td></td></tr>
+<tr><td>name</td><td>The name of a Pulsar Function.</td><td></td></tr>
+<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td><td></td></tr>
+<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td><td></td></tr>
 </tbody>
 </table>
-</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/functions-deploy"><span class="arrow-prev">← </span><span>Deploy</span></a><a class="docs-next button" href="/docs/en/functions-configure"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#localrun">localrun</a></li><li><a href="#create">create</a></li><li><a href="#delete">delete</a></li><li><a href="#upda [...]
+</span></div></article></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/en/functions-deploy"><span class="arrow-prev">← </span><span>How-to: Deploy</span></a><a class="docs-next button" href="/docs/en/functions-configure"><span>Next</span><span class="arrow-next"> →</span></a></div></div></div><nav class="onPageNav"><ul class="toc-headings"><li><a href="#localrun">localrun</a></li><li><a href="#create">create</a></li><li><a href="#delete">delete</a></li><li><a hre [...]
       const community = document.querySelector("a[href='#community']").parentNode;
       const communityMenu =
         '<li>' +
diff --git a/content/docs/en/functions-cli/index.html b/content/docs/en/functions-cli/index.html
index 8f02450..faee593 100644
--- a/content/docs/en/functions-cli/index.html
+++ b/content/docs/en/functions-cli/index.html
@@ -1,4 +1,4 @@
-<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar Functions CLI · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="The following tables list Pulsar Functions command-line tools. You can learn Pulsar Functions modes, commands, and parameters."/><meta name="docsearch:version" content="2.4.1"/><meta name="docsear [...]
+<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>Pulsar Functions command line tool · Apache Pulsar</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="The following tables list Pulsar Functions command-line tools. You can learn Pulsar Functions modes, commands, and parameters."/><meta name="docsearch:version" content="2.4.1"/><meta [...]
               (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
               (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
               m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
@@ -18,7 +18,7 @@
             languagesDropDown.className = "hide";
           }
         });
-      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
+      </script></span><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line [...]
             var coll = document.getElementsByClassName('collapsible');
             var checkActiveCategory = true;
             for (var i = 0; i < coll.length; i++) {
@@ -74,7 +74,7 @@
                 };
               }
             });
-        </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-cli.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Pulsar Functions CLI</h1></header><article><div><span><p>The following tables list Pulsar Functions command-line tools. You can learn Pulsar Functions modes, c [...]
+        </script></nav></div><div class="container mainContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/incubator-pulsar/edit/master/site2/docs/functions-cli.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 class="postHeaderTitle">Pulsar Functions command line tool</h1></header><article><div><span><p>The following tables list Pulsar Functions command-line tools. You can learn Pulsar Func [...]
 <h2><a class="anchor" aria-hidden="true" id="localrun"></a><a href="#localrun" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64  [...]
 <p>Run Pulsar Functions locally, rather than deploying it to the Pulsar cluster.</p>
 <table>
@@ -83,46 +83,46 @@
 </thead>
 <tbody>
 <tr><td>auto-ack</td><td>Whether or not the framework acknowledges messages automatically.</td><td>false</td></tr>
-<tr><td>broker-service-url</td><td>The URL for the Pulsar broker.</td></tr>
-<tr><td>classname</td><td>The class name of a Pulsar Function.</td></tr>
-<tr><td>client-auth-params</td><td>Client authentication parameter.</td></tr>
-<tr><td>client-auth-plugin</td><td>Client authentication plugin using which function-process can connect to broker.</td></tr>
-<tr><td>CPU</td><td>The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).</td></tr>
-<tr><td>custom-schema-inputs</td><td>The map of input topics to Schema class names (as a JSON string).</td></tr>
-<tr><td>custom-serde-inputs</td><td>The map of input topics to SerDe class names (as a JSON string).</td></tr>
-<tr><td>dead-letter-topic</td><td>The topic where all messages that were not processed successfully are sent.</td></tr>
-<tr><td>disk</td><td>The disk in bytes that need to be allocated per function instance (applicable only to docker runtime).</td></tr>
-<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td></tr>
-<tr><td>function-config-file</td><td>The path to a YAML config file specifying the configuration of a Pulsar Function.</td></tr>
-<tr><td>go</td><td>Path to the main Go executable binary for the function (if the function is written in Go).</td></tr>
+<tr><td>broker-service-url</td><td>The URL for the Pulsar broker.</td><td></td></tr>
+<tr><td>classname</td><td>The class name of a Pulsar Function.</td><td></td></tr>
+<tr><td>client-auth-params</td><td>Client authentication parameter.</td><td></td></tr>
+<tr><td>client-auth-plugin</td><td>Client authentication plugin using which function-process can connect to broker.</td><td></td></tr>
+<tr><td>CPU</td><td>The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).</td><td></td></tr>
+<tr><td>custom-schema-inputs</td><td>The map of input topics to Schema class names (as a JSON string).</td><td></td></tr>
+<tr><td>custom-serde-inputs</td><td>The map of input topics to SerDe class names (as a JSON string).</td><td></td></tr>
+<tr><td>dead-letter-topic</td><td>The topic where all messages that were not processed successfully are sent.</td><td></td></tr>
+<tr><td>disk</td><td>The disk in bytes that need to be allocated per function instance (applicable only to docker runtime).</td><td></td></tr>
+<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td><td></td></tr>
+<tr><td>function-config-file</td><td>The path to a YAML config file specifying the configuration of a Pulsar Function.</td><td></td></tr>
+<tr><td>go</td><td>Path to the main Go executable binary for the function (if the function is written in Go).</td><td></td></tr>
 <tr><td>hostname-verification-enabled</td><td>Enable hostname verification.</td><td>false</td></tr>
-<tr><td>inputs</td><td>The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list).</td></tr>
-<tr><td>jar</td><td>Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package.</td></tr>
+<tr><td>inputs</td><td>The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list).</td><td></td></tr>
+<tr><td>jar</td><td>Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package.</td><td></td></tr>
 <tr><td>instance-id-offset</td><td>Start the instanceIds from this offset.</td><td>0</td></tr>
-<tr><td>log-topic</td><td>The topic to which the logs  a Pulsar Function are produced.</td></tr>
-<tr><td>max-message-retries</td><td>How many times should we try to process a message before giving up.</td></tr>
-<tr><td>name</td><td>The name of a Pulsar Function.</td></tr>
-<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td></tr>
-<tr><td>output</td><td>The output topic of a Pulsar Function (If none is specified, no output is written).</td></tr>
-<tr><td>output-serde-classname</td><td>The SerDe class to be used for messages output by the function.</td></tr>
-<tr><td>parallelism</td><td>The parallelism factor of  a Pulsar Function (i.e. the number of function instances to run).</td></tr>
+<tr><td>log-topic</td><td>The topic to which the logs  a Pulsar Function are produced.</td><td></td></tr>
+<tr><td>max-message-retries</td><td>How many times should we try to process a message before giving up.</td><td></td></tr>
+<tr><td>name</td><td>The name of a Pulsar Function.</td><td></td></tr>
+<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td><td></td></tr>
+<tr><td>output</td><td>The output topic of a Pulsar Function (If none is specified, no output is written).</td><td></td></tr>
+<tr><td>output-serde-classname</td><td>The SerDe class to be used for messages output by the function.</td><td></td></tr>
+<tr><td>parallelism</td><td>The parallelism factor of  a Pulsar Function (i.e. the number of function instances to run).</td><td></td></tr>
 <tr><td>processing-guarantees</td><td>The processing guarantees (delivery semantics) applied to the function. Available values: [ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE].</td><td>ATLEAST_ONCE</td></tr>
-<tr><td>py</td><td>Path to the main Python file/Python Wheel file for the function (if the function is written in Python).</td></tr>
-<tr><td>ram</td><td>The ram in bytes that need to be allocated per function instance (applicable only to process/docker runtime).</td></tr>
-<tr><td>retain-ordering</td><td>Function consumes and processes messages in order.</td></tr>
+<tr><td>py</td><td>Path to the main Python file/Python Wheel file for the function (if the function is written in Python).</td><td></td></tr>
+<tr><td>ram</td><td>The ram in bytes that need to be allocated per function instance (applicable only to process/docker runtime).</td><td></td></tr>
+<tr><td>retain-ordering</td><td>Function consumes and processes messages in order.</td><td></td></tr>
 <tr><td>schema-type</td><td>The builtin schema type or custom schema class name to be used for messages output by the function.</td><td><empty string></td></tr>
-<tr><td>sliding-interval-count</td><td>The number of messages after which the window slides.</td></tr>
-<tr><td>sliding-interval-duration-ms</td><td>The time duration after which the window slides.</td></tr>
-<tr><td>subs-name</td><td>Pulsar source subscription name if user wants a specific subscription-name for the input-topic consumer.</td></tr>
-<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td></tr>
-<tr><td>timeout-ms</td><td>The message timeout in milliseconds.</td></tr>
+<tr><td>sliding-interval-count</td><td>The number of messages after which the window slides.</td><td></td></tr>
+<tr><td>sliding-interval-duration-ms</td><td>The time duration after which the window slides.</td><td></td></tr>
+<tr><td>subs-name</td><td>Pulsar source subscription name if user wants a specific subscription-name for the input-topic consumer.</td><td></td></tr>
+<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td><td></td></tr>
+<tr><td>timeout-ms</td><td>The message timeout in milliseconds.</td><td></td></tr>
 <tr><td>tls-allow-insecure</td><td>Allow insecure tls connection.</td><td>false</td></tr>
-<tr><td>tls-trust-cert-path</td><td>tls trust cert file path.</td></tr>
-<tr><td>topics-pattern</td><td>The topic pattern to consume from list of topics under a namespace that match the pattern. [--input] and [--topic-pattern] are mutually exclusive. Add SerDe class name for a pattern in --custom-serde-inputs (only supported in Java Function).</td></tr>
+<tr><td>tls-trust-cert-path</td><td>tls trust cert file path.</td><td></td></tr>
+<tr><td>topics-pattern</td><td>The topic pattern to consume from list of topics under a namespace that match the pattern. [--input] and [--topic-pattern] are mutually exclusive. Add SerDe class name for a pattern in --custom-serde-inputs (only supported in Java Function).</td><td></td></tr>
 <tr><td>use-tls</td><td>Use tls connection.</td><td>false</td></tr>
-<tr><td>user-config</td><td>User-defined config key/values.</td></tr>
-<tr><td>window-length-count</td><td>The number of messages per window.</td></tr>
-<tr><td>window-length-duration-ms</td><td>The time duration of the window in milliseconds.</td></tr>
+<tr><td>user-config</td><td>User-defined config key/values.</td><td></td></tr>
+<tr><td>window-length-count</td><td>The number of messages per window.</td><td></td></tr>
+<tr><td>window-length-duration-ms</td><td>The time duration of the window in milliseconds.</td><td></td></tr>
 </tbody>
 </table>
 <h2><a class="anchor" aria-hidden="true" id="create"></a><a href="#create" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
@@ -133,38 +133,38 @@
 </thead>
 <tbody>
 <tr><td>auto-ack</td><td>Whether or not the framework acknowledges messages automatically.</td><td>false</td></tr>
-<tr><td>classname</td><td>The class name of a Pulsar Function.</td></tr>
-<tr><td>CPU</td><td>The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).</td></tr>
-<tr><td>custom-schema-inputs</td><td>The map of input topics to Schema class names (as a JSON string).</td></tr>
-<tr><td>custom-serde-inputs</td><td>The map of input topics to SerDe class names (as a JSON string).</td></tr>
-<tr><td>dead-letter-topic</td><td>The topic where all messages that were not processed successfully are sent.</td></tr>
-<tr><td>disk</td><td>The disk in bytes that need to be allocated per function instance (applicable only to docker runtime).</td></tr>
-<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td></tr>
-<tr><td>function-config-file</td><td>The path to a YAML config file specifying the configuration of a Pulsar Function.</td></tr>
-<tr><td>go</td><td>Path to the main Go executable binary for the function (if the function is written in Go).</td></tr>
-<tr><td>inputs</td><td>The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list).</td></tr>
-<tr><td>jar</td><td>Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package.</td></tr>
-<tr><td>log-topic</td><td>The topic to which the logs of a Pulsar Function are produced.</td></tr>
-<tr><td>max-message-retries</td><td>How many times should we try to process a message before giving up.</td></tr>
-<tr><td>name</td><td>The name of a Pulsar Function.</td></tr>
-<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td></tr>
-<tr><td>output</td><td>The output topic of a Pulsar Function (If none is specified, no output is written).</td></tr>
-<tr><td>output-serde-classname</td><td>The SerDe class to be used for messages output by the function.</td></tr>
-<tr><td>parallelism</td><td>The parallelism factor of a Pulsar Function (i.e. the number of function instances to run).</td></tr>
+<tr><td>classname</td><td>The class name of a Pulsar Function.</td><td></td></tr>
+<tr><td>CPU</td><td>The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).</td><td></td></tr>
+<tr><td>custom-schema-inputs</td><td>The map of input topics to Schema class names (as a JSON string).</td><td></td></tr>
+<tr><td>custom-serde-inputs</td><td>The map of input topics to SerDe class names (as a JSON string).</td><td></td></tr>
+<tr><td>dead-letter-topic</td><td>The topic where all messages that were not processed successfully are sent.</td><td></td></tr>
+<tr><td>disk</td><td>The disk in bytes that need to be allocated per function instance (applicable only to docker runtime).</td><td></td></tr>
+<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td><td></td></tr>
+<tr><td>function-config-file</td><td>The path to a YAML config file specifying the configuration of a Pulsar Function.</td><td></td></tr>
+<tr><td>go</td><td>Path to the main Go executable binary for the function (if the function is written in Go).</td><td></td></tr>
+<tr><td>inputs</td><td>The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list).</td><td></td></tr>
+<tr><td>jar</td><td>Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package.</td><td></td></tr>
+<tr><td>log-topic</td><td>The topic to which the logs of a Pulsar Function are produced.</td><td></td></tr>
+<tr><td>max-message-retries</td><td>How many times should we try to process a message before giving up.</td><td></td></tr>
+<tr><td>name</td><td>The name of a Pulsar Function.</td><td></td></tr>
+<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td><td></td></tr>
+<tr><td>output</td><td>The output topic of a Pulsar Function (If none is specified, no output is written).</td><td></td></tr>
+<tr><td>output-serde-classname</td><td>The SerDe class to be used for messages output by the function.</td><td></td></tr>
+<tr><td>parallelism</td><td>The parallelism factor of a Pulsar Function (i.e. the number of function instances to run).</td><td></td></tr>
 <tr><td>processing-guarantees</td><td>The processing guarantees (delivery semantics) applied to the function. Available values: [ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE].</td><td>ATLEAST_ONCE</td></tr>
-<tr><td>py</td><td>Path to the main Python file/Python Wheel file for the function (if the function is written in Python).</td></tr>
-<tr><td>ram</td><td>The ram in bytes that need to be allocated per function instance (applicable only to process/docker runtime).</td></tr>
-<tr><td>retain-ordering</td><td>Function consumes and processes messages in order.</td></tr>
+<tr><td>py</td><td>Path to the main Python file/Python Wheel file for the function (if the function is written in Python).</td><td></td></tr>
+<tr><td>ram</td><td>The ram in bytes that need to be allocated per function instance (applicable only to process/docker runtime).</td><td></td></tr>
+<tr><td>retain-ordering</td><td>Function consumes and processes messages in order.</td><td></td></tr>
 <tr><td>schema-type</td><td>The builtin schema type or custom schema class name to be used for messages output by the function.</td><td><empty string></td></tr>
-<tr><td>sliding-interval-count</td><td>The number of messages after which the window slides.</td></tr>
-<tr><td>sliding-interval-duration-ms</td><td>The time duration after which the window slides.</td></tr>
-<tr><td>subs-name</td><td>Pulsar source subscription name if user wants a specific subscription-name for the input-topic consumer.</td></tr>
-<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td></tr>
-<tr><td>timeout-ms</td><td>The message timeout in milliseconds.</td></tr>
-<tr><td>topics-pattern</td><td>The topic pattern to consume from list of topics under a namespace that match the pattern. [--input] and [--topic-pattern] are mutually exclusive. Add SerDe class name for a pattern in --custom-serde-inputs (only supported in Java Function).</td></tr>
-<tr><td>user-config</td><td>User-defined config key/values.</td></tr>
-<tr><td>window-length-count</td><td>The number of messages per window.</td></tr>
-<tr><td>window-length-duration-ms</td><td>The time duration of the window in milliseconds.</td></tr>
+<tr><td>sliding-interval-count</td><td>The number of messages after which the window slides.</td><td></td></tr>
+<tr><td>sliding-interval-duration-ms</td><td>The time duration after which the window slides.</td><td></td></tr>
+<tr><td>subs-name</td><td>Pulsar source subscription name if user wants a specific subscription-name for the input-topic consumer.</td><td></td></tr>
+<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td><td></td></tr>
+<tr><td>timeout-ms</td><td>The message timeout in milliseconds.</td><td></td></tr>
+<tr><td>topics-pattern</td><td>The topic pattern to consume from list of topics under a namespace that match the pattern. [--input] and [--topic-pattern] are mutually exclusive. Add SerDe class name for a pattern in --custom-serde-inputs (only supported in Java Function).</td><td></td></tr>
+<tr><td>user-config</td><td>User-defined config key/values.</td><td></td></tr>
+<tr><td>window-length-count</td><td>The number of messages per window.</td><td></td></tr>
+<tr><td>window-length-duration-ms</td><td>The time duration of the window in milliseconds.</td><td></td></tr>
 </tbody>
 </table>
 <h2><a class="anchor" aria-hidden="true" id="delete"></a><a href="#delete" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
@@ -174,10 +174,10 @@
 <tr><th>Name</th><th>Description</th><th>Default</th></tr>
 </thead>
 <tbody>
-<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td></tr>
-<tr><td>name</td><td>The name of a Pulsar Function.</td></tr>
-<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td></tr>
-<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td></tr>
+<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td><td></td></tr>
+<tr><td>name</td><td>The name of a Pulsar Function.</td><td></td></tr>
+<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td><td></td></tr>
+<tr><td>tenant</td><td>The tenant of a Pulsar Function.</td><td></td></tr>
 </tbody>
 </table>
 <h2><a class="anchor" aria-hidden="true" id="update"></a><a href="#update" aria-hidden="true" class="hash-link"><svg class="hash-link-icon" aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2. [...]
@@ -188,39 +188,39 @@
 </thead>
 <tbody>
 <tr><td>auto-ack</td><td>Whether or not the framework acknowledges messages automatically.</td><td>false</td></tr>
-<tr><td>classname</td><td>The class name of a Pulsar Function.</td></tr>
-<tr><td>CPU</td><td>The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).</td></tr>
-<tr><td>custom-schema-inputs</td><td>The map of input topics to Schema class names (as a JSON string).</td></tr>
-<tr><td>custom-serde-inputs</td><td>The map of input topics to SerDe class names (as a JSON string).</td></tr>
-<tr><td>dead-letter-topic</td><td>The topic where all messages that were not processed successfully are sent.</td></tr>
-<tr><td>disk</td><td>The disk in bytes that need to be allocated per function instance (applicable only to docker runtime).</td></tr>
-<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td></tr>
-<tr><td>function-config-file</td><td>The path to a YAML config file specifying the configuration of a Pulsar Function.</td></tr>
-<tr><td>go</td><td>Path to the main Go executable binary for the function (if the function is written in Go).</td></tr>
-<tr><td>inputs</td><td>The input topic or topics of a Pulsar Function (multiple topics can be specified as a comma-separated list).</td></tr>
-<tr><td>jar</td><td>Path to the jar file for the function (if the function is written in Java). It also supports URL-path [http/https/file (file protocol assumes that file already exists on worker host)] from which worker can download the package.</td></tr>
-<tr><td>log-topic</td><td>The topic to which the logs of a Pulsar Function are produced.</td></tr>
-<tr><td>max-message-retries</td><td>How many times should we try to process a message before giving up.</td></tr>
-<tr><td>name</td><td>The name of a Pulsar Function.</td></tr>
-<tr><td>namespace</td><td>The namespace of a Pulsar Function.</td></tr>
-<tr><td>output</td><td>The output topic of a Pulsar Function (If none is specified, no output is written).</td></tr>
-<tr><td>output-serde-classname</td><td>The SerDe class to be used for messages output by the function.</td></tr>
-<tr><td>parallelism</td><td>The parallelism factor of a Pulsar Function (i.e. the number of function instances to run).</td></tr>
+<tr><td>classname</td><td>The class name of a Pulsar Function.</td><td></td></tr>
+<tr><td>CPU</td><td>The CPU in cores that need to be allocated per function instance (applicable only to docker runtime).</td><td></td></tr>
+<tr><td>custom-schema-inputs</td><td>The map of input topics to Schema class names (as a JSON string).</td><td></td></tr>
+<tr><td>custom-serde-inputs</td><td>The map of input topics to SerDe class names (as a JSON string).</td><td></td></tr>
+<tr><td>dead-letter-topic</td><td>The topic where all messages that were not processed successfully are sent.</td><td></td></tr>
+<tr><td>disk</td><td>The disk in bytes that need to be allocated per function instance (applicable only to docker runtime).</td><td></td></tr>
+<tr><td>fqfn</td><td>The Fully Qualified Function Name (FQFN) for the function.</td><td></td></tr>
... 51937 lines suppressed ...