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

chia7712 pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 23927a2037f MINOR: Fix broken relative links in docs/ (#22813)
23927a2037f is described below

commit 23927a2037f201536a7cc44313b2cbfaa5e543cf
Author: Ming-Yen Chung <[email protected]>
AuthorDate: Fri Jul 17 04:58:22 2026 +0800

    MINOR: Fix broken relative links in docs/ (#22813)
    
    Several docs/ cross-links use relative paths assuming a flat
    single-page-HTML layout, pre-dating the move to per-page Hugo
    directories (foo.md -> /foo/) on kafka.apache.org, so they resolve one
    level too shallow and 404 — including the Kafka Connect quickstart link
    and the new Streams/Connect security-model cross-links.
    
    Reviewers: Chia-Ping Tsai <[email protected]>
---
 docs/getting-started/upgrade.md                    |  2 +-
 docs/kafka-connect/user-guide.md                   |  2 +-
 docs/security/security-model-connect.md            | 12 ++---
 docs/security/security-model-streams.md            |  4 +-
 docs/security/security-model.md                    |  6 +--
 docs/streams/developer-guide/app-reset-tool.md     |  2 +-
 docs/streams/developer-guide/config-streams.md     | 14 +++---
 docs/streams/developer-guide/datatypes.md          |  6 +--
 docs/streams/developer-guide/dsl-api.md            | 56 +++++++++++-----------
 .../streams/developer-guide/interactive-queries.md |  6 +--
 docs/streams/developer-guide/manage-topics.md      |  4 +-
 docs/streams/developer-guide/memory-mgmt.md        | 12 ++---
 docs/streams/developer-guide/processor-api.md      | 22 ++++-----
 docs/streams/developer-guide/running-app.md        | 12 ++---
 docs/streams/developer-guide/security.md           |  2 +-
 docs/streams/developer-guide/testing.md            |  4 +-
 docs/streams/developer-guide/write-streams-app.md  | 16 +++----
 17 files changed, 91 insertions(+), 91 deletions(-)

diff --git a/docs/getting-started/upgrade.md b/docs/getting-started/upgrade.md
index ca6ab9923db..81b81e57c34 100644
--- a/docs/getting-started/upgrade.md
+++ b/docs/getting-started/upgrade.md
@@ -153,7 +153,7 @@ For further details, please refer to 
[KIP-1120](https://cwiki.apache.org/conflue
   * The metrics 
`org.apache.kafka.server:type=AssignmentsManager.QueuedReplicaToDirAssignments`,
 
`org.apache.kafka.storage.internals.log:type=RemoteStorageThreadPool.RemoteLogReaderTaskQueueSize`,
 and 
`org.apache.kafka.storage.internals.log:type=RemoteStorageThreadPool.RemoteLogReaderAvgIdlePercent`
 have been deprecated and will be removed in Kafka 5.0. As replacements, the 
following metrics have been introduced, which report the same information: 
`kafka.server:type=AssignmentsManager.Qu [...]
   * A new metric `AvgIdleRatio` has been added to the `ControllerEventManager` 
and `MetadataLoader` groups. These metrics measure the average idle ratio of 
their respective event queue threads, providing visibility into how much time 
each component spends waiting for events versus processing them. The metric 
value ranges from 0.0 (always busy) to 1.0 (always idle). 
   * Deprecated `org.apache.kafka.streams.KafkaStreams$CloseOptions` and its 
related methods, such as 
`KafkaStreams#close(org.apache.kafka.streams.KafkaStreams$CloseOptions)`. As a 
replacement, please use `org.apache.kafka.streams.CloseOptions` and 
`KafkaStreams#close(org.apache.kafka.streams.CloseOptions)`. For further 
details, please refer to 
[KIP-1153](https://cwiki.apache.org/confluence/x/QAq9F). 
-  * A new implementation of `ConnectorClientConfigOverridePolicy`, 
`AllowlistConnectorClientConfigOverridePolicy`, has been added. This enables 
specifying the configurations that connectors can override via 
`connector.client.config.override.allowlist`. From Kafka 5.0.0, this will be 
the default 
[connector.client.config.override.policy](documentation/#connectconfigs_connector.client.config.override.policy)
 policy. The `PrincipalConnectorClientConfigOverridePolicy` policy is now 
deprecated [...]
+  * A new implementation of `ConnectorClientConfigOverridePolicy`, 
`AllowlistConnectorClientConfigOverridePolicy`, has been added. This enables 
specifying the configurations that connectors can override via 
`connector.client.config.override.allowlist`. From Kafka 5.0.0, this will be 
the default 
[connector.client.config.override.policy](https://kafka.apache.org/documentation/#connectconfigs_connector.client.config.override.policy)
 policy. The `PrincipalConnectorClientConfigOverridePolicy` [...]
   * It is now possible to specify the start time for a Kafka Streams 
punctuation, instead of relying on the non-deterministic time when you register 
it. For further details, please refer to 
[KIP-1146](https://cwiki.apache.org/confluence/x/9QqWF). 
   * Added an optional `--node-id` flag to the `FeatureCommand` command. It 
specifies the node to describe. If not provided, an arbitrary node is used.
 
diff --git a/docs/kafka-connect/user-guide.md b/docs/kafka-connect/user-guide.md
index 3f46d54b0b1..8436962716b 100644
--- a/docs/kafka-connect/user-guide.md
+++ b/docs/kafka-connect/user-guide.md
@@ -26,7 +26,7 @@ type: docs
 -->
 
 
-The [quickstart](../getting-started/quickstart) provides a brief example of 
how to run a standalone version of Kafka Connect. This section describes how to 
configure, run, and manage Kafka Connect in more detail.
+The [quickstart](../../getting-started/quickstart) provides a brief example of 
how to run a standalone version of Kafka Connect. This section describes how to 
configure, run, and manage Kafka Connect in more detail.
 
 ## Running Kafka Connect
 
diff --git a/docs/security/security-model-connect.md 
b/docs/security/security-model-connect.md
index 613d7535cfe..2ebfda95383 100644
--- a/docs/security/security-model-connect.md
+++ b/docs/security/security-model-connect.md
@@ -26,11 +26,11 @@ type: docs
 -->
 
 
-This page extends the [Apache Kafka security model](security-model) to Kafka 
Connect. A worker authenticates to the Kafka cluster over a configured 
`SASL_SSL`/`SSL` listener exactly like any other client, so everything the core 
model says about authentication, authorization, and transport encryption to the 
brokers applies unchanged. What follows covers only what Connect adds on top — 
chiefly its own control plane, the REST API, and the fact that it runs 
user-supplied code.
+This page extends the [Apache Kafka security model](../security-model) to 
Kafka Connect. A worker authenticates to the Kafka cluster over a configured 
`SASL_SSL`/`SSL` listener exactly like any other client, so everything the core 
model says about authentication, authorization, and transport encryption to the 
brokers applies unchanged. What follows covers only what Connect adds on top — 
chiefly its own control plane, the REST API, and the fact that it runs 
user-supplied code.
 
 ## Things You Need To Know
 
-- **Connect inherits the broker's client security model.** Authentication to 
the brokers, broker-side authorization, and transport encryption are exactly as 
described in the [core security model](security-model). This page only 
describes what Connect layers on top.
+- **Connect inherits the broker's client security model.** Authentication to 
the brokers, broker-side authorization, and transport encryption are exactly as 
described in the [core security model](../security-model). This page only 
describes what Connect layers on top.
 - **The REST API is unauthenticated by default.** Out of the box, anyone who 
can reach the REST port can create, reconfigure, stop, or delete any connector. 
Because connectors and plugins run arbitrary code, REST access lets a caller 
run anything the worker's installed plugins allow.
 - **Connect plugins run arbitrary code.** Connectors, converters, 
transformations, predicates, and REST extensions loaded from `plugin.path` 
execute in the worker JVM with its privileges. Install only plugins you trust.
 - **The REST API is a shared control plane with no per-connector isolation.** 
There is no notion of connector ownership: any caller allowed onto the API can 
act on every connector and read its configuration.
@@ -54,7 +54,7 @@ Connect enables no authentication on the REST API by default. 
There are two comm
 - **Reverse proxy.** Terminate authentication (mTLS, OIDC, basic auth, etc.) 
in a proxy in front of the workers and allow only the proxy to reach the REST 
port.
 - **REST extension.** Register an authentication extension via 
`rest.extension.classes`. The built-in `BasicAuthSecurityRestExtension` 
performs JAAS-based HTTP basic authentication against a configured 
`LoginModule`. The reference `PropertyFileLoginModule` is **not** intended for 
production, as it stores credentials in cleartext; production deployments 
should configure a `LoginModule` that authenticates against a real credential 
store.
 
-REST authentication only establishes *who is calling*; it does not, on its 
own, authorize that caller on a per-connector basis (see Authorization below). 
Separately, the worker's authentication *to the Kafka brokers* uses the 
standard `ssl.*`/`sasl.*` client configs described in the [core 
model](security-model).
+REST authentication only establishes *who is calling*; it does not, on its 
own, authorize that caller on a per-connector basis (see Authorization below). 
Separately, the worker's authentication *to the Kafka brokers* uses the 
standard `ssl.*`/`sasl.*` client configs described in the [core 
model](../security-model).
 
 ## Authorization
 
@@ -70,12 +70,12 @@ The practical consequences are that you cannot grant 
Connect REST API access to
 
 Two independent channels need TLS:
 
-- **Worker-to-Kafka.** Configured with the standard `ssl.*` client properties, 
exactly as in the [core model](security-model).
+- **Worker-to-Kafka.** Configured with the standard `ssl.*` client properties, 
exactly as in the [core model](../security-model).
 - **REST API (and inter-worker).** Enable an `https` listener. By default the 
REST server reuses the worker's `ssl.*` settings; to configure the REST 
endpoint independently of the Kafka client, use the `listeners.https.*` 
prefixed properties (when the prefix is used, the unprefixed `ssl.*` settings 
are ignored for the REST server). The same settings secure inter-worker 
forwarding in distributed mode.
 
 ## Secrets in Configuration
 
-Connector configurations frequently contain credentials for external systems. 
As in the [core model](security-model), reference them indirectly through a 
`ConfigProvider` rather than inlining them, and set `allowed.paths` on the 
file-based providers to constrain which directories they can read. Two 
Connect-specific caveats:
+Connector configurations frequently contain credentials for external systems. 
As in the [core model](../security-model), reference them indirectly through a 
`ConfigProvider` rather than inlining them, and set `allowed.paths` on the 
file-based providers to constrain which directories they can read. Two 
Connect-specific caveats:
 
 - **Config providers are resolved through the shared REST API.** A caller who 
can guess or enumerate a provider alias can resolve its full value, so a 
provider is only as isolated as the REST API in front of it.
 - **What goes in the config topic depends on how secrets are supplied.** A 
secret placed directly in a connector configuration is written to 
`config.storage.topic` as an ordinary Kafka record, and is therefore only as 
protected as that topic's ACLs and the brokers' at-rest story. A 
`ConfigProvider` reference keeps the secret itself out of the topic — only the 
template string (`${alias:fields}`) is stored, not the resolved value. Note, 
however, that this does not hide the secret from REST [...]
@@ -86,7 +86,7 @@ Connect loads connectors, converters, single-message 
transforms, predicates, `Co
 
 ## Known Non-Findings
 
-In line with the [core model's classification](security-model), the following 
follow from Connect's design and are not, on their own, security 
vulnerabilities:
+In line with the [core model's classification](../security-model), the 
following follow from Connect's design and are not, on their own, security 
vulnerabilities:
 
 - **File-based connectors granting disk access.** Adding the file connectors 
to a worker effectively grants read/write access to the worker's local disk. 
This is the connector's intended function, not a flaw.
 - **Local-disk-only weaknesses in the file-based config providers.** Issues 
that require an attacker to already have local disk access on a Connect worker 
— for example the ability to create arbitrary files or symlinks — are not 
security issues, because such access is outside Connect's trust boundary. 
Path-validation robustness in these providers may still be hardened 
independently.
diff --git a/docs/security/security-model-streams.md 
b/docs/security/security-model-streams.md
index 8508ce5c9a1..7904c2368f5 100644
--- a/docs/security/security-model-streams.md
+++ b/docs/security/security-model-streams.md
@@ -26,7 +26,7 @@ type: docs
 -->
 
 
-This page extends the [Apache Kafka security model](security-model) to Kafka 
Streams. From the cluster's perspective a Streams application is an ordinary 
Kafka client and inherits the broker's authentication, authorization, and 
transport-encryption model through the same `ssl.*` and `sasl.*` client configs.
+This page extends the [Apache Kafka security model](../security-model) to 
Kafka Streams. From the cluster's perspective a Streams application is an 
ordinary Kafka client and inherits the broker's authentication, authorization, 
and transport-encryption model through the same `ssl.*` and `sasl.*` client 
configs.
 
 ## Things You Need To Know
 
@@ -36,7 +36,7 @@ This page extends the [Apache Kafka security 
model](security-model) to Kafka Str
 
 ## Known Non-Findings
 
-In line with the [core model's classification](security-model), the following 
are not, on their own, security vulnerabilities:
+In line with the [core model's classification](../security-model), the 
following are not, on their own, security vulnerabilities:
 
 - **Application-level issues in a Streams topology.** Streams runs inside the 
user's application, so bugs in user-supplied processors, state handling, or 
topology code fall within the application's trust boundary, not the broker's.
 - **Local state being readable on the host.** State stores and changelogs on 
disk are protected by the host filesystem, not by Kafka; reading them requires 
local access that is outside the model.
diff --git a/docs/security/security-model.md b/docs/security/security-model.md
index b7f96add11a..9b9d7929d7a 100644
--- a/docs/security/security-model.md
+++ b/docs/security/security-model.md
@@ -128,8 +128,8 @@ Broker, client, and Connect properties files contain 
keystore passwords, SASL cr
 
 The components built on top of the Kafka clients have their own security 
models, covered on separate pages:
 
-- [Kafka Connect](security-model-connect)
-- [Kafka Streams](security-model-streams)
+- [Kafka Connect](../security-model-connect)
+- [Kafka Streams](../security-model-streams)
 
 ## Development and Test Tooling
 
@@ -162,7 +162,7 @@ The following follow directly from the model above and are 
not, on their own, se
 - **Unauthenticated or unencrypted access to a default cluster.** Security is 
off by default; an open `PLAINTEXT` listener with no authorizer is a deployment 
choice, not a defect.
 - **A trusted principal performing an authorized operation.** Admin and 
inter-broker actions by a principal that holds the relevant ACLs — or by a 
`super.users` entry — are expected behaviour.
 - **Findings in development and test tooling.** Issues in `tools`, `bin`, 
Trogdor, `tests`, and similar are out of scope (see Development and Test 
Tooling above).
-- **Kafka Streams application-level issues.** Streams runs inside the user's 
application, so its security boundary is the application's, not the broker's 
(see the [Kafka Streams security model](security-model-streams)).
+- **Kafka Streams application-level issues.** Streams runs inside the user's 
application, so its security boundary is the application's, not the broker's 
(see the [Kafka Streams security model](../security-model-streams)).
 
 ## Reporting Security Issues
 
diff --git a/docs/streams/developer-guide/app-reset-tool.md 
b/docs/streams/developer-guide/app-reset-tool.md
index d5d776e462b..3249e2d8366 100644
--- a/docs/streams/developer-guide/app-reset-tool.md
+++ b/docs/streams/developer-guide/app-reset-tool.md
@@ -28,7 +28,7 @@ type: docs
 
 You can reset an application and force it to reprocess its data from scratch 
by using the application reset tool. This can be useful for development and 
testing, or when fixing bugs.
 
-The application reset tool handles the Kafka Streams [user 
topics](manage-topics.html#streams-developer-guide-topics-user) (input, and 
output) and [internal 
topics](manage-topics.html#streams-developer-guide-topics-internal) differently 
when resetting the application.
+The application reset tool handles the Kafka Streams [user 
topics](../manage-topics#streams-developer-guide-topics-user) (input, and 
output) and [internal 
topics](../manage-topics#streams-developer-guide-topics-internal) differently 
when resetting the application.
 
 Here's what the application reset tool does for each topic type:
 
diff --git a/docs/streams/developer-guide/config-streams.md 
b/docs/streams/developer-guide/config-streams.md
index 80c13125a9b..5c006ddaf8a 100644
--- a/docs/streams/developer-guide/config-streams.md
+++ b/docs/streams/developer-guide/config-streams.md
@@ -1200,7 +1200,7 @@ Added to a windows maintainMs to ensure data is not 
deleted from the log prematu
 <tr>  
 <td>
 
-window.size.ms (Deprecated. See [Window Serdes](datatypes.html#window-serdes) 
for alternatives.)
+window.size.ms (Deprecated. See [Window Serdes](../datatypes#window-serdes) 
for alternatives.)
 </td>  
 <td>
 
@@ -1217,7 +1217,7 @@ Sets window size for the deserializer in order to 
calculate window end times.
 <tr>  
 <td>
 
-windowed.inner.class.serde (Deprecated. See [Window 
Serdes](datatypes.html#window-serdes) for alternatives.)
+windowed.inner.class.serde (Deprecated. See [Window 
Serdes](../datatypes#window-serdes) for alternatives.)
 </td>  
 <td>
 
@@ -1381,7 +1381,7 @@ Serde for the inner class of a windowed record. Must 
implement the `Serde` inter
 > 
 
 > 
-> This is discussed in more detail in [Data types and 
serialization](datatypes.html#streams-developer-guide-serdes).
+> This is discussed in more detail in [Data types and 
serialization](../datatypes#streams-developer-guide-serdes).
 
 ### default.value.serde
 
@@ -1392,7 +1392,7 @@ Serde for the inner class of a windowed record. Must 
implement the `Serde` inter
 > 
 
 > 
-> This is discussed in more detail in [Data types and 
serialization](datatypes.html#streams-developer-guide-serdes).
+> This is discussed in more detail in [Data types and 
serialization](../datatypes#streams-developer-guide-serdes).
 
 ### dsl.store.format {#dsl-store-format}
 
@@ -1493,7 +1493,7 @@ Serde for the inner class of a windowed record. Must 
implement the `Serde` inter
 
 ### num.standby.replicas
 
-> The number of standby replicas. Standby replicas are shadow copies of local 
state stores. Kafka Streams attempts to create the specified number of replicas 
per store and keep them up to date as long as there are enough instances 
running. Standby replicas are used to minimize the latency of task failover. A 
task that was previously running on a failed instance is preferred to restart 
on an instance that has standby replicas so that the local state store 
restoration process from its chan [...]
+> The number of standby replicas. Standby replicas are shadow copies of local 
state stores. Kafka Streams attempts to create the specified number of replicas 
per store and keep them up to date as long as there are enough instances 
running. Standby replicas are used to minimize the latency of task failover. A 
task that was previously running on a failed instance is preferred to restart 
on an instance that has standby replicas so that the local state store 
restoration process from its chan [...]
 > 
 > Recommendation:
 >     Increase the number of standbys to 1 to get instant fail-over, i.e., 
 > high-availability. Increasing the number of standbys requires more 
 > client-side storage space. For example, with 1 standby, 2x space is required.
@@ -1503,7 +1503,7 @@ Serde for the inner class of a windowed record. Must 
implement the `Serde` inter
 
 ### num.stream.threads
 
-> This specifies the number of stream threads in an instance of the Kafka 
Streams application. The stream processing code runs in these threads. For more 
information about Kafka Streams threading model, see [Threading 
Model](../architecture.html#streams_architecture_threads).
+> This specifies the number of stream threads in an instance of the Kafka 
Streams application. The stream processing code runs in these threads. For more 
information about Kafka Streams threading model, see [Threading 
Model](../../architecture#streams_architecture_threads).
 
 ### probing.rebalance.interval.ms
 
@@ -1634,7 +1634,7 @@ Serde for the inner class of a windowed record. Must 
implement the `Serde` inter
 
 ### processing.guarantee
 
-> The processing guarantee that should be used. Possible values are 
`"at_least_once"` (default) and `"exactly_once_v2"` (for EOS version 2). 
Deprecated config options are `"exactly_once"` (for EOS alpha), and 
`"exactly_once_beta"` (for EOS version 2). Using `"exactly_once_v2"` (or the 
deprecated `"exactly_once_beta"`) requires broker version 2.5 or newer, while 
using the deprecated `"exactly_once"` requires broker version 0.11.0 or newer. 
Note that if exactly-once processing is enabled,  [...]
+> The processing guarantee that should be used. Possible values are 
`"at_least_once"` (default) and `"exactly_once_v2"` (for EOS version 2). 
Deprecated config options are `"exactly_once"` (for EOS alpha), and 
`"exactly_once_beta"` (for EOS version 2). Using `"exactly_once_v2"` (or the 
deprecated `"exactly_once_beta"`) requires broker version 2.5 or newer, while 
using the deprecated `"exactly_once"` requires broker version 0.11.0 or newer. 
Note that if exactly-once processing is enabled,  [...]
 > 
 > Recommendation:
 >     While it is technically possible to use EOS with any replication factor, 
 > using a replication factor lower than 3 effectively voids EOS. Thus it is 
 > strongly recommended to use a replication factor of 3 (together with 
 > `min.in.sync.replicas=2`). This recommendation applies to all topics (i.e. 
 > `__transaction_state`, `__consumer_offsets`, Kafka Streams internal topics, 
 > and user topics).
diff --git a/docs/streams/developer-guide/datatypes.md 
b/docs/streams/developer-guide/datatypes.md
index 4e246cf7f1b..dd25b1c697d 100644
--- a/docs/streams/developer-guide/datatypes.md
+++ b/docs/streams/developer-guide/datatypes.md
@@ -80,7 +80,7 @@ If you want to override serdes selectively, i.e., keep the 
defaults for some fie
     KStream<String, Long> userCountByRegion = ...;
     userCountByRegion.to("RegionCountsTopic", 
Produced.valueSerde(Serdes.Long()));
 
-If some of your incoming records are corrupted or ill-formatted, they will 
cause the deserializer class to report an error. Since 1.0.x we have introduced 
an `DeserializationExceptionHandler` interface which allows you to customize 
how to handle such records. The customized implementation of the interface can 
be specified via the `StreamsConfig`. For more details, please feel free to 
read the [Configuring a Streams 
Application](config-streams.html#default-deserialization-exception-handle [...]
+If some of your incoming records are corrupted or ill-formatted, they will 
cause the deserializer class to report an error. Since 1.0.x we have introduced 
an `DeserializationExceptionHandler` interface which allows you to customize 
how to handle such records. The customized implementation of the interface can 
be specified via the `StreamsConfig`. For more details, please feel free to 
read the [Configuring a Streams 
Application](../config-streams#default-deserialization-exception-handler) [...]
 
 # Available Serdes
 
@@ -306,9 +306,9 @@ If you need to implement custom Serdes, your best starting 
point is to take a lo
 
 
 
-# Kafka Streams DSL for Scala Implicit Serdes[](scala-dsl-serdes "Permalink to 
this headline")
+# Kafka Streams DSL for Scala Implicit Serdes[](#scala-dsl-serdes "Permalink 
to this headline")
 
-When using the [Kafka Streams DSL for Scala](dsl-api.html#scala-dsl) you're 
not required to configure a default Serdes. In fact, it's not supported. Serdes 
are instead provided implicitly by default implementations for common primitive 
datatypes. See the [Implicit Serdes](dsl-api.html#scala-dsl-implicit-serdes) 
and [User-Defined Serdes](dsl-api.html#scala-dsl-user-defined-serdes) sections 
in the DSL API documentation for details
+When using the [Kafka Streams DSL for Scala](../dsl-api#scala-dsl) you're not 
required to configure a default Serdes. In fact, it's not supported. Serdes are 
instead provided implicitly by default implementations for common primitive 
datatypes. See the [Implicit Serdes](../dsl-api#scala-dsl-implicit-serdes) and 
[User-Defined Serdes](../dsl-api#scala-dsl-user-defined-serdes) sections in the 
DSL API documentation for details
 
   * [Documentation](/documentation)
   * [Kafka Streams](/documentation/streams)
diff --git a/docs/streams/developer-guide/dsl-api.md 
b/docs/streams/developer-guide/dsl-api.md
index 6f5fc67f555..6ed4e375784 100644
--- a/docs/streams/developer-guide/dsl-api.md
+++ b/docs/streams/developer-guide/dsl-api.md
@@ -58,18 +58,18 @@ The Kafka Streams DSL (Domain Specific Language) is built 
on top of the Streams
 
 # Overview
 
-In comparison to the [Processor 
API](processor-api.html#streams-developer-guide-processor-api), only the DSL 
supports:
+In comparison to the [Processor 
API](../processor-api#streams-developer-guide-processor-api), only the DSL 
supports:
 
-  * Built-in abstractions for [streams and 
tables](../core-concepts.html#streams_concepts_duality) in the form of KStream, 
KTable, and GlobalKTable. Having first-class support for streams and tables is 
crucial because, in practice, most use cases require not just either streams or 
databases/tables, but a combination of both. For example, if your use case is 
to create a customer 360-degree view that is updated in real-time, what your 
application will be doing is transforming many input _s [...]
+  * Built-in abstractions for [streams and 
tables](../../core-concepts#streams_concepts_duality) in the form of KStream, 
KTable, and GlobalKTable. Having first-class support for streams and tables is 
crucial because, in practice, most use cases require not just either streams or 
databases/tables, but a combination of both. For example, if your use case is 
to create a customer 360-degree view that is updated in real-time, what your 
application will be doing is transforming many input _str [...]
   * Declarative, functional programming style with stateless transformations 
(e.g. `map` and `filter`) as well as stateful transformations such as 
aggregations (e.g. `count` and `reduce`), joins (e.g. `leftJoin`), and 
windowing (e.g. session windows).
 
 
 
-With the DSL, you can define [processor 
topologies](../core-concepts.html#streams_topology) (i.e., the logical 
processing plan) in your application. The steps to accomplish this are:
+With the DSL, you can define [processor 
topologies](../../core-concepts#streams_topology) (i.e., the logical processing 
plan) in your application. The steps to accomplish this are:
 
   1. Specify one or more input streams that are read from Kafka topics.
   2. Compose transformations on these streams.
-  3. Write the resulting output streams back to Kafka topics, or expose the 
processing results of your application directly to other applications through 
[interactive 
queries](interactive-queries.html#streams-developer-guide-interactive-queries) 
(e.g., via a REST API).
+  3. Write the resulting output streams back to Kafka topics, or expose the 
processing results of your application directly to other applications through 
[interactive 
queries](../interactive-queries#streams-developer-guide-interactive-queries) 
(e.g., via a REST API).
 
 
 
@@ -105,7 +105,7 @@ If your stream processing application were to sum the 
values per user, it would
 
 However, it would not be safe to enable log compaction in the case of a 
KStream because, as soon as log compaction would begin purging older data 
records of the same key, it would break the semantics of the data. To pick up 
the illustration example again, you'd suddenly get a `3` for `alice` instead of 
a `4` because log compaction would have removed the `("alice", 1)` data record. 
Hence log compaction is perfectly safe for a KTable (changelog stream) but it 
is a mistake for a KStream (re [...]
 
-We have already seen an example of a changelog stream in the section [streams 
and tables](../core-concepts.html#streams_concepts_duality). Another example 
are change data capture (CDC) records in the changelog of a relational 
database, representing which row in a database table was inserted, updated, or 
deleted. 
+We have already seen an example of a changelog stream in the section [streams 
and tables](../../core-concepts#streams_concepts_duality). Another example are 
change data capture (CDC) records in the changelog of a relational database, 
representing which row in a database table was inserted, updated, or deleted. 
 
 KTable also provides an ability to look up _current_ values of data records by 
keys. This table-lookup functionality is available through **join operations** 
(see also **Joining** in the Developer Guide) as well as through **Interactive 
Queries**. 
 
@@ -185,9 +185,9 @@ In the case of a KStream, the local KStream instance of 
every application instan
           Serdes.Long()   /* value serde */
         );
 
-If you do not specify Serdes explicitly, the default Serdes from the 
[configuration](config-streams.html#streams-developer-guide-configuration) are 
used.
+If you do not specify Serdes explicitly, the default Serdes from the 
[configuration](../config-streams#streams-developer-guide-configuration) are 
used.
 
-You **must specify Serdes explicitly** if the key or value types of the 
records in the Kafka input topics do not match the configured default Serdes. 
For information about configuring default Serdes, available Serdes, and 
implementing your own custom Serdes see [Data Types and 
Serialization](datatypes.html#streams-developer-guide-serdes).
+You **must specify Serdes explicitly** if the key or value types of the 
records in the Kafka input topics do not match the configured default Serdes. 
For information about configuring default Serdes, available Serdes, and 
implementing your own custom Serdes see [Data Types and 
Serialization](../datatypes#streams-developer-guide-serdes).
 
 Several variants of `stream` exist. For example, you can specify a regex 
pattern for input topics to read from (note that all matching topics will be 
part of the same input topic group, and the work will not be parallelized for 
different topics if subscribed to in this way).
 
@@ -212,11 +212,11 @@ Reads the specified Kafka input topic into a KTable. The 
topic is interpreted as
 
 In the case of a KTable, the local KTable instance of every application 
instance will be populated with data from only **a subset** of the partitions 
of the input topic. Collectively, across all application instances, all input 
topic partitions are read and processed.
 
-You must provide a name for the table (more precisely, for the internal [state 
store](../architecture.html#streams_architecture_state) that backs the table). 
This is required for supporting [interactive 
queries](interactive-queries.html#streams-developer-guide-interactive-queries) 
against the table. When a name is not provided the table will not be queryable 
and an internal name will be provided for the state store.
+You must provide a name for the table (more precisely, for the internal [state 
store](../../architecture#streams_architecture_state) that backs the table). 
This is required for supporting [interactive 
queries](../interactive-queries#streams-developer-guide-interactive-queries) 
against the table. When a name is not provided the table will not be queryable 
and an internal name will be provided for the state store.
 
-If you do not specify Serdes explicitly, the default Serdes from the 
[configuration](config-streams.html#streams-developer-guide-configuration) are 
used.
+If you do not specify Serdes explicitly, the default Serdes from the 
[configuration](../config-streams#streams-developer-guide-configuration) are 
used.
 
-You **must specify Serdes explicitly** if the key or value types of the 
records in the Kafka input topics do not match the configured default Serdes. 
For information about configuring default Serdes, available Serdes, and 
implementing your own custom Serdes see [Data Types and 
Serialization](datatypes.html#streams-developer-guide-serdes).
+You **must specify Serdes explicitly** if the key or value types of the 
records in the Kafka input topics do not match the configured default Serdes. 
For information about configuring default Serdes, available Serdes, and 
implementing your own custom Serdes see [Data Types and 
Serialization](../datatypes#streams-developer-guide-serdes).
 
 Several variants of `table` exist, for example to specify the 
`auto.offset.reset` policy to be used when reading from the input topic.
 
@@ -241,7 +241,7 @@ Reads the specified Kafka input topic into a GlobalKTable. 
The topic is interpre
 
 In the case of a GlobalKTable, the local GlobalKTable instance of every 
application instance will be populated with data from **all** the partitions of 
the input topic.
 
-You must provide a name for the table (more precisely, for the internal [state 
store](../architecture.html#streams_architecture_state) that backs the table). 
This is required for supporting [interactive 
queries](interactive-queries.html#streams-developer-guide-interactive-queries) 
against the table. When a name is not provided the table will not be queryable 
and an internal name will be provided for the state store.
+You must provide a name for the table (more precisely, for the internal [state 
store](../../architecture#streams_architecture_state) that backs the table). 
This is required for supporting [interactive 
queries](../interactive-queries#streams-developer-guide-interactive-queries) 
against the table. When a name is not provided the table will not be queryable 
and an internal name will be provided for the state store.
     
     
     import org.apache.kafka.common.serialization.Serdes;
@@ -258,7 +258,7 @@ You must provide a name for the table (more precisely, for 
the internal [state s
           .withValueSerde(Serdes.Long()) /* value serde */
         );
 
-You **must specify Serdes explicitly** if the key or value types of the 
records in the Kafka input topics do not match the configured default Serdes. 
For information about configuring default Serdes, available Serdes, and 
implementing your own custom Serdes see [Data Types and 
Serialization](datatypes.html#streams-developer-guide-serdes).
+You **must specify Serdes explicitly** if the key or value types of the 
records in the Kafka input topics do not match the configured default Serdes. 
For information about configuring default Serdes, available Serdes, and 
implementing your own custom Serdes see [Data Types and 
Serialization](../datatypes#streams-developer-guide-serdes).
 
 Several variants of `globalTable` exist to e.g. specify explicit Serdes.
 
@@ -271,7 +271,7 @@ The KStream and KTable interfaces support a variety of 
transformation operations
 
 Some KStream transformations may generate one or more KStream objects, for 
example: \- `filter` and `map` on a KStream will generate another KStream \- 
`split` on KStream can generate multiple KStreams
 
-Some others may generate a KTable object, for example an aggregation of a 
KStream also yields a KTable. This allows Kafka Streams to continuously update 
the computed value upon arrivals of [out-of-order 
records](../core-concepts.html#streams_concepts_aggregations) after it has 
already been produced to the downstream transformation operators.
+Some others may generate a KTable object, for example an aggregation of a 
KStream also yields a KTable. This allows Kafka Streams to continuously update 
the computed value upon arrivals of [out-of-order 
records](../../core-concepts#streams_concepts_aggregations) after it has 
already been produced to the downstream transformation operators.
 
 All KTable transformation operations can only generate another KTable. 
However, the Kafka Streams DSL does provide a special function that converts a 
KTable representation into a KStream. All of these transformation methods can 
be chained together to compose a complex processor topology.
 
@@ -284,7 +284,7 @@ These transformation operations are described in the 
following subsections:
 
 ## Stateless transformations
 
-Stateless transformations do not require state for processing and they do not 
require a state store associated with the stream processor. Kafka 0.11.0 and 
later allows you to materialize the result from a stateless `KTable` 
transformation. This allows the result to be queried through [interactive 
queries](interactive-queries.html#streams-developer-guide-interactive-queries). 
To materialize a `KTable`, each of the below stateless operations [can be 
augmented](interactive-queries.html#stre [...]
+Stateless transformations do not require state for processing and they do not 
require a state store associated with the stream processor. Kafka 0.11.0 and 
later allows you to materialize the result from a stateless `KTable` 
transformation. This allows the result to be queried through [interactive 
queries](../interactive-queries#streams-developer-guide-interactive-queries). 
To materialize a `KTable`, each of the below stateless operations [can be 
augmented](../interactive-queries#streams- [...]
   
 <table>  
 <tr>  
@@ -915,7 +915,7 @@ Kafka Streams will manage the topic for `repartition()`. 
Generated topic is trea
 
 ## Stateful transformations
 
-Stateful transformations depend on state for processing inputs and producing 
outputs and require a [state 
store](../architecture.html#streams_architecture_state) associated with the 
stream processor. For example, in aggregating operations, a windowing state 
store is used to collect the latest aggregation results per window. In join 
operations, a windowing state store is used to collect all of the records 
received so far within the defined window boundary.
+Stateful transformations depend on state for processing inputs and producing 
outputs and require a [state 
store](../../architecture#streams_architecture_state) associated with the 
stream processor. For example, in aggregating operations, a windowing state 
store is used to collect the latest aggregation results per window. In join 
operations, a windowing state store is used to collect all of the records 
received so far within the defined window boundary.
 
 **Note:** Following store types are used regardless of the possibly specified 
type (via the parameter `materialized`): 
 
@@ -925,7 +925,7 @@ Stateful transformations depend on state for processing 
inputs and producing out
 
 
 
-**Headers-aware state stores 
([KIP-1285](https://cwiki.apache.org/confluence/x/4ow8G)):** Set 
[`dsl.store.format=HEADERS`](config-streams.html#dsl-store-format) to make 
supported DSL operators use headers-aware state stores. These stores can keep 
record headers together with the value and timestamp.
+**Headers-aware state stores 
([KIP-1285](https://cwiki.apache.org/confluence/x/4ow8G)):** Set 
[`dsl.store.format=HEADERS`](../config-streams#dsl-store-format) to make 
supported DSL operators use headers-aware state stores. These stores can keep 
record headers together with the value and timestamp.
 
 This config only changes the state store format. It does not define how DSL 
operators create headers for output records. Current behavior is:
 
@@ -935,7 +935,7 @@ This config only changes the state store format. It does 
not define how DSL oper
 
 A follow-up KIP will define how DSL result headers are computed.
 
-Note, that state stores are fault-tolerant. In case of failure, Kafka Streams 
guarantees to fully restore all state stores prior to resuming the processing. 
See [Fault Tolerance](../architecture.html#streams_architecture_recovery) for 
further information.
+Note, that state stores are fault-tolerant. In case of failure, Kafka Streams 
guarantees to fully restore all state stores prior to resuming the processing. 
See [Fault Tolerance](../../architecture#streams_architecture_recovery) for 
further information.
 
 Available stateful transformations in the DSL include:
 
@@ -1348,7 +1348,7 @@ See the example at the bottom of this section for a 
visualization of the aggrega
 
 **Note**
 
-**Impact of record caches** : For illustration purposes, the column "KTable 
`aggregated`" below shows the table's state changes over time in a very 
granular way. In practice, you would observe state changes in such a granular 
way only when [record 
caches](memory-mgmt.html#streams-developer-guide-memory-management-record-cache)
 are disabled (default: enabled). When record caches are enabled, what might 
happen for example is that the output results of the rows with timestamps 4 and 
5 would [...]
+**Impact of record caches** : For illustration purposes, the column "KTable 
`aggregated`" below shows the table's state changes over time in a very 
granular way. In practice, you would observe state changes in such a granular 
way only when [record 
caches](../memory-mgmt#streams-developer-guide-memory-management-record-cache) 
are disabled (default: enabled). When record caches are enabled, what might 
happen for example is that the output results of the rows with timestamps 4 and 
5 would b [...]
   
 <table>  
 <tr>  
@@ -1608,7 +1608,7 @@ State
 
 **Note**
 
-**Impact of record caches** : For illustration purposes, the column "KTable 
`aggregated`" below shows the table's state changes over time in a very 
granular way. In practice, you would observe state changes in such a granular 
way only when [record 
caches](memory-mgmt.html#streams-developer-guide-memory-management-record-cache)
 are disabled (default: enabled). When record caches are enabled, what might 
happen for example is that the output results of the rows with timestamps 4 and 
5 would [...]
+**Impact of record caches** : For illustration purposes, the column "KTable 
`aggregated`" below shows the table's state changes over time in a very 
granular way. In practice, you would observe state changes in such a granular 
way only when [record 
caches](../memory-mgmt#streams-developer-guide-memory-management-record-cache) 
are disabled (default: enabled). When record caches are enabled, what might 
happen for example is that the output results of the rows with timestamps 4 and 
5 would b [...]
   
 <table>  
 <tr>  
@@ -2127,7 +2127,7 @@ There are two exceptions where co-partitioning is not 
required. For KStream-Glob
 
 KStream-KStream joins are always windowed joins, because otherwise the size of 
the internal state store used to perform the join - e.g., a sliding window or 
"buffer" - would grow indefinitely.
 
-**Note on headers-aware state stores:** With 
[`dsl.store.format=HEADERS`](config-streams.html#dsl-store-format), inner 
stream-stream joins use headers-aware join window stores. Left and outer 
stream-stream joins also use a separate buffer store for not-yet-matched 
records, and that buffer is not headers-aware. Records that pass through this 
buffer lose their headers.
+**Note on headers-aware state stores:** With 
[`dsl.store.format=HEADERS`](../config-streams#dsl-store-format), inner 
stream-stream joins use headers-aware join window stores. Left and outer 
stream-stream joins also use a separate buffer store for not-yet-matched 
records, and that buffer is not headers-aware. Records that pass through this 
buffer lose their headers.
 
 Join output records do not get computed or merged headers. The current 
forwarding path may carry the headers from the record that triggered the 
output. For stream-stream joins it's important to highlight that a new input 
record on one side will produce a join output _for each_ matching record on the 
other side, and there can be _multiple_ such matching records in a given join 
window (cf. the row with timestamp 15 in the join semantics table below, for 
example).
 
@@ -4462,7 +4462,7 @@ Windowing lets you control how to group records that have 
the same key for state
 
 A related operation is grouping, which groups all records that have the same 
key to ensure that data is properly partitioned ("keyed") for subsequent 
operations. Once grouped, windowing allows you to further sub-group the records 
of a key.
 
-For example, in join operations, a windowing state store is used to store all 
the records received so far within the defined window boundary. In aggregating 
operations, a windowing state store is used to store the latest aggregation 
results per window. Old records in the state store are purged after the 
specified [window retention 
period](../core-concepts.html#streams_concepts_windowing). Kafka Streams 
guarantees to keep a window for at least this specified time; the default value 
is one [...]
+For example, in join operations, a windowing state store is used to store all 
the records received so far within the defined window boundary. In aggregating 
operations, a windowing state store is used to store the latest aggregation 
results per window. Old records in the state store are purged after the 
specified [window retention 
period](../../core-concepts#streams_concepts_windowing). Kafka Streams 
guarantees to keep a window for at least this specified time; the default value 
is one d [...]
 
 The DSL supports the following types of windows:  
   
@@ -4673,7 +4673,7 @@ The key parts of this program are:
 
 One thing to note is that suppression is just like any other Kafka Streams 
operator, so you can build a topology with two branches emerging from the 
`count`, one suppressed, and one not, or even multiple differently configured 
suppressions. This allows you to apply suppressions where they are needed and 
otherwise rely on the default continuous update behavior. 
 
-**Note on headers-aware state stores:** `suppress()` uses an in-memory buffer 
that is not headers-aware. Record headers attached to upstream records are not 
preserved across the suppression boundary, even when 
[`dsl.store.format=HEADERS`](config-streams.html#dsl-store-format) is set 
globally per [KIP-1285](https://cwiki.apache.org/confluence/x/4ow8G).
+**Note on headers-aware state stores:** `suppress()` uses an in-memory buffer 
that is not headers-aware. Record headers attached to upstream records are not 
preserved across the suppression boundary, even when 
[`dsl.store.format=HEADERS`](../config-streams#dsl-store-format) is set 
globally per [KIP-1285](https://cwiki.apache.org/confluence/x/4ow8G).
 
 For more detailed information, see the JavaDoc on the `Suppressed` config 
object and [KIP-328](https://cwiki.apache.org/confluence/x/sQU0BQ "KIP-328"). 
 
@@ -5621,7 +5621,7 @@ By automating the detection of popular pages, the system 
eliminates the need for
         }
     }
 
-Naming Operators in a Streams DSL application Kafka Streams allows you to 
[name processors](dsl-topology-naming.html) created via the Streams DSL 
+Naming Operators in a Streams DSL application Kafka Streams allows you to 
[name processors](../dsl-topology-naming) created via the Streams DSL 
 
 # Controlling KTable emit rate
 
@@ -5629,7 +5629,7 @@ A KTable is logically a continuously updated table. These 
updates make their way
 
 However, some applications need to take other actions, such as calling out to 
external systems, and therefore need to exercise some control over the rate of 
invocations, for example of `KStream#foreach`. 
 
-Rather than achieving this as a side-effect of the [KTable record 
cache](memory-mgmt.html#streams-developer-guide-memory-management-record-cache),
 you can directly impose a rate limit via the `KTable#suppress` operator. 
+Rather than achieving this as a side-effect of the [KTable record 
cache](../memory-mgmt#streams-developer-guide-memory-management-record-cache), 
you can directly impose a rate limit via the `KTable#suppress` operator. 
 
 For example: 
     
@@ -5713,9 +5713,9 @@ Description
 
 When to provide serdes explicitly:
 
-  * If you do not specify Serdes explicitly, the default Serdes from the 
[configuration](config-streams.html#streams-developer-guide-configuration) are 
used.
+  * If you do not specify Serdes explicitly, the default Serdes from the 
[configuration](../config-streams#streams-developer-guide-configuration) are 
used.
   * You **must specify Serdes explicitly** via the `Produced` class if the key 
and/or value types of the `KStream` do not match the configured default Serdes.
-  * See [Data Types and 
Serialization](datatypes.html#streams-developer-guide-serdes) for information 
about configuring default Serdes, available Serdes, and implementing your own 
custom Serdes.
+  * See [Data Types and 
Serialization](../datatypes#streams-developer-guide-serdes) for information 
about configuring default Serdes, available Serdes, and implementing your own 
custom Serdes.
 
 
 
@@ -5746,11 +5746,11 @@ Another variant of `to` exists that enables you to 
dynamically choose which topi
 
 **Note**
 
-**When you want to write to systems other than Kafka:** Besides writing the 
data back to Kafka, you can also apply a custom processor as a stream sink at 
the end of the processing to, for example, write to external databases. First, 
doing so is not a recommended pattern - we strongly suggest to use the [Kafka 
Connect API](../../connect/index.html#kafka-connect) instead. However, if you 
do use such a sink processor, please be aware that it is now your 
responsibility to guarantee message d [...]
+**When you want to write to systems other than Kafka:** Besides writing the 
data back to Kafka, you can also apply a custom processor as a stream sink at 
the end of the processing to, for example, write to external databases. First, 
doing so is not a recommended pattern - we strongly suggest to use the [Kafka 
Connect API](../../../kafka-connect/#kafka-connect) instead. However, if you do 
use such a sink processor, please be aware that it is now your responsibility 
to guarantee message de [...]
 
 # Testing a Streams application
 
-Kafka Streams comes with a `test-utils` module to help you test your 
application [here](testing.html). 
+Kafka Streams comes with a `test-utils` module to help you test your 
application [here](../testing). 
 
 # Kafka Streams DSL for Scala
 
diff --git a/docs/streams/developer-guide/interactive-queries.md 
b/docs/streams/developer-guide/interactive-queries.md
index d3fed2f4a14..53d3100cf40 100644
--- a/docs/streams/developer-guide/interactive-queries.md
+++ b/docs/streams/developer-guide/interactive-queries.md
@@ -31,7 +31,7 @@ Interactive queries allow you to leverage the state of your 
application from out
 
 
 
-The full state of your application is typically [split across many distributed 
instances of your 
application](../architecture.html#streams_architecture_state), and across many 
state stores that are managed locally by these application instances.
+The full state of your application is typically [split across many distributed 
instances of your application](../../architecture#streams_architecture_state), 
and across many state stores that are managed locally by these application 
instances.
 
 ![](/43/images/streams-interactive-queries-03.png)
 
@@ -125,7 +125,7 @@ Not supported (you must configure)
 
 # Querying local state stores for an app instance 
{#querying-local-state-stores-for-an-app-instance}
 
-A Kafka Streams application typically runs on multiple instances. The state 
that is locally available on any given instance is only a subset of the 
[application's entire state](../architecture.html#streams-architecture-state). 
Querying the local stores on an instance will only return data locally 
available on that particular instance.
+A Kafka Streams application typically runs on multiple instances. The state 
that is locally available on any given instance is only a subset of the 
[application's entire state](../../architecture#streams-architecture-state). 
Querying the local stores on an instance will only return data locally 
available on that particular instance.
 
 The method `KafkaStreams#store(...)` finds an application instance's local 
state stores by name and type. Note that interactive queries are not supported 
for [versioned state 
stores](/{version}/streams/developer-guide/processor-api/#versioned-key-value-state-stores)
 at this time.
 
@@ -396,7 +396,7 @@ There are many ways to add an RPC layer. The only 
requirements are that the RPC
 
 ## Exposing the RPC endpoints of your application
 
-To enable remote state store discovery in a distributed Kafka Streams 
application, you must set the [configuration 
property](config-streams.html#streams-developer-guide-required-configs) in the 
config properties. The `application.server` property defines a unique 
`host:port` pair that points to the RPC endpoint of the respective instance of 
a Kafka Streams application. The value of this configuration property will vary 
across the instances of your application. When this property is set,  [...]
+To enable remote state store discovery in a distributed Kafka Streams 
application, you must set the [configuration 
property](../config-streams#streams-developer-guide-required-configs) in the 
config properties. The `application.server` property defines a unique 
`host:port` pair that points to the RPC endpoint of the respective instance of 
a Kafka Streams application. The value of this configuration property will vary 
across the instances of your application. When this property is set, Ka [...]
 
 **Tip**
 
diff --git a/docs/streams/developer-guide/manage-topics.md 
b/docs/streams/developer-guide/manage-topics.md
index 1a16e7ab229..aac4ab745e4 100644
--- a/docs/streams/developer-guide/manage-topics.md
+++ b/docs/streams/developer-guide/manage-topics.md
@@ -39,7 +39,7 @@ Input topics
 Output topics
     Topics that are specified via sink processors in the application's 
topology; e.g. via `KStream#to()`, `KTable.to()` and `Topology#addSink()`.
 
-User topics must be created and manually managed ahead of time (e.g., via the 
[topic tools](../../kafka/post-deployment.html#kafka-operations-admin)). If 
user topics are shared among multiple applications for reading and writing, the 
application users must coordinate topic management. If user topics are 
centrally managed, then application users would not need to manage topics 
themselves but simply obtain access to them.
+User topics must be created and manually managed ahead of time (e.g., via the 
[topic 
tools](../../../operations/basic-kafka-operations/#kafka-operations-admin)). If 
user topics are shared among multiple applications for reading and writing, the 
application users must coordinate topic management. If user topics are 
centrally managed, then application users would not need to manage topics 
themselves but simply obtain access to them.
 
 Note
 
@@ -54,7 +54,7 @@ You should not use the auto-create topic feature on the 
brokers to create user t
 
 Internal topics are used internally by the Kafka Streams application while 
executing, for example the changelog topics for state stores. These topics are 
created by the application and are only used by that stream application.
 
-If security is enabled on the Kafka brokers, you must grant the underlying 
clients admin permissions so that they can create internal topics set. For more 
information, see [Streams 
Security](security.html#streams-developer-guide-security).
+If security is enabled on the Kafka brokers, you must grant the underlying 
clients admin permissions so that they can create internal topics set. For more 
information, see [Streams 
Security](../security#streams-developer-guide-security).
 
 Note
 
diff --git a/docs/streams/developer-guide/memory-mgmt.md 
b/docs/streams/developer-guide/memory-mgmt.md
index c63f997d16e..b79a7348ddd 100644
--- a/docs/streams/developer-guide/memory-mgmt.md
+++ b/docs/streams/developer-guide/memory-mgmt.md
@@ -38,20 +38,20 @@ The record caches are implemented slightly different in the 
DSL and Processor AP
 You can specify the total memory (RAM) size of the record cache for an 
instance of the processing topology. It is leveraged by the following `KTable` 
instances:
 
   * Source `KTable`: `KTable` instances that are created via 
`StreamsBuilder#table()` or `StreamsBuilder#globalTable()`.
-  * Aggregation `KTable`: instances of `KTable` that are created as a result 
of [aggregations](dsl-api.html#streams-developer-guide-dsl-aggregating).
+  * Aggregation `KTable`: instances of `KTable` that are created as a result 
of [aggregations](../dsl-api#streams-developer-guide-dsl-aggregating).
 
 
 
 For such `KTable` instances, the record cache is used for:
 
-  * Internal caching and compacting of output records before they are written 
by the underlying stateful [processor 
node](../core-concepts#streams_processor_node) to its internal state stores.
-  * Internal caching and compacting of output records before they are 
forwarded from the underlying stateful [processor 
node](../core-concepts#streams_processor_node) to any of its downstream 
processor nodes.
+  * Internal caching and compacting of output records before they are written 
by the underlying stateful [processor 
node](../../core-concepts#streams_processor_node) to its internal state stores.
+  * Internal caching and compacting of output records before they are 
forwarded from the underlying stateful [processor 
node](../../core-concepts#streams_processor_node) to any of its downstream 
processor nodes.
 
 
 
 Use the following example to understand the behaviors with and without record 
caching. In this example, the input is a `KStream<String, Integer>` with the 
records `<K,V>: <A, 1>, <D, 5>, <A, 20>, <A, 300>`. The focus in this example 
is on the records with key == `A`.
 
-  * An [aggregation](dsl-api.html#streams-developer-guide-dsl-aggregating) 
computes the sum of record values, grouped by key, for the input and returns a 
`KTable<String, Integer>`.
+  * An [aggregation](../dsl-api#streams-developer-guide-dsl-aggregating) 
computes the sum of record values, grouped by key, for the input and returns a 
`KTable<String, Integer>`.
 
 >     * **Without caching** : a sequence of output records is emitted for key 
 > `A` that represent changes in the resulting aggregation table. The 
 > parentheses (`()`) denote changes, the left number is the new aggregate 
 > value and the right number is the old aggregate value: `<A, (1, null)>, <A, 
 > (21, 1)>, <A, (321, 21)>`.
 >     * **With caching** : a single output record is emitted for key `A` that 
 > would likely be compacted in the cache, leading to a single output record of 
 > `<A, (321, null)>`. This record is written to the aggregation's internal 
 > state store and forwarded to any downstream operations.
@@ -112,7 +112,7 @@ You can specify the total memory (RAM) size of the record 
cache for an instance
 
 The record cache in the Processor API does not cache or compact any output 
records that are being forwarded downstream. This means that all downstream 
processor nodes can see all records, whereas the state stores see a reduced 
number of records. This does not impact correctness of the system, but is a 
performance optimization for the state stores. For example, with the Processor 
API you can store a record in a state store while forwarding a different value 
downstream.
 
-Following from the example first shown in section [State 
Stores](processor-api.html#streams-developer-guide-state-store), to disable 
caching, you can add the `withCachingDisabled` call (note that caches are 
enabled by default, however there is an explicit `withCachingEnabled` call).
+Following from the example first shown in section [State 
Stores](../processor-api#streams-developer-guide-state-store), to disable 
caching, you can add the `withCachingDisabled` call (note that caches are 
enabled by default, however there is an explicit `withCachingEnabled` call).
     
     
     StoreBuilder countStoreBuilder =
@@ -122,7 +122,7 @@ Following from the example first shown in section [State 
Stores](processor-api.h
         Serdes.Long())
       .withCachingEnabled();
 
-Record caches are not supported for [versioned state 
stores](processor-api.html#streams-developer-guide-state-store-versioned).
+Record caches are not supported for [versioned state 
stores](../processor-api#streams-developer-guide-state-store-versioned).
 
 To avoid reading stale data, you can `flush()` the store before creating the 
iterator. Note, that flushing too often can lead to performance degradation if 
RocksDB is used, so we advise to avoid flushing manually in general.
 
diff --git a/docs/streams/developer-guide/processor-api.md 
b/docs/streams/developer-guide/processor-api.md
index 5bfb25cec4a..a35e4f6e43d 100644
--- a/docs/streams/developer-guide/processor-api.md
+++ b/docs/streams/developer-guide/processor-api.md
@@ -37,13 +37,13 @@ The Processor API can be used to implement both 
**stateless** as well as **state
 
 **Tip**
 
-**Combining the DSL and the Processor API:** You can combine the convenience 
of the DSL with the power and flexibility of the Processor API as described in 
the section [Applying processors (Processor API 
integration)](dsl-api.html#streams-developer-guide-dsl-process).
+**Combining the DSL and the Processor API:** You can combine the convenience 
of the DSL with the power and flexibility of the Processor API as described in 
the section [Applying processors (Processor API 
integration)](../dsl-api#streams-developer-guide-dsl-process).
 
 For a complete list of available API functionality, see the 
[Streams](/{version}/javadoc/org/apache/kafka/streams/package-summary.html) API 
docs.
 
 # Defining a Stream Processor
 
-A [stream processor](../core-concepts.html#streams_processor_node) is a node 
in the processor topology that represents a single processing step. With the 
Processor API, you can define arbitrary stream processors that processes one 
received record at a time, and connect these processors with their associated 
state stores to compose the processor topology.
+A [stream processor](../../core-concepts#streams_processor_node) is a node in 
the processor topology that represents a single processing step. With the 
Processor API, you can define arbitrary stream processors that processes one 
received record at a time, and connect these processors with their associated 
state stores to compose the processor topology.
 
 You can define a customized stream processor by implementing the `Processor` 
interface, which provides the `process()` API method. The `process()` method is 
called on each of the received records.
 
@@ -53,7 +53,7 @@ The `Processor` interface takes four generic parameters: 
`KIn, VIn, KOut, VOut`.
 
 Both the `Processor#process()` and the `ProcessorContext#forward()` methods 
handle records in the form of the `Record<K, V>` data class. This class gives 
you access to the main components of a Kafka record: the key, value, timestamp 
and headers. When forwarding records, you can use the constructor to create a 
new `Record` from scratch, or you can use the convenience builder methods to 
replace one of the `Record`'s properties and copy over the rest. For example, 
`inputRecord.withValue(new [...]
 
-In addition to handling incoming records via `Processor#process()`, you have 
the option to schedule periodic invocation (called "punctuation") in your 
processor's `init()` method by calling `ProcessorContext#schedule()` and 
passing it a `Punctuator`. The `PunctuationType` determines what notion of time 
is used for the punctuation scheduling: either 
[stream-time](../core-concepts.html#streams_time) or wall-clock-time (by 
default, stream-time is configured to represent event-time via `Time [...]
+In addition to handling incoming records via `Processor#process()`, you have 
the option to schedule periodic invocation (called "punctuation") in your 
processor's `init()` method by calling `ProcessorContext#schedule()` and 
passing it a `Punctuator`. The `PunctuationType` determines what notion of time 
is used for the punctuation scheduling: either 
[stream-time](../../core-concepts#streams_time) or wall-clock-time (by default, 
stream-time is configured to represent event-time via `Timest [...]
 
 For example, if you schedule a `Punctuator` function every 10 seconds based on 
`PunctuationType.STREAM_TIME` and if you process a stream of 60 records with 
consecutive timestamps from 1 (first record) to 60 seconds (last record), then 
`punctuate()` would be called 6 times. This happens regardless of the time 
required to actually process those records. `punctuate()` would be called 6 
times regardless of whether processing these 60 records takes a second, a 
minute, or an hour.
 
@@ -118,11 +118,11 @@ The following example `Processor` defines a simple 
word-count algorithm and the
 
 # Unit Testing Processors
 
-Kafka Streams comes with a `test-utils` module to help you write unit tests 
for your processors [here](testing.html#unit-testing-processors). 
+Kafka Streams comes with a `test-utils` module to help you write unit tests 
for your processors [here](../testing#unit-testing-processors). 
 
 # State Stores
 
-To implement a **stateful** `Processor`, you must provide one or more state 
stores to the processor (_stateless_ processors do not need state stores). 
State stores can be used to remember recently received input records, to track 
rolling aggregates, to de-duplicate input records, and more. Another feature of 
state stores is that they can be [interactively 
queried](interactive-queries.html#streams-developer-guide-interactive-queries) 
from other applications, such as a NodeJS-based dashboa [...]
+To implement a **stateful** `Processor`, you must provide one or more state 
stores to the processor (_stateless_ processors do not need state stores). 
State stores can be used to remember recently received input records, to track 
rolling aggregates, to de-duplicate input records, and more. Another feature of 
state stores is that they can be [interactively 
queried](../interactive-queries#streams-developer-guide-interactive-queries) 
from other applications, such as a NodeJS-based dashboard [...]
 
 The available state store types in Kafka Streams have fault tolerance enabled 
by default.
 
@@ -172,7 +172,7 @@ Yes (enabled by default)
   * **The recommended store type for most use cases.**
   * Stores its data on local disk.
   * Storage capacity: managed local state can be larger than the memory (heap 
space) of an application instance, but must fit into the available local disk 
space.
-  * RocksDB settings can be fine-tuned, see [RocksDB 
configuration](config-streams.html#streams-developer-guide-rocksdb-config).
+  * RocksDB settings can be fine-tuned, see [RocksDB 
configuration](../config-streams#streams-developer-guide-rocksdb-config).
   * Available [persistent store 
variants](<https://kafka.apache.org/{version}/javadoc/org/apache/kafka/streams/state/Stores.html#persistentKeyValueStore(java.lang.String)>):
 plain key-value store (values only — no embedded record timestamp in state), 
timestamped key-value store, versioned key-value store, windowed store, session 
store. Header-aware variants are also described below.
   * Use 
[persistentKeyValueStore](<https://kafka.apache.org/{version}/javadoc/org/apache/kafka/streams/state/Stores.html#persistentKeyValueStore(java.lang.String)>)
 when you need a persistent plain key-value store (no embedded record 
timestamp).
   * Use 
[persistentTimestampedKeyValueStore](<https://kafka.apache.org/{version}/javadoc/org/apache/kafka/streams/state/Stores.html#persistentTimestampedKeyValueStore(java.lang.String)>)
 when you need a persistent key-(value/timestamp) store that supports 
put/get/delete and range queries.
@@ -248,7 +248,7 @@ Yes (enabled by default)
 
 ## Fault-tolerant State Stores
 
-To make state stores fault-tolerant and to allow for state store migration 
without data loss, a state store can be continuously backed up to a Kafka topic 
behind the scenes. For example, to migrate a stateful stream task from one 
machine to another when [elastically adding or removing capacity from your 
application](running-app.html#streams-developer-guide-execution-scaling). This 
topic is sometimes referred to as the state store's associated _changelog 
topic_ , or its _changelog_. For e [...]
+To make state stores fault-tolerant and to allow for state store migration 
without data loss, a state store can be continuously backed up to a Kafka topic 
behind the scenes. For example, to migrate a stateful stream task from one 
machine to another when [elastically adding or removing capacity from your 
application](../running-app#streams-developer-guide-execution-scaling). This 
topic is sometimes referred to as the state store's associated _changelog 
topic_ , or its _changelog_. For exa [...]
 
 Fault-tolerant state stores are backed by a 
[compacted](https://kafka.apache.org/documentation.html#compaction) changelog 
topic. The purpose of compacting this topic is to prevent the topic from 
growing indefinitely, to reduce the storage consumed in the associated Kafka 
cluster, and to minimize recovery time if a state store needs to be restored 
from its changelog topic.
 
@@ -274,7 +274,7 @@ Example for disabling fault-tolerance:
 
 Attention
 
-If the changelog is disabled then the attached state store is no longer fault 
tolerant and it can't have any [standby 
replicas](config-streams.html#streams-developer-guide-standby-replicas).
+If the changelog is disabled then the attached state store is no longer fault 
tolerant and it can't have any [standby 
replicas](../config-streams#streams-developer-guide-standby-replicas).
 
 Here is an example for enabling fault tolerance, with additional 
changelog-topic configuration: You can add any log config from 
[kafka.log.LogConfig](https://github.com/apache/kafka/blob/trunk/core/src/main/scala/kafka/log/LogConfig.scala).
 Unrecognized configs will be ignored.
     
@@ -326,7 +326,7 @@ Each versioned store has an associated, fixed-duration 
_history retention_ param
 
 History retention also doubles as its _grace period_ , which determines how 
far back in time out-of-order writes to the store will be accepted. A versioned 
store will not accept writes (inserts, updates, or deletions) if the timestamp 
associated with the write is older than the current observed stream time by 
more than the grace period. Stream time in this context is tracked 
per-partition, rather than per-key, which means it's important that grace 
period (i.e., history retention) be set  [...]
 
-Because the memory footprint of versioned key-value stores is higher than that 
of non-versioned key-value stores, you may want to adjust your [RocksDB memory 
settings](memory-mgmt.html#streams-developer-guide-memory-management-rocksdb) 
accordingly. Benchmarking your application with versioned stores is also 
advised as performance is expected to be worse than when using non-versioned 
stores.
+Because the memory footprint of versioned key-value stores is higher than that 
of non-versioned key-value stores, you may want to adjust your [RocksDB memory 
settings](../memory-mgmt#streams-developer-guide-memory-management-rocksdb) 
accordingly. Benchmarking your application with versioned stores is also 
advised as performance is expected to be worse than when using non-versioned 
stores.
 
 Versioned stores do not support caching or interactive queries at this time. 
Also, window stores and global tables may not be versioned.
 
@@ -336,7 +336,7 @@ Upgrades are supported from persistent, non-versioned 
key-value stores to persis
 
 If you wish to upgrade an application using persistent, non-versioned 
key-value stores to use persistent, versioned key-value stores instead, you can 
perform the following procedure:
 
-  * Stop all application instances, and [clear any local state 
directories](app-reset-tool.html#streams-developer-guide-reset-local-environment)
 for the store(s) being upgraded.
+  * Stop all application instances, and [clear any local state 
directories](../app-reset-tool#streams-developer-guide-reset-local-environment) 
for the store(s) being upgraded.
   * Update your application code to use versioned stores where desired.
   * Update your changelog topic configs, for the relevant state stores, to set 
the value of `min.compaction.lag.ms` to be at least your desired history 
retention. History retention plus one day is recommended as buffer for the use 
of broker wall clock time during compaction.
   * Restart your application instances and allow time for the versioned stores 
to rebuild state from changelog.
@@ -424,7 +424,7 @@ In these topologies, the `"Process"` stream processor node 
is considered a downs
 
 Note that the `Topology#addProcessor` function takes a `ProcessorSupplier` as 
argument, and that the supplier pattern requires that a new `Processor` 
instance is returned each time `ProcessorSupplier#get()` is called. Creating a 
single `Processor` object and returning the same object reference in 
`ProcessorSupplier#get()` would be a violation of the supplier pattern and 
leads to runtime exceptions. So remember not to provide a singleton `Processor` 
instance to `Topology`. The `ProcessorS [...]
 
-Now that you have fully defined your processor topology in your application, 
you can proceed to [running the Kafka Streams 
application](running-app.html#streams-developer-guide-execution).
+Now that you have fully defined your processor topology in your application, 
you can proceed to [running the Kafka Streams 
application](../running-app#streams-developer-guide-execution).
 
   * [Documentation](/documentation)
   * [Kafka Streams](/documentation/streams)
diff --git a/docs/streams/developer-guide/running-app.md 
b/docs/streams/developer-guide/running-app.md
index 32310df11ad..edc56543dc9 100644
--- a/docs/streams/developer-guide/running-app.md
+++ b/docs/streams/developer-guide/running-app.md
@@ -40,7 +40,7 @@ You can package your Java application as a fat JAR file and 
then start the appli
     # from the fat JAR named `path-to-app-fatjar.jar`.
     $ java -cp path-to-app-fatjar.jar com.example.MyStreamsApp
 
-When you start your application you are launching a Kafka Streams instance of 
your application. You can run multiple instances of your application. A common 
scenario is that there are multiple instances of your application running in 
parallel. For more information, see [Parallelism 
Model](../architecture.html#streams_architecture_tasks).
+When you start your application you are launching a Kafka Streams instance of 
your application. You can run multiple instances of your application. A common 
scenario is that there are multiple instances of your application running in 
parallel. For more information, see [Parallelism 
Model](../../architecture#streams_architecture_tasks).
 
 When the application instance starts running, the defined processor topology 
will be initialized as one or more stream tasks. If the processor topology 
defines any state stores, these are also constructed during the initialization 
period. For more information, see the State restoration during workload 
rebalance section).
 
@@ -154,13 +154,13 @@ Example:
         }
     });
 
-For more information about standby replicas, see [Standby 
Replicas](config-streams.md#num-standby-replicas).
+For more information about standby replicas, see [Standby 
Replicas](../config-streams#num-standby-replicas).
 
 # Elastic scaling of your application
 
 Kafka Streams makes your stream processing applications elastic and scalable. 
You can add and remove processing capacity dynamically during application 
runtime without any downtime or data loss. This makes your applications 
resilient in the face of failures and for allows you to perform maintenance as 
needed (e.g. rolling upgrades).
 
-For more information about this elasticity, see the [Parallelism 
Model](../architecture.html#streams_architecture_tasks) section. Kafka Streams 
leverages the Kafka group management functionality, which is built right into 
the [Kafka wire protocol](https://cwiki.apache.org/confluence/x/uxvVAQ). It is 
the foundation that enables the elasticity of Kafka Streams applications: 
members of a group coordinate and collaborate jointly on the consumption and 
processing of data in Kafka. Additionall [...]
+For more information about this elasticity, see the [Parallelism 
Model](../../architecture#streams_architecture_tasks) section. Kafka Streams 
leverages the Kafka group management functionality, which is built right into 
the [Kafka wire protocol](https://cwiki.apache.org/confluence/x/uxvVAQ). It is 
the foundation that enables the elasticity of Kafka Streams applications: 
members of a group coordinate and collaborate jointly on the consumption and 
processing of data in Kafka. Additionally, [...]
 
 ## Adding capacity to your application
 
@@ -191,9 +191,9 @@ When a task is migrated, the task processing state is fully 
restored before the
 
 
 
-For more information, see [Standby 
Replicas](config-streams.html#num-standby-replicas).
+For more information, see [Standby 
Replicas](../config-streams#num-standby-replicas).
 
-As of version 2.6, Streams will now do most of a task's restoration in the 
background through warmup replicas. These will be assigned to instances that 
need to restore a lot of state for a task. A stateful active task will only be 
assigned to an instance once its state is within the configured 
[`acceptable.recovery.lag`](config-streams.html#acceptable-recovery-lag), if 
one exists. This means that most of the time, a task migration will **not** 
result in downtime for that task. It will re [...]
+As of version 2.6, Streams will now do most of a task's restoration in the 
background through warmup replicas. These will be assigned to instances that 
need to restore a lot of state for a task. A stateful active task will only be 
assigned to an instance once its state is within the configured 
[`acceptable.recovery.lag`](../config-streams#acceptable-recovery-lag), if one 
exists. This means that most of the time, a task migration will **not** result 
in downtime for that task. It will rema [...]
 
 Note, the one exception to this task availability is if none of the instances 
have a caught up version of that task. In that case, we have no choice but to 
assign the active task to an instance that is not caught up and will have to 
block further processing on restoration of the task's state from the changelog. 
If high availability is important for your application, you are highly 
recommended to enable standbys. 
 
@@ -214,7 +214,7 @@ To achieve balanced workload processing across application 
instances and to prev
 
 There are a few things you can do to reduce the likelihood of crashes and 
failures of your Kafka Streams application. 
 
-  * Kafka Streams has a few configurations that can help with resilience in 
the face of broker failures. They can be found in the [configuration 
guide.](config-streams.html#recommended-configuration-parameters-for-resiliency)
+  * Kafka Streams has a few configurations that can help with resilience in 
the face of broker failures. They can be found in the [configuration 
guide.](../config-streams#recommended-configuration-parameters-for-resiliency)
   * Ensure that your application is able to handle errors and failures. This 
includes things like configuring the correct exception handlers to handle 
errors such as authorization and deserialization errors, and using strategies 
such as dead letter queues to handle "poison pill" records. 
 
 
diff --git a/docs/streams/developer-guide/security.md 
b/docs/streams/developer-guide/security.md
index 4b0c1f97e4b..90877913b67 100644
--- a/docs/streams/developer-guide/security.md
+++ b/docs/streams/developer-guide/security.md
@@ -48,7 +48,7 @@ For more information about the security features in Apache 
Kafka, see [Kafka Sec
 
 # Required ACL setting for secure Kafka clusters
 
-Kafka clusters can use ACLs to control access to resources (like the ability 
to create topics), and for such clusters each client, including Kafka Streams, 
is required to authenticate as a particular user in order to be authorized with 
appropriate access. In particular, when Streams applications are run against a 
secured Kafka cluster, the principal running the application must have the ACL 
set so that the application has the permissions to create, read and write 
[internal topics](manage [...]
+Kafka clusters can use ACLs to control access to resources (like the ability 
to create topics), and for such clusters each client, including Kafka Streams, 
is required to authenticate as a particular user in order to be authorized with 
appropriate access. In particular, when Streams applications are run against a 
secured Kafka cluster, the principal running the application must have the ACL 
set so that the application has the permissions to create, read and write 
[internal topics](../man [...]
 
 If the [streams rebalance 
protocol](https://cwiki.apache.org/confluence/display/KAFKA/KIP-1071%3A+Streams+Rebalance+Protocol)
 is enabled by setting `group.protocol=streams`, the following ACLs are 
required on the topic and group resources:  
   
diff --git a/docs/streams/developer-guide/testing.md 
b/docs/streams/developer-guide/testing.md
index 25bb92c722c..4de4efa0422 100644
--- a/docs/streams/developer-guide/testing.md
+++ b/docs/streams/developer-guide/testing.md
@@ -230,7 +230,7 @@ The following example demonstrates how to use the test 
driver and helper classes
 
 # Unit Testing Processors
 
-If you [write a Processor](processor-api.html), you will want to test it. 
+If you [write a Processor](../processor-api), you will want to test it. 
 
 Because the `Processor` forwards its results to the context rather than 
returning them, Unit testing requires a mocked context capable of capturing 
forwarded data for inspection. For this reason, we provide a 
`MockProcessorContext` in `test-utils`. 
 
@@ -320,7 +320,7 @@ Processors can schedule punctuators to handle periodic 
tasks. The mock context d
     final Punctuator punctuator = capturedPunctuator.getPunctuator();
     punctuator.punctuate(/*timestamp*/ 0L);
 
-If you need to write tests involving automatic firing of scheduled 
punctuators, we recommend creating a simple topology with your processor and 
using the [`TopologyTestDriver`](testing.html#testing-topologytestdriver). 
+If you need to write tests involving automatic firing of scheduled 
punctuators, we recommend creating a simple topology with your processor and 
using the [`TopologyTestDriver`](.#testing-topologytestdriver). 
 
   * [Documentation](/documentation)
   * [Kafka Streams](/documentation/streams)
diff --git a/docs/streams/developer-guide/write-streams-app.md 
b/docs/streams/developer-guide/write-streams-app.md
index 7f2a13dbfef..bb43c47cd0d 100644
--- a/docs/streams/developer-guide/write-streams-app.md
+++ b/docs/streams/developer-guide/write-streams-app.md
@@ -29,13 +29,13 @@ type: docs
 
 
 
-Any Java or Scala application that makes use of the Kafka Streams library is 
considered a Kafka Streams application. The computational logic of a Kafka 
Streams application is defined as a [processor 
topology](../core-concepts#streams_topology), which is a graph of stream 
processors (nodes) and streams (edges).
+Any Java or Scala application that makes use of the Kafka Streams library is 
considered a Kafka Streams application. The computational logic of a Kafka 
Streams application is defined as a [processor 
topology](../../core-concepts#streams_topology), which is a graph of stream 
processors (nodes) and streams (edges).
 
 You can define the processor topology with the Kafka Streams APIs:
 
-[Kafka Streams DSL](dsl-api.html#streams-developer-guide-dsl)
-    A high-level API that provides the most common data transformation 
operations such as `map`, `filter`, `join`, and `aggregations` out of the box. 
The DSL is the recommended starting point for developers new to Kafka Streams, 
and should cover many use cases and stream processing needs. If you're writing 
a Scala application then you can use the [Kafka Streams DSL for 
Scala](dsl-api.html#scala-dsl) library which removes much of the Java/Scala 
interoperability boilerplate as opposed to w [...]
-[Processor API](processor-api.html#streams-developer-guide-processor-api)
+[Kafka Streams DSL](../dsl-api#streams-developer-guide-dsl)
+    A high-level API that provides the most common data transformation 
operations such as `map`, `filter`, `join`, and `aggregations` out of the box. 
The DSL is the recommended starting point for developers new to Kafka Streams, 
and should cover many use cases and stream processing needs. If you're writing 
a Scala application then you can use the [Kafka Streams DSL for 
Scala](../dsl-api#scala-dsl) library which removes much of the Java/Scala 
interoperability boilerplate as opposed to wor [...]
+[Processor API](../processor-api#streams-developer-guide-processor-api)
     A low-level API that lets you add and connect processors as well as 
interact directly with state stores. The Processor API provides you with even 
more flexibility than the DSL but at the expense of requiring more manual work 
on the side of the application developer (e.g., more lines of code).
 
 # Libraries and Maven artifacts
@@ -116,7 +116,7 @@ Description
 
 **Tip**
 
-See the section [Data Types and 
Serialization](datatypes.html#streams-developer-guide-serdes) for more 
information about Serializers/Deserializers.
+See the section [Data Types and 
Serialization](../datatypes#streams-developer-guide-serdes) for more 
information about Serializers/Deserializers.
 
 Example `pom.xml` snippet when using Maven:
     
@@ -143,7 +143,7 @@ You can call Kafka Streams from anywhere in your 
application code, but usually t
 
 First, you must create an instance of `KafkaStreams`.
 
-  * The first argument of the `KafkaStreams` constructor takes a topology 
(either `StreamsBuilder#build()` for the 
[DSL](dsl-api.html#streams-developer-guide-dsl) or `Topology` for the 
[Processor API](processor-api.html#streams-developer-guide-processor-api)) that 
is used to define a topology.
+  * The first argument of the `KafkaStreams` constructor takes a topology 
(either `StreamsBuilder#build()` for the 
[DSL](../dsl-api#streams-developer-guide-dsl) or `Topology` for the [Processor 
API](../processor-api#streams-developer-guide-processor-api)) that is used to 
define a topology.
   * The second argument is an instance of `java.util.Properties`, which 
defines the configuration for this specific topology.
 
 
@@ -180,7 +180,7 @@ At this point, internal structures are initialized, but the 
processing is not st
     // Start the Kafka Streams threads
     streams.start();
 
-If there are other instances of this stream processing application running 
elsewhere (e.g., on another machine), Kafka Streams transparently re-assigns 
tasks from the existing instances to the new instance that you just started. 
For more information, see [Stream Partitions and 
Tasks](../architecture.html#streams_architecture_tasks) and [Threading 
Model](../architecture.html#streams_architecture_threads).
+If there are other instances of this stream processing application running 
elsewhere (e.g., on another machine), Kafka Streams transparently re-assigns 
tasks from the existing instances to the new instance that you just started. 
For more information, see [Stream Partitions and 
Tasks](../../architecture#streams_architecture_tasks) and [Threading 
Model](../../architecture#streams_architecture_threads).
 
 To catch any unexpected exceptions, you can set an 
`java.lang.Thread.UncaughtExceptionHandler` before you start the application. 
This handler is called whenever a stream thread is terminated by an unexpected 
exception:
     
@@ -209,7 +209,7 @@ After an application is stopped, Kafka Streams will migrate 
any tasks that had b
 
 # Testing a Streams application
 
-Kafka Streams comes with a `test-utils` module to help you test your 
application [here](testing.html). 
+Kafka Streams comes with a `test-utils` module to help you test your 
application [here](../testing). 
 
   * [Documentation](/documentation)
   * [Kafka Streams](/documentation/streams)

Reply via email to