diff --git a/README.md b/README.md
index 17d1c4d128..e97d8d088a 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@
# ∞ do more, more easily
-[Jooby](https://jooby.io) is a modern, high-performance web framework for Java and Kotlin, designed to run seamlessly atop your preferred web server.
+[Jooby](https://jooby.io) is a modular, high-performance web framework for Java and Kotlin. Designed for simplicity and speed, it gives you the freedom to build on your favorite server with a clean, modern API.
## 🚀 Built for Speed
- **High Performance**: Consistently ranks among the fastest Java frameworks in TechEmpower benchmarks.
diff --git a/docs/asciidoc/configuration.adoc b/docs/asciidoc/configuration.adoc
index 9e637bcc60..bf5c46989a 100644
--- a/docs/asciidoc/configuration.adoc
+++ b/docs/asciidoc/configuration.adoc
@@ -168,14 +168,15 @@ To ensure environment-specific logging works correctly, avoid using **static** l
==== Application Properties
+[cols="2,1,3"]
|===
-|Property | Description | Default
+|Property | Default | Description
-|`application.charset` | Charset for encoding/decoding and templates. | `UTF-8`
-|`application.env` | Active environment names. Jooby optimizes performance for non-`dev` environments. | `dev`
-|`application.lang` | Supported languages for `Context.locale()`. | `Locale.getDefault()`
-|`application.tmpdir` | Temporary directory for the application. | `tmp`
-|`application.pid` | The JVM process ID. | System assigned
+|`application.charset` | `UTF-8` | Charset for encoding/decoding and templates.
+|`application.env` | `dev` | Active environment names. Jooby optimizes performance for non-`dev` environments.
+|`application.lang` | `Locale.getDefault()` | Supported languages for `Context.locale()`.
+|`application.tmpdir` | `tmp` | Temporary directory for the application.
+|`application.pid` | System assigned | The JVM process ID.
|===
See javadoc:AvailableSettings[] for a complete reference.
diff --git a/docs/asciidoc/core.adoc b/docs/asciidoc/core.adoc
index 68e2681b84..fd813fd0cf 100644
--- a/docs/asciidoc/core.adoc
+++ b/docs/asciidoc/core.adoc
@@ -1,4 +1,6 @@
== Core
+[.lead]
+The foundational building blocks of your Jooby application. This section covers how to bootstrap the server, manage application environments and configuration, and leverage the modular architecture that makes Jooby both lightweight and highly extensible.
include::routing.adoc[]
diff --git a/docs/asciidoc/docinfo-footer.html b/docs/asciidoc/docinfo-footer.html
index 0305aa8497..7ef6b48b49 100644
--- a/docs/asciidoc/docinfo-footer.html
+++ b/docs/asciidoc/docinfo-footer.html
@@ -1,24 +1,157 @@
-
-
-
+
+
+
+
diff --git a/docs/asciidoc/docinfo-header.html b/docs/asciidoc/docinfo-header.html
new file mode 100644
index 0000000000..9c5e1f744f
--- /dev/null
+++ b/docs/asciidoc/docinfo-header.html
@@ -0,0 +1,6 @@
+
+ Jooby
+
+
diff --git a/docs/asciidoc/docinfo.html b/docs/asciidoc/docinfo.html
index 2e8b60e0d3..27704b6ebf 100644
--- a/docs/asciidoc/docinfo.html
+++ b/docs/asciidoc/docinfo.html
@@ -1,109 +1,12 @@
-
-
+
+
+
+
diff --git a/docs/asciidoc/ecosystem.adoc b/docs/asciidoc/ecosystem.adoc
index 38972786ad..36359f1679 100644
--- a/docs/asciidoc/ecosystem.adoc
+++ b/docs/asciidoc/ecosystem.adoc
@@ -1,4 +1,6 @@
== Ecosystem
+[.lead]
+Extend the power of Jooby through its rich ecosystem of modules and standards. Learn how to seamlessly integrate with OpenAPI 3 to automatically generate interactive documentation and client SDKs, and explore a wide array of community and first-party modules that bring database access, security, and messaging to your application with minimal configuration.
The Jooby ecosystem is built on three core, interconnected concepts:
@@ -131,7 +133,7 @@ public class MyExtension implements Extension {
public void install(Jooby app) {
DataSource dataSource = createDataSource(); // <1>
- app.getServices().put(DataSource.class, dataSource); // <2>
+ app.getServices().put(DataSource.class, dataSource);// <2>
app.onStop(dataSource::close); // <3>
}
@@ -150,11 +152,11 @@ import io.jooby.Jooby
class MyExtension : Extension {
override fun install(app: Jooby) {
- val dataSource = createDataSource() // <1>
+ val dataSource = createDataSource() // <1>
- app.services.put(DataSource::class.java, dataSource) // <2>
+ app.services.put(DataSource::class.java, dataSource) // <2>
- app.onStop(dataSource::close) // <3>
+ app.onStop(dataSource::close) // <3>
}
private fun createDataSource(): DataSource {
diff --git a/docs/asciidoc/index.adoc b/docs/asciidoc/index.adoc
index d76b167d8c..518d583ee1 100644
--- a/docs/asciidoc/index.adoc
+++ b/docs/asciidoc/index.adoc
@@ -19,7 +19,7 @@ Style guidelines:
[discrete]
== ∞ do more, more easily
-Jooby is a modern, fast, and easy-to-use web framework for Java and Kotlin, built on top of your favorite web server.
+Jooby is a modular, high-performance web framework for Java and Kotlin. Designed for simplicity and speed, it gives you the freedom to build on your favorite server with a clean, modern API.
.Welcome!
[source,java,role="primary"]
diff --git a/docs/asciidoc/migration/3.x.adoc b/docs/asciidoc/migration/3.x.adoc
index e25187c5bd..78abe47887 100644
--- a/docs/asciidoc/migration/3.x.adoc
+++ b/docs/asciidoc/migration/3.x.adoc
@@ -64,9 +64,10 @@ Kotlin was removed from core, you need to the `jooby-kotlin` dependency:
|===
==== Class renames
+[cols="1,1,2"]
|===
|2.x|3.x|Module
-|io.jooby.Route.Decorator|io.jooby.Route.Filter| jooby (core)
+|io.jooby.Route.Decorator| jooby (core) |io.jooby.Route.Filter
|io.jooby.Kooby|io.jooby.kt.Kooby| jooby-kotlin (new module)
|io.jooby.jetty.Jetty|io.jooby.jetty.JettyServer| jooby-jetty
|io.jooby.netty.Netty|io.jooby.netty.NettyServer| jooby-netty
@@ -87,6 +88,7 @@ Kotlin was removed from core, you need to the `jooby-kotlin` dependency:
|===
==== Method renames
+[cols="1,1,2"]
|===
|2.x|3.x|Description
|Router.decorator(Decorator)|Router.use(Filter)| `decorator` has been deprecated in favor of `use`
diff --git a/docs/asciidoc/migration/4.x.adoc b/docs/asciidoc/migration/4.x.adoc
index 301f3517d0..8529e33455 100644
--- a/docs/asciidoc/migration/4.x.adoc
+++ b/docs/asciidoc/migration/4.x.adoc
@@ -65,18 +65,20 @@ runApp(args, new NettyServer(new ServerOptions()), App::new);
|===
==== Classes
+[cols="1,1,1,4"]
|===
-|3.x|4.x|Description|Module
-|io.jooby.buffer.*|-| removed | jooby (core)
-||io.jooby.output.*| new output API | jooby (core)
-|io.jooby.MvcFactory|-| was deprecated and now removed | jooby (core)
-|io.jooby.annotation.ResultType|-| removed | jooby (core)
-|io.jooby.ValueNode|io.jooby.value.Value| replaced/merged | jooby (core)
-|io.jooby.ValueNodeConverter|io.jooby.value.ValueConverter| replaced/merged | jooby (core)
-|io.jooby.RouteSet|io.jooby.Route.Set| moved into Route and renamed to Set | jooby (core)
+|3.x|4.x|Module|Description
+|io.jooby.buffer.*|-| jooby (core) | removed
+||io.jooby.output.*| jooby (core) | new output API
+|io.jooby.MvcFactory|-| jooby (core) | was deprecated and now removed
+|io.jooby.annotation.ResultType|-| jooby (core) | removed
+|io.jooby.ValueNode|io.jooby.value.Value | jooby (core) | replaced/merged
+|io.jooby.ValueNodeConverter|io.jooby.value.ValueConverter| jooby (core) | replaced/merged
+|io.jooby.RouteSet|io.jooby.Route.Set | jooby (core) | moved into Route and renamed to Set
|===
==== Method
+[cols="1,1,2"]
|===
|3.x|4.x|Description
|io.jooby.Jooby.setServerOptions()|Server.setOptions()| removed in favor of `Server.setOptions()`
diff --git a/docs/asciidoc/modules/avaje-inject.adoc b/docs/asciidoc/modules/avaje-inject.adoc
index 10106c83ca..ef68ecb4b5 100644
--- a/docs/asciidoc/modules/avaje-inject.adoc
+++ b/docs/asciidoc/modules/avaje-inject.adoc
@@ -57,7 +57,7 @@ Please note that the order of annotation processors is important. For example, i
public class App extends Jooby {
{
- install(AvajeInjectModule.of()); <1>
+ install(AvajeInjectModule.of()); <1>
get("/", ctx -> {
MyService service = require(MyService.class); <2>
diff --git a/docs/asciidoc/modules/openapi-ascii.adoc b/docs/asciidoc/modules/openapi-ascii.adoc
index a225bbbe1f..ce7c4c6815 100644
--- a/docs/asciidoc/modules/openapi-ascii.adoc
+++ b/docs/asciidoc/modules/openapi-ascii.adoc
@@ -105,43 +105,47 @@ Data generation follows a flexible pipeline architecture. You start with a sourc
===== 3. Data Sources (Lookups)
These functions are your entry points to locate objects within the OpenAPI definition.
-[cols="2m,3,3"]
+[cols="2,4,5"]
|===
-|Function |Description |Example
+|Function |Example | Description
|operation(method, path)
-|Generic lookup for an API operation.
|`{{ operation("GET", "/books") }}`
+|Generic lookup for an API operation.
|GET(path)
-|Shorthand for `operation("GET", path)`.
|`{{ GET("/books") }}`
+|Shorthand for `operation("GET", path)`.
|POST(path)
-|Shorthand for `operation("POST", path)`.
|`{{ POST("/books") }}`
+|Shorthand for `operation("POST", path)`.
|PUT / PATCH / DELETE
-|Shorthand for respective HTTP methods.
|`{{ DELETE("/books/{id}") }}`
+|Shorthand for respective HTTP methods.
|schema(name)
-|Looks up a Schema/Model definition by name.
|`{{ schema("User") }}`
+|Looks up a Schema/Model definition by name.
|tag(name)
-|Selects a specific Tag group (containing name, description, and routes).
|`{{ tag("Inventory") }}`
+|Selects a specific Tag group (containing name, description, and routes).
|routes()
-|Returns a collection of all available routes in the API.
|`{% for r in routes() %}...{% endfor %}`
+|Returns a collection of all available routes in the API.
|server(index)
-|Selects a server definition from the OpenAPI spec by index.
|`{{ server(0).url }}`
+|Selects a server definition from the OpenAPI spec by index.
|error(code)
+|`{{ statusCode(200) }}`
+`{{ statusCode([200, 400]) }}`
+
+`{{ statusCode( {200: "OK", 400: "Bad Syntax"} ) }}`
|Generates an error response object. +
**Default:** `{statusCode, reason, message}`. +
**Custom:** Looks for a global `error` variable map and interpolates values.
@@ -152,11 +156,6 @@ These functions are your entry points to locate objects within the OpenAPI defin
1. **Int:** Default reason. +
2. **List:** `[200, 404]` +
3. **Map:** `{200: "OK", 400: "Bad Syntax"}` (Overrides defaults).
-|`{{ statusCode(200) }}`
-
-`{{ statusCode([200, 400]) }}`
-
-`{{ statusCode( {200: "OK", 400: "Bad Syntax"} ) }}`
|===
diff --git a/docs/asciidoc/modules/openapi.adoc b/docs/asciidoc/modules/openapi.adoc
index 8aa72cc96b..190a0fd36e 100644
--- a/docs/asciidoc/modules/openapi.adoc
+++ b/docs/asciidoc/modules/openapi.adoc
@@ -407,7 +407,7 @@ Whitespaces (including new lines) are ignored. To introduce a new line, you must
==== Supported OpenAPI tags
-[cols="3,1,1,1,4"]
+[cols="1,1,1,1,4"]
|===
| Tag | Main | Controller | Method | Description
@@ -600,7 +600,7 @@ Keep in mind that any section found here in the template overrides existing meta
=== Swagger Annotations
-Optionally this plugin depends on some OpenAPI annotations. To use them, you need to add a dependency to your project:
+Optionally, this plugin depends on some OpenAPI annotations. To use them, you need to add a dependency to your project:
[dependency, artifactId="swagger-annotations"]
.
diff --git a/docs/asciidoc/mvc-api.adoc b/docs/asciidoc/mvc-api.adoc
index eecb611ae2..fcda32b4fa 100644
--- a/docs/asciidoc/mvc-api.adoc
+++ b/docs/asciidoc/mvc-api.adoc
@@ -764,7 +764,7 @@ You can access the generated routes at runtime:
==== Annotation Processor Options
-[cols="1,1,1,2"]
+[cols="2,1,1,4"]
|===
| Option | Type | Default | Description
diff --git a/docs/asciidoc/router-options.adoc b/docs/asciidoc/router-options.adoc
index 4da5592570..eb225c6169 100644
--- a/docs/asciidoc/router-options.adoc
+++ b/docs/asciidoc/router-options.adoc
@@ -38,7 +38,7 @@ import io.jooby.Jooby
}
----
-[cols="2,1,1,4"]
+[cols="1,1,1,4"]
|===
| Option | Type | Default | Description
diff --git a/docs/asciidoc/routing.adoc b/docs/asciidoc/routing.adoc
index 5ee0f206a6..347c94437f 100644
--- a/docs/asciidoc/routing.adoc
+++ b/docs/asciidoc/routing.adoc
@@ -14,8 +14,7 @@ A javadoc:Route[] consists of three parts:
[source, java, role="primary"]
----
{
-
- // <1> <2>
+ // <1> <2>
get("/foo", ctx -> {
return "foo"; // <3>
});
@@ -35,9 +34,8 @@ A javadoc:Route[] consists of three parts:
.Kotlin
[source, kotlin, role="secondary"]
----
-{
-
- // <1> <2>
+{
+ // <1> <2>
get("/foo") {
"foo" // <3>
}
diff --git a/docs/asciidoc/tooling.adoc b/docs/asciidoc/tooling.adoc
index 24fa541a80..4f5754c7cc 100644
--- a/docs/asciidoc/tooling.adoc
+++ b/docs/asciidoc/tooling.adoc
@@ -1,4 +1,6 @@
== Tooling and Operations
+[.lead]
+Streamline your development workflow with Jooby's productivity suite. This section covers essential utilities like Hot Reload for instantaneous code changes without restarting the server, and deep integration with build systems like Maven and Gradle to manage your project's lifecycle from the first line of code to the final deployment.
include::configuration.adoc[]
diff --git a/docs/asciidoc/web.adoc b/docs/asciidoc/web.adoc
index 9bfb60e98f..6f63aa8da1 100644
--- a/docs/asciidoc/web.adoc
+++ b/docs/asciidoc/web.adoc
@@ -1,4 +1,6 @@
== Web
+[.lead]
+Everything you need to handle HTTP traffic and build robust APIs or web applications. Explore Jooby's expressive routing paradigms, request and response handling, content negotiation, and advanced web features like WebSockets and file uploads.
include::mvc-api.adoc[]
diff --git a/docs/js/styles/theme.css b/docs/js/styles/theme.css
new file mode 100644
index 0000000000..ea246c1226
--- /dev/null
+++ b/docs/js/styles/theme.css
@@ -0,0 +1,1039 @@
+/* ==========================================================================
+ 1. CSS Variables & Theming
+ ========================================================================== */
+:root {
+ /* Brand Colors */
+ --jooby-blue: #2196f3;
+ --jooby-blue-hover: #1976d2;
+ --jooby-accent: #ffa726;
+
+ /* Light Theme (Default) */
+ --bg-main: #ffffff;
+ --bg-surface: #f8f9fa;
+ --bg-callout: #f3f4f6;
+ --border-color: #e5e7eb;
+
+ --text-main: #374151;
+ --text-muted: #6b7280;
+ --heading-color: #111827;
+ --link-color: var(--jooby-blue);
+
+ /* Code Blocks */
+ --code-bg: #282c34; /* Update this to match Atom One Dark perfectly */
+ --code-text: #ffffff;
+ --code-inline-bg: #f1f5f9;
+ --code-inline-text: #be185d;
+
+ /* Layout */
+ --sidebar-width: 300px;
+ --content-max-width: 900px;
+ --border-radius: 6px;
+
+ /* Modern Developer Font Stack */
+ --font-code: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+}
+
+pre.highlightjs, .highlightjs code {
+ background: var(--code-bg) !important;
+}
+
+/* Optional: Make the line under the tabs a bit softer to match the new color */
+.switch {
+ border-bottom: 1px solid rgba(255, 255, 255, 0.05);
+}
+
+html[data-theme="dark"] {
+ --bg-main: #0f172a;
+ --bg-surface: #1e293b;
+ --bg-callout: #1e293b;
+ --border-color: #334155;
+
+ --text-main: #cbd5e1;
+ --text-muted: #94a3b8;
+ --heading-color: #f8fafc;
+ --link-color: #38bdf8;
+
+ --code-inline-bg: #1e293b;
+ --code-inline-text: #f472b6;
+}
+
+/* ==========================================================================
+ 2. Base & Typography (TIGHTENED SPACING)
+ ========================================================================== */
+html { scroll-padding-top: 80px; }
+*, ::before, ::after { box-sizing: border-box; }
+
+body {
+ background: var(--bg-main);
+ color: var(--text-main);
+ font-family: 'Open Sans', system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
+ line-height: 1.6;
+ margin: 0;
+ padding: 0;
+ -webkit-font-smoothing: antialiased;
+}
+
+/* Tighter Headings */
+h1, h2, h3, h4, h5, h6 {
+ color: var(--heading-color);
+ font-weight: 600;
+ line-height: 1.3;
+ margin-top: 1.5em;
+ margin-bottom: 0.5rem;
+}
+
+h1 { font-size: 2.5rem; margin-top: 1em; letter-spacing: -0.02em; }
+h2 { font-size: 1.875rem; border-bottom: 1px solid var(--border-color); padding-bottom: 0.3em; margin-top: 2em; }
+h3 { font-size: 1.5rem; }
+h4 { font-size: 1.25rem; } /* 20px */
+h5 { font-size: 1.125rem; } /* 18px - Just slightly larger than body text */
+
+/* Optional: Make h6 distinct since it's the same size as body text */
+h6 {
+ font-size: 1rem; /* 16px - Same as body */
+ color: var(--text-muted);
+ letter-spacing: 0.05em;
+}
+
+/* ASCIIDOCTOR FIX: Pull subheadings closer when they immediately follow a parent section */
+.sectionbody > .sect2:first-child > h3,
+.sect2 > .sect3:first-child > h4,
+.sect3 > .sect4:first-child > h5 {
+ margin-top: 0.75em;
+}
+
+p, table, blockquote { margin-top: 0; margin-bottom: 1rem; }
+
+a { color: var(--link-color); text-decoration: none; transition: color 0.15s ease; }
+a:hover { text-decoration: underline; color: var(--jooby-blue-hover); }
+hr { border: none; border-bottom: 1px solid var(--border-color); margin: 2rem 0; }
+
+/* ASCIIDOCTOR FIX: Fix bloated lists caused by