Documentation
Docs
Introduction
Getting Started
Tutorial: build an app
Core Concepts
Routing
Server-Side Rendering
Mimir, state management
Pages & Layouts
API Routes
Styling & Theming
Building & Deploying
API Reference
Guides
Recipes
FAQ (use cases)
Configuration
A rune app is configured by ekko.json at the project root. It declares the project's identity, its
entry point, the packages it ships, an import map, and, crucially, the permissions it needs. JSONC is
supported (comments and trailing commas are fine).
A real rune-app ekko.json
Field reference
Identity
| Field | Meaning |
|---|---|
name | Package name (scoped @scope/name or plain). |
version | Semver. |
type | "run" for an app, "lib" for a library, also tool, gui, tui, test. |
description, license, repository, readme | Metadata. |
minEkko | Minimum runtime version. |
Entry & modules
| Field | Meaning |
|---|---|
entry | The file ekko run executes (e.g. server.tsx). |
imports | An import map: rewrite a bare specifier to a package. This is how import "react" becomes @ekko/react, so the whole React ecosystem points at EkkoJS's React. |
exports | For type: "lib", the public entry points ("." , "./sub"). |
Dependencies
| Field | Meaning |
|---|---|
ship | Runtime deps included with the published package. |
build | Build-only deps (not shipped). |
peer | Deps the consumer must provide; this package shares the consumer's single instance (how @ekko/react-dom shares one React with your app). |
ekko.lock records the resolved versions and where each came from (the store, or a local .ekl file).
Permissions
Anything declared here is granted without a --allow flag. Scoped grants restrict to paths/hosts/vars. Full
treatment in Permissions.
Packaging
package.include / package.exclude are glob lists controlling what ends up in the published/packed
artifact. A rune app includes its pages, components, atoms, lib, styles, static, content, and
the prebuilt .ekko/build (so production does not rebuild the client).
CLI flags vs ekko.json
Permissions can come from either place. During development you might run:
For a deployed service, declaring them in ekko.json keeps the systemd ExecStart short and the grants
versioned with the code. The two are additive; the runtime grants the union.
Workspaces
A monorepo ekko.json can declare a workspace with members and a map of package names to folders. The
EkkoJS package store resolves cross-member imports without publishing. rune apps work the same inside a
workspace; the docs site you are reading lives in such a layout (ekko-lib/*).
Next: the security model, Permissions.