[Intum Help](https://intum.com/help.md) / [Drive](https://intum.com/help/drive.md)

# [Platform - Custom Modules in Intum](https://intum.com/help/drive/platform-custom-modules-in-intum.md)

## What Is the Platform Module For?

The **Platform** module lets you create custom modules in Intum - add new sections to the system that work like native application elements. This way you can extend Intum with any functionality without modifying the source code.

Each module is a URL path (e.g., `/reports`, `/database`) linked to a content source - a CMS page, Noe app, knowledge base, or external JavaScript file.

## How to Enable the Platform Module?

1. Go to **Account -> Modules** (`/account/modules`)
2. Find the **Platform** module on the list
3. Click the toggle to enable it

After enabling, a **Platform** section will appear in the menu with a list of your modules.

## What Can Be Connected as a Module?

Each module can be linked to one of four sources:

- **Noe::App** - a single Noe application (Svelte, JS, HTML). Ideal for simple tools and dashboards. [More about Noe ->](/pomoc/noe-ai)
- **JavaScript file (source_url)** - an external JS application (e.g., built with Svelte, React, Vue). You provide a URL to the JS file, and the module loads it in a `<div id="intum_platform_module">` element. Ideal for applications built outside of Intum.
- **Cms::Site** - a full CMS site with multiple pages, layouts, and Liquid templates. In CMS pages you can embed any JavaScript, Svelte, Vue, React code - this way you build interactive applications directly in CMS. Ideal for complex modules with multiple pages. [More about CMS ->](/pomoc/cms)
- **Kb::KnowledgeBase** - a knowledge base with categories, entries, and search. Ideal for internal documentation. [More about the Knowledge Base ->](/pomoc/baza-wiedzy)

## Module from a JavaScript File

Instead of connecting an existing CMS site or Noe app, you can provide a URL to a JS file in the **Source URL** field. The module will load this file and execute it on the page.

The JS application should mount itself in the `#intum_platform_module` element:

```javascript
const target = document.getElementById("intum_platform_module")
// mount your app here
```

The JS file can be served from any source - from a CDN, your own server, or Intum assets. In development mode, it's convenient to use a local dev server (e.g., `http://localhost:3100/app.js`) with watch mode - you change the code, refresh the page, and see the result.

This approach lets you build modules in any framework (Svelte, React, Vue, vanilla JS) with your own build process, tests, and deployment.

## Module Layout

Each module can operate in one of two modes:

- **With app layout (app)** - the module is displayed within Intum's standard interface, with topbar, sidebar, and menu. It looks like a native part of the system. Useful when the module should match the rest of the application.
- **Without layout (none)** - the module takes up the entire page, without Intum interface elements. Useful for standalone applications, landing pages, widgets, or modules with their own navigation.

You set the mode in the **Layout** field when creating or editing a module.

## How to Create a New Module?

1. Go to **Platform -> Modules** (`/platform/modules`)
2. Click **New**
3. Fill in the form:
   - **Name** - displayed in the menu (e.g., "Sales Reports")
   - **Code** - module identifier (e.g., `reports`)
   - **URL** - the path where the module will be accessible (e.g., `reports` -> `/reports`). You can use `/*` at the end to catch subpaths (e.g., `reports/*` -> `/reports/anything`)
   - **Source URL** - optionally a URL to a JS file (instead of a CMS/Noe/KB source)
   - **Source type** - choose Cms::Site, Noe::App, or Kb::KnowledgeBase (when not using Source URL)
   - **Layout** - with app layout (sidebar, topbar) or without
   - **Permission** - optionally restrict access to a selected permission
4. Save
5. Enable the module in **Account -> Modules** (`/account/modules`) - it will appear in the menu

## URL with Wildcard

A module's URL can end with `/*` - it then catches the base address and all subpaths:

- `myapp/*` - works at `/myapp`, `/myapp/dashboard`, `/myapp/settings/profile`, etc.
- The subpath is passed to the module as navigation context

An exact URL (without `/*`) responds only to the exact address. If a module with an exact URL and another with a wildcard both exist - the exact match takes priority.

## Extending Existing Modules

Want to add a new option to an existing module, e.g., an additional page in the Organize section or a new view in CRM? Just use `/` in the module URL.

Enter as the URL the **name of the existing module**, a slash `/`, and the **name of the new option**. The new item will automatically appear in that module's menu, alongside the standard options.

### Examples

| Module URL | Effect |
|---|---|
| `organize/reports` | New **Reports** item in the **Organize** menu |
| `crm/analysis` | New **Analysis** item in the **CRM** menu |
| `helpdesk/faq` | New **FAQ** item in the **Helpdesk** menu |

## Access Control

Each module can have a **permission** set. If set, only users with that permission can see and open the module. If the field is empty, the module is accessible to all logged-in users.

## URL Addresses

Each module is accessible at two addresses:

- **Clean URL**: `/module-url` (e.g., `/reports`) - the main path
- **Fallback**: `/m/module-url` (e.g., `/m/reports`) - always works, even if the URL conflicts with an existing module