@intlayer/docs 9.0.0-canary.10 → 9.0.0-canary.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/cjs/generated/docs.entry.cjs +20 -0
  2. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  3. package/dist/esm/generated/docs.entry.mjs +20 -0
  4. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  5. package/dist/types/generated/docs.entry.d.ts +1 -0
  6. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  7. package/docs/ar/intlayer_CMS.md +16 -1
  8. package/docs/ar/releases/v9.md +58 -1
  9. package/docs/ar/self_hosting.md +349 -0
  10. package/docs/bn/intlayer_CMS.md +570 -0
  11. package/docs/bn/releases/v9.md +358 -0
  12. package/docs/cs/releases/v9.md +358 -0
  13. package/docs/de/intlayer_CMS.md +117 -1
  14. package/docs/de/releases/v9.md +61 -1
  15. package/docs/de/self_hosting.md +349 -0
  16. package/docs/en/intlayer_CMS.md +171 -1
  17. package/docs/en/releases/v9.md +45 -2
  18. package/docs/en/self_hosting.md +349 -0
  19. package/docs/en-GB/intlayer_CMS.md +16 -1
  20. package/docs/en-GB/releases/v9.md +47 -2
  21. package/docs/en-GB/self_hosting.md +349 -0
  22. package/docs/es/intlayer_CMS.md +117 -1
  23. package/docs/es/releases/v9.md +61 -1
  24. package/docs/es/self_hosting.md +349 -0
  25. package/docs/fr/intlayer_CMS.md +117 -1
  26. package/docs/fr/releases/v9.md +61 -1
  27. package/docs/fr/self_hosting.md +349 -0
  28. package/docs/hi/intlayer_CMS.md +16 -1
  29. package/docs/hi/releases/v9.md +59 -1
  30. package/docs/hi/self_hosting.md +349 -0
  31. package/docs/id/releases/v9.md +31 -1
  32. package/docs/id/self_hosting.md +349 -0
  33. package/docs/it/intlayer_CMS.md +117 -1
  34. package/docs/it/releases/v9.md +61 -1
  35. package/docs/it/self_hosting.md +349 -0
  36. package/docs/ja/intlayer_CMS.md +191 -10
  37. package/docs/ja/releases/v9.md +31 -1
  38. package/docs/ja/self_hosting.md +349 -0
  39. package/docs/ko/intlayer_CMS.md +189 -6
  40. package/docs/ko/releases/v9.md +30 -1
  41. package/docs/ko/self_hosting.md +349 -0
  42. package/docs/nl/releases/v9.md +358 -0
  43. package/docs/pl/intlayer_CMS.md +16 -1
  44. package/docs/pl/releases/v9.md +58 -1
  45. package/docs/pl/self_hosting.md +349 -0
  46. package/docs/pt/intlayer_CMS.md +117 -1
  47. package/docs/pt/releases/v9.md +61 -1
  48. package/docs/pt/self_hosting.md +349 -0
  49. package/docs/ru/intlayer_CMS.md +196 -15
  50. package/docs/ru/releases/v9.md +59 -1
  51. package/docs/ru/self_hosting.md +349 -0
  52. package/docs/tr/intlayer_CMS.md +16 -1
  53. package/docs/tr/releases/v9.md +46 -1
  54. package/docs/tr/self_hosting.md +349 -0
  55. package/docs/uk/intlayer_CMS.md +16 -1
  56. package/docs/uk/releases/v9.md +58 -1
  57. package/docs/uk/self_hosting.md +349 -0
  58. package/docs/vi/releases/v9.md +31 -1
  59. package/docs/vi/self_hosting.md +349 -0
  60. package/docs/zh/releases/v9.md +31 -1
  61. package/docs/zh/self_hosting.md +349 -0
  62. package/package.json +6 -6
  63. package/src/generated/docs.entry.ts +20 -0
@@ -0,0 +1,349 @@
1
+ ---
2
+ createdAt: 2026-06-30
3
+ updatedAt: 2026-06-30
4
+ title: Self-Hosting Intlayer
5
+ description: Run a complete Intlayer instance on your own infrastructure with a single command. No Intlayer Cloud account required.
6
+ keywords:
7
+ - Self-Hosting
8
+ - Docker
9
+ - Docker Compose
10
+ - Intlayer
11
+ - CMS
12
+ - Installation
13
+ - Infrastructure
14
+ slugs:
15
+ - doc
16
+ - self-hosting
17
+ author: aymericzip
18
+ ---
19
+
20
+ # Self-Hosting Intlayer
21
+
22
+ Intlayer can run entirely on your own infrastructure — no Intlayer Cloud account required. A single command boots a production-ready stack:
23
+
24
+ ```sh
25
+ curl -fsSL https://intlayer.org/install.sh | sh
26
+ ```
27
+
28
+ The installer downloads a `docker-compose.yml` and a `.env`, auto-generates the required secrets, and starts all containers with `docker compose up -d`.
29
+
30
+ ## Table of Contents
31
+
32
+ <TOC/>
33
+
34
+ ---
35
+
36
+ ## Architecture
37
+
38
+ ```
39
+ ┌─────────────────────────────┐
40
+ browser ──────▶ │ app (TanStack Start) :3000│ ──┐
41
+ └─────────────────────────────┘ │ VITE_BACKEND_URL
42
+ ┌─────────────────────────────┐ │
43
+ │ backend (Fastify/Bun) :3100│ ◀─┘
44
+ └──────────────┬──────────────┘
45
+ ┌──────────┬─────────┼──────────┬───────────┐
46
+ ▼ ▼ ▼ ▼ ▼
47
+ mongo:27017 redis:6379 minio:9000 mailpit:1025 Chromium
48
+ (1-node RS) (S3 API) (SMTP) (in-image)
49
+ minio:9001 mailpit:8025
50
+ (console) (web UI)
51
+ ```
52
+
53
+ Chromium (used for Puppeteer screenshot generation) is bundled inside the backend image — no separate container is needed.
54
+
55
+ ---
56
+
57
+ ## Prerequisites
58
+
59
+ - **Docker** ≥ 24 and **Docker Compose** ≥ v2. If either is missing, the installer prints the install link and exits.
60
+ - Ports `3000`, `3100`, `8025`, `9000`, and `9001` available on the host.
61
+ - A Linux or macOS host (or WSL2 on Windows).
62
+
63
+ ---
64
+
65
+ ## Quick start
66
+
67
+ ```sh
68
+ curl -fsSL https://intlayer.org/install.sh | sh
69
+ ```
70
+
71
+ What the installer does:
72
+
73
+ 1. Checks that `docker` and `docker compose` are present.
74
+ 2. Downloads `docker-compose.yml` and `.env.example` into `./intlayer/`.
75
+ 3. If no `.env` exists, copies the example and generates random secrets for `BETTER_AUTH_SECRET`, `S3_ACCESS_KEY_ID`, and `S3_SECRET_ACCESS_KEY` via `openssl rand`.
76
+ 4. Runs `docker compose pull` + `docker compose up -d`.
77
+ 5. Prints the URLs: dashboard `:3000`, API `:3100`, email UI `:8025`, MinIO console `:9001`.
78
+
79
+ After the stack is up, open **http://localhost:3000** and create your first account.
80
+
81
+ ---
82
+
83
+ ## Services
84
+
85
+ | Service | Image | Host port(s) | Purpose |
86
+ | ----------- | ------------------------------------ | ------------------------------ | -------------------------------------------------------- |
87
+ | **app** | built from `apps/app/Dockerfile` | `3000` | TanStack Start dashboard (CMS UI) |
88
+ | **backend** | built from `apps/backend/Dockerfile` | `3100` | Fastify REST API (`/health` endpoint) |
89
+ | **mongo** | `mongo:7` | internal | Single-node replica set (`rs0`) |
90
+ | **redis** | `redis:7-alpine` | internal | Job queues (BullMQ) and caching (ioredis) |
91
+ | **minio** | `minio/minio` | `9000` (S3), `9001` (console) | S3-compatible object storage for avatars and screenshots |
92
+ | **mailpit** | `axllent/mailpit` | `1025` (SMTP), `8025` (web UI) | Local transactional email sink |
93
+
94
+ Internal ports (mongo, redis) are not exposed to the host by default.
95
+
96
+ > MinIO port `9000` must be reachable by the browser because uploaded assets (avatars, screenshots) are loaded directly from `S3_PUBLIC_URL=http://localhost:9000/intlayer`.
97
+
98
+ ---
99
+
100
+ ## Environment variables
101
+
102
+ The installer generates a ready-to-use `.env`. The table below describes every variable.
103
+
104
+ ### Required (auto-generated or prompted)
105
+
106
+ | Variable | Example | Description |
107
+ | ---------------------- | ----------------------------------------------- | -------------------------------------------------- |
108
+ | `NODE_ENV` | `production` | Runtime environment |
109
+ | `PORT` | `3100` | Backend listening port |
110
+ | `BACKEND_URL` | `http://localhost:3100` | Public URL of the backend API |
111
+ | `APP_URL` | `http://localhost:3000` | Public URL of the dashboard |
112
+ | `DOMAIN` | `localhost` | Cookie domain |
113
+ | `MONGODB_URI` | `mongodb://mongo:27017/intlayer?replicaSet=rs0` | Full MongoDB connection URI |
114
+ | `REDIS_URL` | `redis://redis:6379` | Redis connection URL |
115
+ | `BETTER_AUTH_SECRET` | _(generated)_ | 32-byte secret for session signing |
116
+ | `MAIL_PROVIDER` | `smtp` | Mail transport: `smtp` or `resend` |
117
+ | `MAIL_SMTP_HOST` | `mailpit` | SMTP hostname (Mailpit container name) |
118
+ | `MAIL_SMTP_PORT` | `1025` | SMTP port |
119
+ | `MAIL_FROM` | `Intlayer <no-reply@localhost>` | Sender address |
120
+ | `S3_ENDPOINT` | `http://minio:9000` | S3-compatible endpoint |
121
+ | `S3_PUBLIC_URL` | `http://localhost:9000/intlayer` | Public URL for browser asset loading |
122
+ | `S3_BUCKET_NAME` | `intlayer` | Bucket name |
123
+ | `S3_ACCESS_KEY_ID` | _(generated)_ | MinIO access key |
124
+ | `S3_SECRET_ACCESS_KEY` | _(generated)_ | MinIO secret key |
125
+ | `VITE_BACKEND_URL` | `http://localhost:3100` | Backend URL baked into the dashboard at build time |
126
+ | `VITE_DOMAIN` | `localhost` | Domain baked into the dashboard at build time |
127
+
128
+ ### Optional (features degrade gracefully when absent)
129
+
130
+ | Variable | Feature |
131
+ | -------------------------------------------------------- | ----------------------------------------------------------- |
132
+ | `OPENAI_API_KEY` | AI-assisted translation and content audit |
133
+ | `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, `STRIPE_*` | Billing and subscription management |
134
+ | `RESEND_API_KEY` | Transactional email via Resend (overrides Mailpit when set) |
135
+ | `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | GitHub OAuth login |
136
+ | `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` | Google OAuth login |
137
+ | `GITLAB_CLIENT_ID`, `GITLAB_CLIENT_SECRET` | GitLab OAuth login |
138
+ | `MICROSOFT_CLIENT_ID`, `MICROSOFT_CLIENT_SECRET` | Microsoft OAuth login |
139
+ | `LINKEDIN_CLIENT_ID`, `LINKEDIN_CLIENT_SECRET` | LinkedIn OAuth login |
140
+ | `ATLASSIAN_CLIENT_ID`, `ATLASSIAN_CLIENT_SECRET` | Atlassian OAuth login |
141
+
142
+ ---
143
+
144
+ ## Connecting your Intlayer project
145
+
146
+ Once the stack is running, point your project at the self-hosted backend and dashboard instead of `intlayer.org`.
147
+
148
+ ### Project configuration
149
+
150
+ ```typescript fileName="intlayer.config.ts" codeFormat={["typescript", "esm", "commonjs"]}
151
+ import type { IntlayerConfig } from "intlayer";
152
+
153
+ const config: IntlayerConfig = {
154
+ editor: {
155
+ clientId: process.env.INTLAYER_CLIENT_ID,
156
+ clientSecret: process.env.INTLAYER_CLIENT_SECRET,
157
+
158
+ /**
159
+ * URL of the self-hosted CMS dashboard.
160
+ * Default: https://app.intlayer.org
161
+ */
162
+ cmsURL: process.env.INTLAYER_CMS_URL, // e.g. http://localhost:3000
163
+
164
+ /**
165
+ * URL of the self-hosted backend API.
166
+ * Default: https://back.intlayer.org
167
+ */
168
+ backendURL: process.env.INTLAYER_BACKEND_URL, // e.g. http://localhost:3100
169
+ },
170
+ };
171
+
172
+ export default config;
173
+ ```
174
+
175
+ Set the environment variables in your project's `.env`:
176
+
177
+ ```sh
178
+ INTLAYER_CMS_URL=http://localhost:3000
179
+ INTLAYER_BACKEND_URL=http://localhost:3100
180
+ INTLAYER_CLIENT_ID=<your-client-id>
181
+ INTLAYER_CLIENT_SECRET=<your-client-secret>
182
+ ```
183
+
184
+ Create access credentials in your self-hosted dashboard under **Projects → Access keys** at `http://localhost:3000/projects`.
185
+
186
+ ### `@intlayer/api` SDK
187
+
188
+ When using the `@intlayer/api` SDK programmatically, pass `backendURL` explicitly:
189
+
190
+ ```typescript fileName="cms.ts" codeFormat="typescript"
191
+ import { createIntlayerCMS } from "@intlayer/api";
192
+ import { dictionaryEndpoint } from "@intlayer/api/dictionary";
193
+
194
+ const cms = createIntlayerCMS({
195
+ editor: {
196
+ clientId: process.env.INTLAYER_CLIENT_ID,
197
+ clientSecret: process.env.INTLAYER_CLIENT_SECRET,
198
+ backendURL: process.env.INTLAYER_BACKEND_URL, // http://localhost:3100
199
+ },
200
+ });
201
+
202
+ const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
203
+ ```
204
+
205
+ ---
206
+
207
+ ## Upgrading
208
+
209
+ Re-running the installer on an existing deployment performs a rolling upgrade:
210
+
211
+ ```sh
212
+ curl -fsSL https://intlayer.org/install.sh | sh
213
+ ```
214
+
215
+ This pulls the latest images and restarts containers with `docker compose pull && docker compose up -d`. Existing volumes (`mongo-data`, `redis-data`, `minio-data`) are preserved — no data loss.
216
+
217
+ To upgrade manually from inside the `./intlayer/` directory:
218
+
219
+ ```sh
220
+ docker compose pull
221
+ docker compose up -d
222
+ ```
223
+
224
+ ---
225
+
226
+ ## Backup and restore
227
+
228
+ All persistent data lives in three named Docker volumes.
229
+
230
+ ### Backup
231
+
232
+ ```sh
233
+ docker run --rm \
234
+ -v intlayer_mongo-data:/data \
235
+ -v "$(pwd)":/backup \
236
+ busybox tar czf /backup/mongo-data.tar.gz /data
237
+
238
+ docker run --rm \
239
+ -v intlayer_redis-data:/data \
240
+ -v "$(pwd)":/backup \
241
+ busybox tar czf /backup/redis-data.tar.gz /data
242
+
243
+ docker run --rm \
244
+ -v intlayer_minio-data:/data \
245
+ -v "$(pwd)":/backup \
246
+ busybox tar czf /backup/minio-data.tar.gz /data
247
+ ```
248
+
249
+ ### Restore
250
+
251
+ ```sh
252
+ docker run --rm \
253
+ -v intlayer_mongo-data:/data \
254
+ -v "$(pwd)":/backup \
255
+ busybox tar xzf /backup/mongo-data.tar.gz -C /
256
+
257
+ # Repeat for redis-data and minio-data
258
+ ```
259
+
260
+ ---
261
+
262
+ ## Using a reverse proxy (Nginx / Caddy)
263
+
264
+ For production deployments, place a reverse proxy in front of the app and backend containers instead of exposing them directly.
265
+
266
+ ### Nginx example
267
+
268
+ ```nginx
269
+ server {
270
+ listen 80;
271
+ server_name cms.example.com;
272
+
273
+ location / {
274
+ proxy_pass http://localhost:3000;
275
+ proxy_set_header Host $host;
276
+ proxy_set_header X-Real-IP $remote_addr;
277
+ }
278
+ }
279
+
280
+ server {
281
+ listen 80;
282
+ server_name api.example.com;
283
+
284
+ location / {
285
+ proxy_pass http://localhost:3100;
286
+ proxy_set_header Host $host;
287
+ proxy_set_header X-Real-IP $remote_addr;
288
+ }
289
+ }
290
+ ```
291
+
292
+ Update the following `.env` variables to match your public domains:
293
+
294
+ ```sh
295
+ BACKEND_URL=https://api.example.com
296
+ APP_URL=https://cms.example.com
297
+ DOMAIN=example.com
298
+ VITE_BACKEND_URL=https://api.example.com
299
+ VITE_DOMAIN=example.com
300
+ ```
301
+
302
+ > `VITE_*` variables are baked into the dashboard image at build time. If you change them after the image is built, you need to rebuild the `app` image (`docker compose build app`) or use runtime config injection.
303
+
304
+ ---
305
+
306
+ ## Troubleshooting
307
+
308
+ ### Backend crash-loops on first start
309
+
310
+ MongoDB and Redis must be healthy before the backend starts. The compose file uses `depends_on` with `condition: service_healthy`. If you see repeated backend restarts, check that the `mongo` and `redis` healthchecks pass:
311
+
312
+ ```sh
313
+ docker compose ps
314
+ docker compose logs mongo
315
+ docker compose logs redis
316
+ ```
317
+
318
+ ### Dashboard cannot reach the API
319
+
320
+ Verify that `VITE_BACKEND_URL` matches the URL where the backend is reachable from the **browser** (not the Docker network). If you changed the backend port or added a reverse proxy, rebuild the dashboard image:
321
+
322
+ ```sh
323
+ docker compose build app
324
+ docker compose up -d app
325
+ ```
326
+
327
+ ### Email not sending
328
+
329
+ By default, all outbound email is captured by Mailpit. Open `http://localhost:8025` to see sent messages. To send real email, set `MAIL_PROVIDER=resend` and `RESEND_API_KEY=<your-key>` in `.env`, then restart the backend:
330
+
331
+ ```sh
332
+ docker compose restart backend
333
+ ```
334
+
335
+ ### MinIO bucket missing
336
+
337
+ If the `minio-init` one-shot service didn't run (or ran before MinIO was ready), create the bucket manually:
338
+
339
+ ```sh
340
+ docker compose run --rm minio-init
341
+ ```
342
+
343
+ ---
344
+
345
+ ## Useful links
346
+
347
+ - [Intlayer CMS documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_CMS.md)
348
+ - [Configuration reference](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md)
349
+ - [CMS SDK — `@intlayer/api`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_CMS.md#programmatic-access-with-the-intlayerapi-sdk)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  createdAt: 2025-08-23
3
- updatedAt: 2025-08-23
3
+ updatedAt: 2026-06-30
4
4
  title: Intlayer CMS | Externalise your content into the Intlayer CMS
5
5
  description: Externalise your content into the Intlayer CMS to delegate the management of your content to your team.
6
6
  keywords:
@@ -18,6 +18,9 @@ slugs:
18
18
  - cms
19
19
  youtubeVideo: https://www.youtube.com/watch?v=UDDTnirwi_4
20
20
  history:
21
+ - version: 9.0.0
22
+ date: 2026-06-30
23
+ changes: "Add Self-Hosting section"
21
24
  - version: 6.0.1
22
25
  date: 2025-09-22
23
26
  changes: "Add live sync documentation"
@@ -373,6 +376,18 @@ Notes and constraints:
373
376
  - The `live` flag is evaluated for each dictionary at build time. If remote content was not flagged `live=true` during build, you must rebuild to enable Live Sync for that dictionary.
374
377
  - The live sync server must be able to write to `.intlayer`. In containers, ensure write access to `/.intlayer`.
375
378
 
379
+ ## Self-Hosting
380
+
381
+ Intlayer can run entirely on your own infrastructure. A one-liner bootstraps the full stack (dashboard, API, database, object storage, and email) with Docker Compose:
382
+
383
+ ```sh
384
+ curl -fsSL https://intlayer.org/install.sh | sh
385
+ ```
386
+
387
+ For the complete setup guide, environment variable reference, upgrade instructions, and backup/restore procedures, see the [Self-Hosting Guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/self_hosting.md).
388
+
389
+ ---
390
+
376
391
  ## Debug
377
392
 
378
393
  If you encounter any issues with the CMS, check the following:
@@ -1,14 +1,17 @@
1
1
  ---
2
2
  createdAt: 2026-06-14
3
- updatedAt: 2026-06-26
3
+ updatedAt: 2026-06-30
4
4
  title: New Intlayer v9 - What's new?
5
- description: Discover what's new in Intlayer v9. Introducing drop-in compatibility packages for popular i18n libraries and support for Collections and Variants.
5
+ description: Discover what's new in Intlayer v9. Introducing drop-in compatibility packages for popular i18n libraries, support for Collections and Variants, and self-hosting via Docker Compose.
6
6
  keywords:
7
7
  - Intlayer
8
8
  - Compatibility
9
9
  - Migration
10
10
  - Collections
11
11
  - Variants
12
+ - CMS SDK
13
+ - Self-Hosting
14
+ - Docker
12
15
  - i18next
13
16
  - next-intl
14
17
  - vue-i18n
@@ -295,6 +298,46 @@ npm install intlayer react-native-intlayer
295
298
 
296
299
  ---
297
300
 
301
+ ## CMS SDK: use Intlayer as a headless content database
302
+
303
+ Intlayer v9 ships a clean, auto-authenticating SDK in `@intlayer/api` to interact with the CMS programmatically — fetch projects, fetch dictionaries, and push or update them from your own server, scripts, or CI. Authentication (OAuth2 `client_credentials`) is handled and refreshed for you.
304
+
305
+ The SDK is split into **two separate imports** so your bundle includes only the domains you actually use:
306
+
307
+ 1. `createIntlayerCMS` — a lightweight **authenticator** holding the credentials and the managed token (no domain client bundled).
308
+ 2. `dictionaryEndpoint`, `projectEndpoint`, … — per-domain **endpoint binders**, each imported from its own subpath.
309
+
310
+ ```ts fileName="cms.ts"
311
+ import { createIntlayerCMS } from "@intlayer/api";
312
+ import { dictionaryEndpoint } from "@intlayer/api/dictionary";
313
+
314
+ // Config is optional: credentials fall back to INTLAYER_CLIENT_ID /
315
+ // INTLAYER_CLIENT_SECRET resolved by `@intlayer/config/built`.
316
+ const cms = createIntlayerCMS();
317
+
318
+ // Read
319
+ const { data: dictionaries } = await dictionaryEndpoint(cms).getDictionaries();
320
+
321
+ // Write — use the CMS like a database
322
+ await dictionaryEndpoint(cms).pushDictionaries([myDictionary]);
323
+ ```
324
+
325
+ > Security: the CMS credentials grant write access to your content. Only ever create the authenticator on the **server side** — never ship `clientId` / `clientSecret` to the browser.
326
+
327
+ ---
328
+
329
+ ## Self-Hosting
330
+
331
+ Intlayer v9 ships first-class support for running your own Intlayer instance with a single command — no Intlayer Cloud account required.
332
+
333
+ ```sh
334
+ curl -fsSL https://intlayer.org/install.sh | sh
335
+ ```
336
+
337
+ The installer downloads a `docker-compose.yml` and a `.env`, auto-generates the required secrets, and runs `docker compose up -d`. Everything — the dashboard, the API, the database, object storage, and transactional email — runs locally in containers.
338
+
339
+ ---
340
+
298
341
  ## Migration notes from v8
299
342
 
300
343
  If you are upgrading from v8, note that the v9 does not include breaking changes. But here are the key changes:
@@ -310,3 +353,5 @@ If you are upgrading from v8, note that the v9 does not include breaking changes
310
353
  - [Compat Adapter Packages Guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/compat/index.md)
311
354
  - [Dynamic Dictionaries - Collections & Variants](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dynamic_dictionaries/index.md)
312
355
  - [Configuration Reference](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md)
356
+ - [CMS SDK - Programmatic access with @intlayer/api](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/intlayer_CMS.md)
357
+ - [Self-Hosting Guide](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/self_hosting.md)