Skip to content

Conversation

@MatthewHawkins
Copy link
Member

No description provided.

@MatthewHawkins MatthewHawkins linked an issue Jan 16, 2026 that may be closed by this pull request
@MatthewHawkins MatthewHawkins marked this pull request as draft January 16, 2026 20:01
Copy link
Member

@EHandtkeBasis EHandtkeBasis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldnt the folder be 2026-01-16 now?

title: What's new in version 25.11?
description: Get to know the features, fixes, and functionality new in webforJ version 25.11.
slug: whats-new-v25.11
date: 2025-01-16
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
date: 2025-01-16
date: 2026-01-26


<!-- ![cover image](https://cdn.webforj.com/webforj-documentation/blogs/webforj-v25.11/cover.png) -->

The new year brings a new version of webforJ - introducing version 25.11! This release brings polished animations, AI-ready components, and faster ways to prototype. The new View Transitions API adds smooth animations to route navigation with a single annotation. JBang integration lets you run webforJ apps from a single file - no project setup required. Two new components join the library: Avatar for user profiles and MarkdownViewer for streaming content with progressive rendering, perfect for AI chat interfaces. Round it out with a `Debouncer` utility, a minify plugin for smaller builds, improved Spring Boot integration, and additions to our docs and demos.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The new year brings a new version of webforJ - introducing version 25.11! This release brings polished animations, AI-ready components, and faster ways to prototype. The new View Transitions API adds smooth animations to route navigation with a single annotation. JBang integration lets you run webforJ apps from a single file - no project setup required. Two new components join the library: Avatar for user profiles and MarkdownViewer for streaming content with progressive rendering, perfect for AI chat interfaces. Round it out with a `Debouncer` utility, a minify plugin for smaller builds, improved Spring Boot integration, and additions to our docs and demos.
The new year brings a new version of webforJ: introducing version 25.11! This release brings polished animations, AI-ready components, and faster ways to prototype. The new View Transitions API adds smooth animations to route navigation with a single annotation. [JBang](https://www.jbang.dev/) integration lets you run webforJ apps from a single file, no project setup required. Two new components join the library: `Avatar` for user profiles and `MarkdownViewer` for streaming content with progressive rendering, perfect for AI chat interfaces. Round it out with a `Debouncer` utility, a minify plugin for smaller builds, improved Spring Boot integration, and additions to our docs and demos.


## View Transitions API for animated route navigation

Changing views is an incredibly common occurrence in apps, often made more visually appealing by adding transitions. Before, these transitions required complex CSS - now, with this release, webforJ introduces experimental support for the browser's native [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API), bringing smooth animations to navigation with minimal effort.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Changing views is an incredibly common occurrence in apps, often made more visually appealing by adding transitions. Before, these transitions required complex CSS - now, with this release, webforJ introduces experimental support for the browser's native [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API), bringing smooth animations to navigation with minimal effort.
Changing views is an incredibly common occurrence in apps, often made more visually appealing by adding transitions. Before, these transitions required complex CSS. Now, with this release, webforJ introduces experimental support for the browser's native [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API), bringing smooth animations to navigation with minimal effort.


<!-- <video src={require('./transitions.mp4').default} autoPlay muted loop playsInline style={{width: '100%', borderRadius: '8px', marginBottom: '1rem'}}></video> -->

The simplest approach, and the one used in the above video is the `@RouteTransition` annotation:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The simplest approach, and the one used in the above video is the `@RouteTransition` annotation:
The simplest approach, used in the above video, is the `@RouteTransition` annotation:

}
```

That's it - the router handles the animation automatically when navigating to or from this view. Built-in transitions include `FADE`, `SLIDE_LEFT`, `SLIDE_RIGHT`, `SLIDE_UP`, `SLIDE_DOWN`, `ZOOM`, and `ZOOM_OUT`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
That's it - the router handles the animation automatically when navigating to or from this view. Built-in transitions include `FADE`, `SLIDE_LEFT`, `SLIDE_RIGHT`, `SLIDE_UP`, `SLIDE_DOWN`, `ZOOM`, and `ZOOM_OUT`.
That's it! The router handles the animation automatically when navigating to or from this view. Built-in transitions include `FADE`, `SLIDE_LEFT`, `SLIDE_RIGHT`, `SLIDE_UP`, `SLIDE_DOWN`, `ZOOM`, and `ZOOM_OUT`.


The new **RouteRegistryProvider SPI** opens the door. It's a "Service Provider Interface" that lets frameworks plug in their own route discovery logic. When you call `RouteRegistry.ofPackage()`, webforJ now checks for registered providers first. If one exists (like Spring's implementation), it delegates discovery to that provider. Otherwise, it falls back to standard classpath scanning.

For most developers, this is invisible - routes just work. But if you're building framework integrations or need custom route registration logic, you now have a clean extension point.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
For most developers, this is invisible - routes just work. But if you're building framework integrations or need custom route registration logic, you now have a clean extension point.
For most developers, this is invisible. Routes just work. But if you're building framework integrations or need custom route registration logic, you now have a clean extension point.


## Spring Boot starter simplification

A small but welcome change: the `webforj-spring-boot-starter` now includes webforJ as a transitive dependency. Previously you needed to declare both the starter and the core library separately. Now just add the starter and you're done - one dependency instead of two.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
A small but welcome change: the `webforj-spring-boot-starter` now includes webforJ as a transitive dependency. Previously you needed to declare both the starter and the core library separately. Now just add the starter and you're done - one dependency instead of two.
A small but welcome change: the `webforj-spring-boot-starter` now includes webforJ as a transitive dependency. Previously you needed to declare both the starter and the core library separately. Now just add the starter and you're doneone dependency instead of two.


Mentioned at the beginning of our article, GhostAI is a full-featured AI chat application built with Spring AI and Google Gemini. The interface mirrors the ChatGPT experience: streaming responses render progressively in the `MarkdownViewer` with syntax-highlighted code blocks, while the input field offers predictive ghost text suggestions that you can accept with Tab. Conversation history persists across messages, and MCP server integration enables real-time documentation queries.

This demo pulls together many of the new 25.11 features - MarkdownViewer's progressive rendering, TextField's ghost text API, and the `Debouncer` utility - into a cohesive application.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This demo pulls together many of the new 25.11 features - MarkdownViewer's progressive rendering, TextField's ghost text API, and the `Debouncer` utility - into a cohesive application.
This demo pulls together many of the new 25.11 featuresMarkdownViewer's progressive rendering, TextField's ghost text API, and the `Debouncer` utilityinto a cohesive application.


A Pomodoro-style timer that demonstrates Progressive Web App capabilities in webforJ. Install it to your desktop or mobile device using the `@AppProfile` annotation, receive native notifications when your focus session ends, and watch the app badge update in real-time to show remaining minutes.

For Java developers accustomed to server-side rendering, this demo shows how webforJ bridges the gap to modern web platform features - installable apps, push notifications, and badge APIs - without writing JavaScript.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
For Java developers accustomed to server-side rendering, this demo shows how webforJ bridges the gap to modern web platform features - installable apps, push notifications, and badge APIs - without writing JavaScript.
For Java developers accustomed to server-side rendering, this demo shows how webforJ bridges the gap to modern web platform features such as installable apps, push notifications, and badge APIs, without writing JavaScript.


### REST Pagination

A practical comparison of two pagination strategies for REST API data. The first tab uses `CollectionRepository` to fetch all 100 customers upfront and paginate client-side - simple and fast for small datasets. The second tab uses `DelegatingRepository` to lazy-load 15 records at a time as you navigate - essential for large datasets where loading everything would be impractical.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
A practical comparison of two pagination strategies for REST API data. The first tab uses `CollectionRepository` to fetch all 100 customers upfront and paginate client-side - simple and fast for small datasets. The second tab uses `DelegatingRepository` to lazy-load 15 records at a time as you navigate - essential for large datasets where loading everything would be impractical.
A practical comparison of two pagination strategies for REST API data. The first tab uses `CollectionRepository` to fetch all 100 customers upfront and paginate client-side, simple and fast for small datasets. The second tab uses `DelegatingRepository` to lazy-load 15 records at a time as you navigate, essential for large datasets where loading everything would be impractical.

@MatthewHawkins MatthewHawkins marked this pull request as ready for review January 21, 2026 19:48
@MatthewHawkins MatthewHawkins added the status: waiting-for-review The PR is ready. Waiting for team members to review. label Jan 22, 2026

## View Transitions API for animated route navigation

Changing views is an incredibly common occurrence in apps, often made more visually appealing by adding transitions. Before, these transitions required complex CSS. Now, webforJ introduces experimental support for the browser's native [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API), bringing smooth animations to navigation with minimal effort.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

complex javascript not css

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should link the webforj view transitions docs instead of the MDN one


As always, see the [GitHub release overview](https://github.com/webforj/webforj/releases/tag/25.11) for a more comprehensive list of changes. Highlighted below are some of the most exciting additions:

## View Transitions API for animated route navigation
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This section mixes view transitions and route transitions, which can be confusing. Route transitions are based on the webforj View Transition API, and we need to make that clear. We should start by explaining the new view transition API and show it in action (Use list order demo). After that, we can explain the route transition API and show the video.


<video src="https://cdn.webforj.com/webforj-documentation/blogs/webforj-v25.11/jbang.mov" autoPlay muted loop playsInline style={{width: '100%', borderRadius: '8px', marginBottom: '1rem'}}></video>

```java
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code does not run. Please use the demo I shared in the jbang PR.

*The video above showcases the MarkdownViewer rendering streamed output from an AI chatbot in real time.*

:::tip AI Autocompletion
Notice the text area in the demo? It features AI-powered autocompletion that suggests text as you type. This ghost text functionality is also available in the TextField and TextArea components - see [TextField documentation](/docs/components/fields/text-field) for details on enabling suggestions in your own apps.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the feature is available only in TextArea not TextField


*The video above showcases the MarkdownViewer rendering streamed output from an AI chatbot in real time.*

:::tip AI Autocompletion
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Link text is wrong and the link is broken, link text area Predicted text section please

See the [Minify plugin docs](/docs/configuration/minifier-plugin) for setup instructions and configuration options.
:::

## Route Registry Provider SPI
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's remove


The new **RouteRegistryProvider SPI** lets frameworks like Spring plug in their own route discovery logic. For most developers, this is invisible—routes just work. But if you're building framework integrations, you now have a clean extension point.

## Spring Boot starter simplification
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's remove


Each `append()` call adds content to the stream. Auto-scroll keeps the latest content visible—smart enough to pause when users scroll up. Code blocks get syntax highlighting automatically. The API includes `setRenderSpeed()`, `stop()`, `flush()`, and `whenRenderComplete()` for full control.

## `Debouncer` utility
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's remove

@hyyan hyyan added status: waiting-for-author Review is done. Waiting for the PR author to apply changes or respond. and removed status: waiting-for-review The PR is ready. Waiting for team members to review. labels Jan 23, 2026
Comment on lines +60 to +67
```java
// Auto-generated initials from name
Avatar avatar = new Avatar("John Doe"); // Shows "JD"

// With a profile image
Avatar avatar = new Avatar("Jane Smith");
avatar.add(new Img("https://example.com/profile.jpg"));
```
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
```java
// Auto-generated initials from name
Avatar avatar = new Avatar("John Doe"); // Shows "JD"
// With a profile image
Avatar avatar = new Avatar("Jane Smith");
avatar.add(new Img("https://example.com/profile.jpg"));
```
```java
// Auto-generated initials from name
Avatar initialsAvatar = new Avatar("John Doe"); // Shows "JD"
// With a profile image
Avatar imageAvatar = new Avatar("Jane Smith");
avatar.add(new Img("https://example.com/profile.jpg"));
Minor suggestion: since these are ostensibly in the same file, give the avatars unique names that describe their function.

@MatthewHawkins MatthewHawkins added status: waiting-for-review The PR is ready. Waiting for team members to review. and removed status: waiting-for-author Review is done. Waiting for the PR author to apply changes or respond. labels Jan 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status: waiting-for-review The PR is ready. Waiting for team members to review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

25.11 Release Blog

5 participants