{"id":21444868,"url":"https://github.com/NaluKit/nalu","last_synced_at":"2025-07-14T18:31:49.829Z","repository":{"id":33044710,"uuid":"143152220","full_name":"NaluKit/nalu","owner":"NaluKit","description":"Routing based application framework for GWT \u0026 J2CL","archived":false,"fork":false,"pushed_at":"2024-11-15T15:28:15.000Z","size":8372,"stargazers_count":66,"open_issues_count":4,"forks_count":16,"subscribers_count":6,"default_branch":"dev","last_synced_at":"2024-11-15T16:18:57.620Z","etag":null,"topics":["client-side","eventbus","gwt","j2cl","java","mvp","mvp-architecture","router","routing"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NaluKit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-08-01T12:20:05.000Z","updated_at":"2024-11-15T15:27:32.000Z","dependencies_parsed_at":"2024-07-22T10:28:46.613Z","dependency_job_id":"b9c68287-2740-425f-a45c-4d9d2bfb382f","html_url":"https://github.com/NaluKit/nalu","commit_stats":{"total_commits":880,"total_committers":19,"mean_commits":46.31578947368421,"dds":0.1636363636363637,"last_synced_commit":"9038671edc395a3c8ac000b43324cb94605d3ec6"},"previous_names":[],"tags_count":59,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NaluKit%2Fnalu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NaluKit%2Fnalu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NaluKit%2Fnalu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NaluKit%2Fnalu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NaluKit","download_url":"https://codeload.github.com/NaluKit/nalu/tar.gz/refs/heads/dev","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225778866,"owners_count":17522710,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["client-side","eventbus","gwt","j2cl","java","mvp","mvp-architecture","router","routing"],"created_at":"2024-11-23T02:22:07.445Z","updated_at":"2025-07-14T18:31:49.817Z","avatar_url":"https://github.com/NaluKit.png","language":"Java","funding_links":[],"categories":["Router"],"sub_categories":[],"readme":"# Nalu\n\n[![License](https://img.shields.io/:license-apache-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0.html)\n![GWT3/J2CL compatible](https://img.shields.io/badge/GWT3/J2CL-compatible-brightgreen.svg) \n[![Join the chat at https://gitter.im/Nalukit42/Lobby](https://badges.gitter.im/Nalukit42/Lobby.svg)](https://gitter.im/Nalukit42/Lobby?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n[![Maven Central](https://img.shields.io/maven-central/v/io.github.nalukit/nalu.svg?colorB=44cc11)](https://central.sonatype.com/artifact/io.github.nalukit/nalu)\n[![Build \u0026 Deploy](https://github.com/NaluKit/nalu/actions/workflows/build.yaml/badge.svg?branch=main)](https://github.com/NaluKit/nalu/actions/workflows/build.yaml)\n\n\nNalu is a tiny framework that helps you to create GWT based applications quite easily. Using the HTML 5 history for routing and navigation, Nalu supports the browser's back-, forward-, and reload-button by default and without any need to implement anything.\n\nNalu supports:\n\n* Route based navigation\n\n* HTML links and programmatically routing thanks to a router\n\n* Browser's back-, forward- and reload-button (In case the hasHistory-attribute of the `Application`-annotation is set to **true**)\n\n* An optional loader that will be executed at application start to load data from the server\n\n* Client side context, router and event bus which will be automatically injected in every controller, filter, loader and handler (Handlers have only access to the context and the event bus)\n\n* Filters to intercept routing.\n\n* Separation of views into controllers and components with framework sided injection - similar to GWT Activities.\n\n* A controller life-cycle using `start`-, `mayStop`- and `stop`- similar to GWT Activities.\n\n* Popups\n\n* Controller based handler manager, that will remove all handlers from the event bus in case the controller is stopped to prevent memory leaks (handler registrations must be added to the manager).\n\n* UiBinder (nalu-plugin-gwt)\n\n* Composites to support smaller units of work\n\n* Controller \u0026 composite caching\n\n* Component creation inside a controller to support GWT replacement rules and static factory methods\n\n* Multi Shell Support\n\n* (nearly) Every widget lib (tested with: GWT, GXT, Domino-UI v1 \u0026 v2, Elemento, Elemental2, GWT-Material)\n\n* Maven multi module projects to separate an application in smaller parts (module feature)\n\n* Tracking user routing (in case a tracker is added)\n\n## Basic Concept\nNalu uses a hash to navigate. **Starting with version 1.1.0 Nalu supports the use of hash less URLs.** Everything explained here will also work without hash. In case of working with a hash less URL, you need to implement something on the server to handle a reload.\n\nExample hash:\n```\n#[shell]/[route]/:[parameter_1]/:[parameter_2]\n```\n\nwhere\n* shell: the shell to be used to display the route\n* route: navigation end point (a controller)\n* parameter_x: parameters of the route\n\nThe following flow shows the steps, once a routing is initiated. The flow will end with appending the new component to the DOM.\n\n![Route Flow](https://github.com/NaluKit/nalu/blob/main/etc/images/routeFlow.png)\n\nTo connect a component to a route, just create a controller class which extend\n`AbstractComponentController` and add the controller annotation `@Controller`.\n```JAVA\n@Controller(route = \"/shell/route/{parameter_01}/{parameter_02}\",\n            selector = \"content\",\n            component = MyComponent.class,\n            componentInterface = IMyComponent.class)\npublic class MyController\n    extends AbstractComponentController\u003cMyApplicationContext, IMyComponent, HTMLElement\u003e\n    implements ISearchComponent.Controller {\n    \n  @AcceptParameter(\"parameter_01\")\n  public void setParaemter01(String p01)\n      throws RoutingInterceptionException {\n      ...\n  }\n    \n  @AcceptParameter(\"parameter_02\")\n  public void setParaemter02(String p02)\n      throws RoutingInterceptionException {\n      ...\n  }\n\n\n}\n```\nTo navigate to a new route use inside a controller:\n```JAVA\n    this.router.route(\"/shell/route/{parameter_01}/{parameter_02}\",\n                      parameter_1,\n                      parameter_2);\n```\nThe router is injected in the controller. To route to a new component call the route method and add at least the new route. In case the route has parameters, just add them as additional parameters. (**Important note:** parameters are always Strings!)\n\n## Using\n\n### Dependencies\nTo use Nalu add the following dependencies to your pom:\n\n* **GWT 2.8.2**\n```XML\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu\u003c/artifactId\u003e\n    \u003cversion\u003e2.10.1-gwt-2.8.2\u003c/version\u003e\n\u003c/dependency\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu-processor\u003c/artifactId\u003e\n    \u003cversion\u003e2.10.1-gwt-2.8.2\u003c/version\u003e\n    \u003cscope\u003eprovided\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n* **GWT 2.9.0 (and newer) - SNAPSHOT**\n```XML\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu\u003c/artifactId\u003e\n    \u003cversion\u003eHEAD-SNAPSHOT\u003c/version\u003e\n\u003c/dependency\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu-processor\u003c/artifactId\u003e\n    \u003cversion\u003eHEAD-SNAPSHOT\u003c/version\u003e\n    \u003cscope\u003eprovided\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n* **GWT 2.9.0 (and newer)  - Release**\n```XML\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu\u003c/artifactId\u003e\n    \u003cversion\u003e3.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu-processor\u003c/artifactId\u003e\n    \u003cversion\u003e3.0.0\u003c/version\u003e\n    \u003cscope\u003eprovided\u003c/scope\u003e\n\u003c/dependency\u003e\n```\n\nDepending on the widget set your project is using, add one of the following plugins:\n\nIf the project uses a widget set based on **Elemental2**, **Elemento** or **Domino-UI**, use the **Nalu-Plugin-Elemental2** by adding the following lines to your pom:\n\n* **GWT 2.8.2**\n```XML\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu-plugin-elemental2\u003c/artifactId\u003e\n    \u003cversion\u003e2.10.1-gwt-2.8.2\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n* **GWT 2.9.0 (and newer)  - SNAPSHOT**\n```XML\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu-plugin-elemental2\u003c/artifactId\u003e\n    \u003cversion\u003eHEAD-SNAPSHOT\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n* **GWT 2.9.0 (and newer)  - Release**\n```XML\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu-plugin-elemental2\u003c/artifactId\u003e\n    \u003cversion\u003e3.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nFor Elemento there's a dedicated plugin which supports `org.jboss.gwt.elemento.core.IsElement\u003cE\u003e` as widget type:\n\n* **GWT 2.8.2**\n```XML\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu-plugin-elemento\u003c/artifactId\u003e\n    \u003cversion\u003e2.10.1-gwt-2.8.2\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n* **GWT 2.9.0 (and newer)  - SNAPSHOT**\n```XML\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu-plugin-elemento\u003c/artifactId\u003e\n    \u003cversion\u003eHEAD-SNAPSHOT\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n* **GWT 2.9.0 (and newer)  - Release**\n```XML\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu-plugin-elemento\u003c/artifactId\u003e\n    \u003cversion\u003e3.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nFor Domino-UI Version 2 there's also a dedicated plugin which supports `org.dominokit.domino.ui.IsElement` as widget type:\n\n* **GWT 2.9.0 (and newer)  - SNAPSHOT**\n```XML\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu-plugin-domino-v2\u003c/artifactId\u003e\n    \u003cversion\u003eHEAD-SNAPSHOT\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n* **GWT 2.9.0 (and newer)  - Release**\n```XML\n\u003cdependency\u003e\n    \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n    \u003cartifactId\u003enalu-plugin-domino-v2\u003c/artifactId\u003e\n    \u003cversion\u003e3.0.0\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n**(These plugins are ready to use with J2CL / GWT 3)**\n\nIf your project uses a widget set based on **GWT** 2.8.2 or newer, use the **Nalu-Plugin-GWT** by adding the following lines to your pom:\n\n* **GWT 2.8.2**\n```XML\n   \u003cdependency\u003e\n     \u003cgroupId\u003ecom.github.nalukit\u003c/groupId\u003e\n     \u003cartifactId\u003enalu-plugin-gwt\u003c/artifactId\u003e\n     \u003cversion\u003e2.10.1-gwt-2.8.2\u003c/version\u003e\n   \u003c/dependency\u003e\n   \u003cdependency\u003e\n      \u003cgroupId\u003ecom.github.nalukit\u003c/groupId\u003e\n      \u003cartifactId\u003enalu-plugin-gwt-processor\u003c/artifactId\u003e\n      \u003cversion\u003e2.10.1-gwt-2.8.2\u003c/version\u003e\n      \u003cscope\u003eprovided\u003c/scope\u003e\n   \u003c/dependency\u003e\n```\n\n* **GWT 2.9.0 (and newer)  - SNAPSHOT**\n```XML\n   \u003cdependency\u003e\n      \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n      \u003cartifactId\u003enalu-plugin-gwt\u003c/artifactId\u003e\n      \u003cversion\u003eHEAD-SNAPSHOT\u003c/version\u003e\n   \u003c/dependency\u003e\n   \u003cdependency\u003e\n      \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n      \u003cartifactId\u003enalu-plugin-gwt-processor\u003c/artifactId\u003e\n      \u003cversion\u003eHEAD-SNAPSHOT\u003c/version\u003e\n      \u003cscope\u003eprovided\u003c/scope\u003e\n   \u003c/dependency\u003e\n```\n\n* **GWT 2.9.0 (and newer)  - Release**\n```XML\n   \u003cdependency\u003e\n      \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n      \u003cartifactId\u003enalu-plugin-gwt\u003c/artifactId\u003e\n      \u003cversion\u003e3.0.0\u003c/version\u003e\n   \u003c/dependency\u003e\n   \u003cdependency\u003e\n      \u003cgroupId\u003eio.github.nalukit\u003c/groupId\u003e\n      \u003cartifactId\u003enalu-plugin-gwt-processor\u003c/artifactId\u003e\n      \u003cversion\u003e3.0.0\u003c/version\u003e\n      \u003cscope\u003eprovided\u003c/scope\u003e\n   \u003c/dependency\u003e\n```\n\n**(This plugin will not work with J2CL / GWT 3)**\n\nSee the wiki for more information about Nalu and how to use it.\n\n### Configuration\n\nDue to a bug in older version of the maven-compiler-plugin, the output of a annotation processor - during a Maven build - will not be logged.\nTo ensure, that the processor output is logged, use the latest maven-compiler-plugin.\n\n### System Requirements\n\nNalu supports the latest version of GWT and requires at least Java 11. During a build, Nalu is tested against Java 11, 17 and 21.\n\n## Wiki\nMore useful information about Nalu and how to use it, can be found inside the [Wiki](https://github.com/nalukit/nalu/wiki).\n\n## J2CL / GWT3\nWith the next version of GWT (GWT 3) and the new J2CL transpiler, there will be major changes in the GWT development. For example: JSNI and generators, besides other things, will be gone. To be prepared for the future things like JSNI, generators or any other dependency to GWT has to be removed and must be avoided.\n\nNalu uses only the already migrated `gwt-events` from `org.gwtproject`.\n \nNalu has **no** dependency to gwt-user nor Nalu's dependencies! Nalu does not use JSNI, generators or anything else from GWT (except the nalu-plugin-gwt) which will block moving to J2CL.\n\nNalu is ready to use with J2CL / GWT 3 as long as you do not use the nalu-plugin-gwt!\n\n## To get in touch with the developer\nPlease visit use us at [Nalu Gitter room](https://gitter.im/Nalukit42/Lobby).\n\n## Examples\nHere you will find many examples that show Nalu in action: [https://github.com/nalukit/nalu-examples](https://github.com/nalukit/nalu-examples).\n\n## YouTube\nYou will find a session about Nalu at the GWT Community Channel [here](https://www.youtube.com/watch?v=GsHY4f3cvRU).\n\n## Notes\nIn case you find a bug, please open an issue or post it inside the [Nalu Gitter room](https://gitter.im/Nalukit42/Lobby).\n\n## Comparsion between GWT Activities \u0026 Places versus Nalu\nAnyone, who is familiar with GWT Activities \u0026 Places, will find [here](https://github.com/NaluKit/nalu/wiki/01.-Motivation-\u0026-Concepts#comparison-gwt-activities--places-versus-nalu) a comparison between GWT Activities \u0026 Places and Nalu.\n\n## Migration to io.github\n\nMigration to the new namespace is quite simple. This are the steps you need to do:\n\n1. change the groupId from `com.github.nalukit` to `ìo.github.nalukit`\n2. replace all imports from `import com.github.nalukit` to `import io.github.nalukit`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNaluKit%2Fnalu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FNaluKit%2Fnalu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FNaluKit%2Fnalu/lists"}