> Markdown version of [Overview](https://vaadin.com/docs/v7/framework/clientsideapp/clientsideapp-overview). Section index: [llms.txt](https://vaadin.com/docs/v7/framework/llms.txt)

# <a id="clientsideapp.overview"></a>Overview

Vaadin allows developing client-side modules that run in the browser. Client-side modules can use all the GWT widgets and some Vaadin-specific widgets, as well as the same themes as server-side Vaadin applications. Client-side applications run in the browser, even with no further server communications. When paired with a server-side service to gain access to data storage and server-side business logic, client-side applications can be considered "fat clients", in comparison to the "thin client" approach of the server-side Vaadin applications. The services can use the same back-end services as server-side Vaadin applications. Fat clients are useful for a range of purposes when you have a need for highly responsive UI logic, such as for games or for serving a huge number of clients with possibly stateless server-side code.

[Image: clientsideapp architecture hi]

Client-Side Application Architecture

A client-side application is defined as a *module*, which has an *entry-point* class. Its onModuleLoad() method is executed when the JavaScript of the compiled module is loaded in the browser.

Consider the following client-side application:

```
public class HelloWorld implements EntryPoint {
    @Override
    public void onModuleLoad() {
        RootPanel.get().add(new Label("Hello, world!"));
    }
}
```

The user interface of a client-side application is built under a HTML *root element*, which can be accessed by RootPanel.get(). The purpose and use of the entry-point is documented in more detail in ["Client-Side Module Entry-Point"](https://vaadin.com/docs/v7/framework/clientsideapp/clientsideapp-entrypoint.md#clientsideapp.entrypoint). The user interface is built from *widgets* hierarchically, just like with server-side Vaadin UIs. The built-in widgets and their relationships are catalogued in ["Client-Side Widgets"](https://vaadin.com/docs/v7/framework/clientsidewidgets/clientsidewidgets-overview.md#clientsidewidgets.overview). You can also use many of the widgets in Vaadin add-ons that have them, or make your own.

A client-side module is defined in a *module descriptor*, as described in ["Client-Side Module Descriptor"](https://vaadin.com/docs/v7/framework/clientside/clientside-module.md#clientside.module). A module is compiled from Java to JavaScript using the Vaadin Compiler, of which use was described in ["Compiling a Client-Side Module"](https://vaadin.com/docs/v7/framework/clientside/clientside-compiling.md#clientside.compiling). The ["Compiling and Running a Client-Side Application"](https://vaadin.com/docs/v7/framework/clientsideapp/clientsideapp-compiling.md#clientsideapp.compiling) in this chapter gives further information about compiling client-side applications. The resulting JavaScript can be loaded to any web page, as described in ["Loading a Client-Side Application"](https://vaadin.com/docs/v7/framework/clientsideapp/clientsideapp-loading.md#clientsideapp.loading).

The client-side user interface can be built declaratively using the included *UI Binder*.

The servlet for processing RPC calls from the client-side can be generated automatically using the included compiler.

Even with regular server-side Vaadin applications, it may be useful to provide an off-line mode if the connection is closed. An off-line mode can persist data in a local store in the browser, thereby avoiding the need for server-side storage, and transmit the data to the server when the connection is again available. Such a pattern is commonly used with Vaadin TouchKit.
