> ## Documentation Index
> Fetch the complete documentation index at: https://docs.withsutro.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Project configuration

> How sutro.config.json links a local SLang project to a Sutro Application.

## Overview

`sutro.config.json` links a local folder to a Sutro Project and Application. CLI commands that operate on a project, such as `sutro dev`, `sutro validate`, `sutro publish`, `sutro status`, and `sutro openapi`, read this file from the current working directory.

Create the file with:

```sh theme={null}
sutro init
```

## File format

Example:

```json theme={null}
{
  "$schema": "https://assets.withsutro.com/sutro-cli-schema.json",
  "projectId": "<PROJECT_ID>",
  "applicationId": "<APPLICATION_ID>",
  "entryFile": "app.slang"
}
```

Fields:

| Field           | Required | Description                                                                      |
| --------------- | -------- | -------------------------------------------------------------------------------- |
| `$schema`       | No       | JSON schema URL used by editors for validation and autocomplete.                 |
| `projectId`     | Yes      | Sutro Project ID linked to this folder.                                          |
| `applicationId` | Yes      | Sutro Application ID that receives validation, dev-session, and publish updates. |
| `entryFile`     | Yes      | SLang entry file. Defaults to `app.slang` when generated by `sutro init`.        |

`entryFile` must point to a file inside the project directory.

## Creating config

Create a new Project and Application:

```sh theme={null}
sutro init --name "Task API"
```

Create a new Application inside an existing Project:

```sh theme={null}
sutro init --project-id <PROJECT_ID>
```

Link an existing Application:

```sh theme={null}
sutro init --application-id <APPLICATION_ID>
```

Use a custom entry file:

```sh theme={null}
sutro init --entry-file backend/app.slang
```

## Source upload behavior

When the CLI uploads SLang source, it sends:

* The configured `entryFile`.
* Every `.slang` file under the project directory.
* Paths relative to the project directory.

The CLI skips generated and vendor directories:

| Directory      | Reason                                               |
| -------------- | ---------------------------------------------------- |
| `.git`         | Git internals are not source files.                  |
| `.slang-data`  | Local runtime data from older development workflows. |
| `.sutro`       | Local Sutro cache data.                              |
| `.turbo`       | Build cache.                                         |
| `coverage`     | Test coverage output.                                |
| `dist`         | Build output.                                        |
| `node_modules` | Installed dependencies.                              |

## Multi-file projects

Local imports work with multi-file projects. For example:

```text theme={null}
task-api/
  sutro.config.json
  app.slang
  models.slang
```

`app.slang` can import `models.slang`:

```slang theme={null}
import "./models"

action ListTasks(): Page<Task>
  body
    return pageOf Task
```

`models.slang` can define shared models:

```slang theme={null}
export entity Task
  fields
    title: TEXT
    completed: BOOLEAN
```

When you run `sutro dev`, `sutro validate`, or `sutro publish`, the CLI uploads both files.

## Related pages

* [Sutro CLI quickstart](/docs/getting-started/cli-quickstart)
* [CLI command reference](/docs/cli/command-reference)
* [SLang modules](/docs/SLang/modules)
