---
title: Configuration
description: The options for markless() and router() in vite.config.ts, and where Nitro configuration goes.
---

Last page, the build packed everything into `.output/`. This page lists the few options that change the build.

A new app has a two-item plugin list. Most apps never change it.

```ts vite.config.ts
import { markless } from '@markless/core/vite';
import { router } from '@markless/router/vite';
import { defineConfig } from 'vite-plus';

export default defineConfig({
	plugins: [markless(), router()],
});
```

## router() options

| Option | Default | Effect |
| --- | --- | --- |
| `prefetch` | `true` | `false` stops every early load, on hover, focus, press, or idle. Links still navigate. |

## markless() options

| Option | Default | Effect |
| --- | --- | --- |
| `packing` | `true` | `false` ships one file per module instead of a few packed chunks. The dev server never packs. |

`markless()` has more options, such as `debug` and `hmr`. Treat them as advanced. They can change without notice.

:::warning[Why do I see MARKLESS_DEPRECATED_OPTION?]
Markless deprecated `experimentalNativePacking`, because packing is now on by default. Remove the option, or set `packing: false` to turn packing off.
:::

## Nitro configuration

Put Nitro configuration in a top-level `nitro` key. The router merges it into its own Nitro setup. The Markless website serves from a sub-path this way:

```ts vite.config.ts
export default defineConfig({
	base: '/markless/',
	nitro: { baseURL: '/markless/' },
	plugins: [markless(), router()],
});
```

## Plugin order with @markless/ui

If you use `@markless/ui`, put `ui()` from `@markless/ui/vite` before `markless()`. Otherwise the build stops with an error that tells you to move it.

```ts vite.config.ts
plugins: [ui(), markless(), router()],
```

**Next:** What does `@markless/ui` give you? [UI overview →](/ui/overview)
