# createApp API
The `createApp` function is the main entry point for creating a Lune application instance.
## Usage
### Simple Initialization
```js
import { createApp } from "lune-js";
const app = createApp({
count: 0,
increment() {
this.count++;
}
});
app.mount("#app");
```
### Script Tag Inclusion
Depending on the CDN build, `createApp` is available as a global `Lune` object.
::: code-group
```html [esm]
```
```html [jsdelivr]
```
```html [unpkg]
```
:::
## Root Scope
The `createApp` function accepts a data object that serves as the root scope for all expressions. This is useful for bootstrapping simple apps or sharing state.
### Defining Root Scope
```js
createApp({
// exposed to all expressions
count: 0,
// getters
get plusOne() {
return this.count + 1;
},
// methods
increment() {
this.count++;
}
}).mount();
```
### Usage in Template
Properties defined in the root scope are available in all templates within the mounted app:
```html
Count: {{ count }}
Plus One: {{ plusOne }}
```
Note that when using a root scope, `lu-scope` doesn't need a value; it just marks the element as a Lune region.
## API Reference
### `createApp(initialData?: object)`
Creates a new application instance.
- **`initialData`**: An optional object that defines the initial state of the application. This state is made reactive with `reactive()` from `@lune-js/core`, Lune's [reactivity package](/guide/reactivity).
**Returns:** An application instance object.
## Instance Methods
### `app.mount(el?: string | Element | null)`
Mounts the application to the DOM and returns the app instance. If a selector string does not match any element, it logs a development warning and returns `undefined`.
- **`el`**: An optional selector string, `Element`, or `null`. If not provided, Lune will search for and mount to all elements with the `lu-scope` directive. If no `lu-scope` is found, it will mount to the entire `document.documentElement` (not recommended for performance).
### `app.unmount()`
Unmounts the application and cleans up reactive effects and directive cleanup callbacks. Native DOM event listeners registered by `lu-on` are attached to their elements and are not explicitly removed unless the element is removed or a custom directive returns its own cleanup callback.
### `app.directive(name: string, def?: Directive)`
Registers a global custom directive, or reads one back when `def` is omitted.
- **`name`**: The name of the directive (without the `lu-` prefix).
- **`def`**: The directive definition function. When passed, the app instance is returned so calls can be chained; when omitted, the currently registered directive of that name is returned instead.
### `app.use(plugin, ...options)`
Installs a plugin. The plugin is either an object with an `install()` method or a plain function, which is called with the same arguments. Any extra arguments are forwarded to it after the app instance.
- **`plugin`**: A plugin object with an `install()` method, or a function.
- **`options`**: Optional arguments forwarded to the plugin.
Installing the same plugin twice logs a development warning and is otherwise ignored.
## Instance Properties
### `app.scope`
The reactive root scope object of the application.
### `app.rootBlocks`
An array of internal `Block` instances representing the mounted application roots.
## Global Configuration
### Custom Delimiters
You can change the default mustache delimiters ({{ }}) by providing a `$delimiters` property in your initial data.
```js
createApp({
$delimiters: ["[[", "]]"],
message: "Hello"
}).mount();
```
Template usage:
```html