The Project panel is a file manager built into the application. It lets you upload, download, rename, move and delete the files that belong to the project, without needing file system access to the server.
Open the Quick Menu with CTRL+Q and click Project in the bottom navigation bar.
The panel is divided into three sections, shown as tabs at the top: Online Files, Offline Files and Python Libraries. Each tab is a separate repository with its own folder structure. Switching tabs reloads the list from the root of that repository.
Sections
The three sections differ in how the files are reached at runtime.
| Section | Description | Typical content |
|---|---|---|
| Online Files | Files served by the web server, so they can be opened with a web address from any client. Each file has a Copy URL button that copies its address to the clipboard. | Documents, manuals, datasheets, PDF files, images and any file you want to open from a page |
| Offline Files | Files stored with the project and available on the server itself. They are reached by file path rather than by a web address. | Templates, data files and reference files used by Python scripts |
| Python Libraries | Python code that scripts can import. This folder is added to the Python search path, so a module placed here can be imported by name from any Python script. | Third party modules and packages, and shared helper code |
No rows match the filter.
Working with files and folders
The breadcrumb at the top of the panel shows where you are. Click Home or any folder name in the breadcrumb to jump back to that level. Click a folder in the list to open it, and click a file name to download it.
The buttons to the right of the breadcrumb apply to the folder you are currently in:
- New Folder opens an input field. Type the folder name and click Create.
- Upload Folder uploads a folder from your computer, including its subfolders.
- Upload File uploads one or more files. You can select several files at once.
- Download downloads a file. On a folder, the button reads Download ZIP and packs the whole folder into a ZIP archive.
- Copy URL copies the web address of the file to the clipboard. This button appears in the Online Files section.
- Rename replaces the name with an input field. Edit the name and click Save.
- Delete asks for confirmation before the file or folder is removed.
- Drag a file or folder onto another folder, or onto a folder in the breadcrumb, to move it there.
- Type in the search field to search the current section by name. The search covers all subfolders and lists the matches with the folder they are in.
Opening an online file from a page
Files in the Online Files section are served under the /Project/ path of the server, followed by the folder structure and the file name. Use Copy URL to get the exact address rather than typing it, because the address includes every folder level.
A file named Manual.pdf in a folder Documents is reached as:
http://127.0.0.1/Project/Documents/Manual.pdfPython Libraries
The Python Libraries section is the folder that Python scripts import from. It is added to the Python search path at startup, so a module uploaded here is imported by its file name without a path.
A file helpers.py uploaded to the root of this section is used in a script as:
import helpers
helpers.MyFunction()To reuse your own code across scripts you can also mark a Python script as a module and import it directly. See the Python Scripts article.
Export, import and version control
All three sections are part of the project. They are included when you use Export Project and are restored by Import Project, and they are also included in the Git repository when version control is used. Files uploaded through the Project panel therefore travel with the project to another server.
Managing project files from the Config API or an MCP client
Online Files and Offline Files are also reachable from outside the Project panel, for files produced by another system or handled by an automation task instead of being picked from a browser. The Config API endpoints are listed below, and an MCP client such as an AI assistant uses the single Manage Project Files tool, where an action selects the operation. Listing and reading a file are available on both the primary and the standby server; writing requires a user in the Administrators group and runs on the primary server.
| Operation | Endpoint | Description |
|---|---|---|
| List | GET /API/Config/ProjectFiles | Lists a folder. Returns the name, path, size and last modification time of every entry, and walks subfolders when the recursive option is set. |
| Read | GET /API/Config/ProjectFiles/Content | Returns the content of one file, as text when the file is text and as base64 for other files, up to 10 MB. |
| Upload | POST /API/Config/ProjectFiles | Writes one file, with the fields listed below. Folders in the target path that do not exist yet are created. |
| New folder | POST /API/Config/ProjectFiles/Folder | Creates a folder, including every missing level. A folder that already exists is reported as present. |
| Move or rename | POST /API/Config/ProjectFiles/Move | Moves a file or folder to another folder, or renames it. Naming an existing folder as the target moves the item into that folder under the same name. |
| Delete | POST /API/Config/ProjectFiles/Delete | Removes a file or folder. A folder that still holds files or subfolders requires the recursive option, and the message reports how many items it holds. |
No rows match the filter.
The upload accepts the following fields.
| Field | Description | Example |
|---|---|---|
| Section | Which section to write to: online for Online Files, offline for Offline Files. Images shown on a report belong in Online Files, because the report renderer reads them from the web root. Offline Files holds what the server itself opens, such as a custom SQLite database queried by a report table or by a Python script. | online |
| Path | Target folder inside the section, written with forward slashes. Leave it empty to write in the root of the section. Folders that do not exist yet are created. | Documents/Manuals |
| File Name | Name of the file to write, without a folder. | Manual.pdf |
| Content Text | File content as plain text. Use this for csv, json, txt and svg files. | Tag,Value |
| Content Base64 | File content encoded as base64. Use this for images, PDF files, databases and other binary files. A full data URI is accepted as well. | iVBORw0KGgo... |
| Overwrite | Set to true to replace a file that already exists. While it stays false, the existing file is kept and the call reports that the name is already in use. | false |
No rows match the filter.
Supply the content in either Content Text or Content Base64. A file uploaded this way can be up to 10 MB; use the Upload File button in the Project panel for larger files. The answer reports the section, the path of the file inside that section, the number of bytes written, and for Online Files the web address the file is served at.
- Renaming or moving a file in Online Files changes the web address it is served at. Update whatever pointed at it, such as a report image or a Document Viewer, in the same session.
- Every upload, folder creation, move and delete is written to the audit trail as a configuration change on entity type ProjectFiles, recording the user, the section and the path.
- The Python Libraries section can be listed and read through the same endpoints, and is maintained from the Project panel.
- The image of an Image object on a page is stored with the object itself and is set in the graphics editor, so it is not uploaded to a project files section.
- In a redundant system the file is written on the server that receives the call, the same as a file uploaded in the Project panel. Upload it on both servers when both have to serve it, or transfer the project.