# Quickstart checklist

Work through this checklist while you install CKEditor AI On-Premises. It lists what you prepare, in the order you need it, and it ends with one request that proves the deployment works.

The checklist does not replace the install instructions. Generate the `docker run` command with the [Setup wizard](setup-wizard.md), or follow the [Deployment](deployment.md) guide step by step, and tick the boxes here as you go. Your browser stores the tick marks, so they survive a reload and nobody else sees them. Select **Reset** to clear them.

<a id="checklist">

0 / 16 completed

## Infrastructure

**Get a license key** – nothing installs without one. \[Contact us]\(https\://ckeditor.com/contact/) for a trial key or for access to the development build. **Prepare a container host** – a machine or cluster with an Open Container runtime. See [Software requirements](requirements.md#software-requirements) on the Requirements page. **Prepare an SQL database** – PostgreSQL or MySQL. See [SQL database](requirements.md#sql-database) on the Requirements page for the supported versions, and [SQL Database](deployment.md#sql-database) on the Deployment page for the creation scripts. **Prepare an in-memory data store** – Valkey or Redis. See [In-memory data store](requirements.md#in-memory-data-store) on the Requirements page for the supported versions, and [Redis database](configuration.md#redis-database) on the Configuration page for the connection options. **Choose file storage and configure it** – Amazon S3, Azure Blob Storage, the local filesystem, or the SQL database. See [Storage](configuration.md#storage) on the Configuration page.

## Installation

**Get a download token** – generate it in the Customer Portal. See [Get your Download token](deployment.md#step-1-get-your-download-token) on the Deployment page. **Pull the Docker image** – use the download token as the registry password. See [Pull the Docker image](deployment.md#step-2-pull-the-docker-image) on the Deployment page. **Configure an LLM provider** – you need at least one provider and the models it serves. See [LLM providers](llm-providers.md). **Launch the Docker container** – pass the configuration as environment variables. See [Launch the Docker container](deployment.md#step-3-launch-the-docker-container) on the Deployment page. To generate the command, use the [Setup wizard](setup-wizard.md). **Create an Environment and Access Key** – both come from the Management Panel. See [Create an Environment and Access Key](deployment.md#step-4-create-an-environment-and-access-key) on the Deployment page. **Create a token endpoint** – your application signs the JWT that authorizes each request. See [Create the token endpoint](deployment.md#step-5-create-the-token-endpoint) on the Deployment page, and the [Node.js example](../../examples/token-endpoints/nodejs.md). **Terminate TLS in front of the deployment** – put a load balancer or reverse proxy with your certificate in front of the application port. See [SSL communication](ssl.md). **Run the smoke test** – process a document through your own deployment. See [Smoke test](#smoke-test) below.

## Optional

**Integrate with Collaboration Server On-Premises** – share one SQL database and one in-memory data store between both products. See [Collaboration Server integration](collaboration-server-integration.md). **Configure MCP servers** – CKEditor AI then calls the tools those servers expose. See [MCP tools](mcp-tools.md). **Set up observability** – export traces to an OTLP backend, to Langfuse, or to both. See [Observability](observability.md).

<a id="smoke-test">

## Smoke test

Each box above checks one part. This last step checks that the parts work together. One request uses your token endpoint, the access key, the database, and your LLM provider.

Save the following HTML as `document.html`.

```html
<h2 data-id="e1">Quarterly product update</h2>
<p data-id="e2">we shipped the new dashbord to all customers this quater. it should of been out sooner but we hit some bugs in the rollout.</p>
<table data-id="e3" class="metrics-table">
	<thead>
		<tr><th>Metric</th><th>Q2</th><th>Q3</th></tr>
	</thead>
	<tbody>
		<tr><td>Active teams</td><td>1,204</td><td>1,688</td></tr>
		<tr><td>Uptime</td><td>99.95%</td><td>99.97%</td></tr>
	</tbody>
</table>
<ul data-id="e4">
	<li>Faster exports
		<ul><li>PDF and Word</li></ul>
	</li>
	<li class="highlight">New review workflow</li>
</ul>
<p data-id="e5"><em>Numbers above are unaudited.</em></p>
```

The command needs `curl` and `jq`. Replace the two placeholders before you run it:

* `<your-token-endpoint-url>` – the token endpoint you created under Installation above. The token it returns must carry the `ai:documents:process` permission.
* `<your-base-url>` – the address CKEditor AI On-Premises listens on, for example `https://ai.example.com`.

```bash
# 1. Get a token from your own token endpoint.
TOKEN=$(curl -s "<your-token-endpoint-url>")

# 2. Build the request from the file and send it to your deployment.
jq -n --rawfile doc document.html '{
	content: [ { type: "document", content: $doc } ],
	prompt: "Fix the spelling and grammar in the introduction paragraph. Leave everything else exactly as it is.",
	model: "agent-1"
}' | curl -s "<your-base-url>/v1/documents/process" \
	-H "Authorization: Bearer $TOKEN" \
	-H "Content-Type: application/json" \
	-w "\n(completed in %{time_total}s)\n" \
	-d @-
```

A successful call returns the edited document and a summary of the changes:

```json
{
	"documents": [
		{
			"document": "[the edited HTML]",
			"summary": "[what the model changed]"
		}
	]
}
```

Compare the returned document with the one you sent. The request passed if all of the following are true:

* The introduction paragraph is corrected.
* The table is unchanged.
* The nested list is unchanged.
* The `class` attributes are unchanged.
* The `data-id` attributes are unchanged.

If anything else changed, the model edited more than the prompt asked for. Check the `prompt` field in the request, then the model you configured.

> **Note**
>
> The request uses `agent-1`, the recommended model from the default model list. If you replaced the default list with your own `models` option, send one of your own model IDs instead. See [Custom models](llm-providers.md#custom-models).

---

Full index of the Cloud Services documentation: [llms.txt](../../../llms.txt)
