Release Notes
A studio to create, deploy, and query IIoT field apps via chat — the latest version is 2026.08.
Versions follow the format YYYY.MM (e.g., 2026.08). Updates within the same month keep the
same version number and are listed below in order of the date they were applied.
For installation and upgrade instructions, see Installation.
🚚 New Download URL — product.kopens.io
The installation script and air-gapped bundle have been moved from download.kopens.io to product.kopens.io.
The folder structure and file names remain unchanged. If you have the installation command
hardcoded in a script, just update the URL.
…-latest.tar.gz has been removedBecause it was a copy of the latest bundle, downloading it mid-release could cause a checksum
mismatch, leading a perfectly good file to be judged as "corrupted." Now, read the latest.txt that
contains only the name of the latest version and download from the versioned URL.
BASE=https://product.kopens.io/plantpulse-studio
VER=$(curl -fsSL $BASE/latest.txt)
curl -fLO -C - --retry 5 $BASE/plantpulse-studio-images-$VER.tar.gz
Once a version is published, it is never deleted. Even if 2026.09 is released, the …-2026.08.tar.gz
address remains valid, so you can re-download or roll back at any time. If you have locked your
installation procedure in a script, it is safer to hardcode the version rather than rely on latest.txt.
🗓 Monthly Release Schedule — 2026.08
A new version is released on the 1st of every month. 2026.08 is a release that only includes deployment automation changes—no product feature changes. If you are on 2026.07, there is no urgent need to upgrade.
Check First — Required Actions Before Upgrading
| If this applies to you | Action required |
|---|---|
| Running in a non-air-gapped environment | Apply this update as soon as possible (blocks exposure of the builder sidecar) |
| API keys are stored in the config file | Move keys to .env → Secret Management |
| Serving via a domain or reverse proxy | Users must log in once more → Domain & Reverse Proxy |
| You have backups but have never tested a restore | Run a restore rehearsal once → Backup & Restore |
🛡 Comprehensive Data Integrity Audit
We audited the entire source and fixed 3 critical and 15 high-severity issues. Most were the type that "remain hidden in normal operation but surface exactly when you need them," so we built reproduction tests first and then applied fixes.
Backup & Restore
Restores were not actually restoring anything. Backups were being taken successfully every day,
but executing a restore showed "Restore complete" without a single change to the database.
In previous versions, even if the DRYRUN=1 rehearsal passed, the actual restore didn't work. We strongly
recommend testing a real restore after this update → Backup & Restore
- A pre-restore rescue copy failure was ignored and the restore proceeded; there was no way to roll back using that rescue copy. Now it creates the rescue copy in the same format as a formal backup and will not start a restore if it fails.
- Backups were missing the
.env. After moving keys to environment variables, without this file a backup alone is insufficient to recover the system → Secret Management - Fixed an issue where a
postgresfolder inside a workspace was silently excluded from backups. - Scheduled backups were failing from the very first run (the log file path did not exist). If
you have automatic backups enabled, it's possible that none were ever created, so please check
dist/.
Data Loss
- Deleting a single chat room could also delete other users' query history.
- The trash (which should retain deleted projects for 7 days) was being emptied immediately on the next restart.
- If a repository read failed once, the next time a watcher or skill was created, everything existing was deleted.
- If storing settings or conversation history was interrupted, the project or history could be lost.
- When upgrading a lightweight (file-based) installation to PostgreSQL, accounts and chat history were not migrated → Installation
Operational Stability
- Opening an app twice rapidly leaked an internal port, eventually causing all app launches to fail.
- As a builder conversation grew longer, requests kept getting larger, increasing token usage and eventually blocking the chat.
- An undo operation could interfere with a builder task, mixing up or losing results → Developing Apps with the Builder
- A reinstall deleted the TLS certificate, downgrading HTTPS to plaintext → Domain & Reverse Proxy
- Equipment control commands could be sent redundantly up to 4 times if a response was delayed.
UI
- A question sent immediately after entering chat would disappear once the list finished loading → Querying Data with Chat
- On mobile, notifications appeared twice, and even after logging out, a refresh would log you back in → Field Mobile
- After creating a plan, changing the mode would discard the written requirements.
- When the session expired, a blank screen appeared with no notification.
📖 Built-in User Manual
- The manual is now included within the product — this document you are reading. Click
Manual ↗ (
fa-book-open) in the left navigation to open it in a new window. - Works offline: the manual ships with the product image, so it is available even in air-gapped field environments. Full-text search also runs locally.
- Slightly increased the size of the left navigation icons for better readability.
🔒 Security & Supply Chain
-
Keys pasted into chat are no longer recorded in history: app change history is logged automatically (→ Developing Apps with the Builder), and pasting an API key into the chat window would leave the value in the log. Now, known types of keys and tokens are automatically masked.
Still, do not paste keysWe cannot catch every form of secret. Put keys in Secret Management as environment variables, not in chat.
-
Builder engine image now included in signing: among the images in the offline bundle, only the builder sidecar was missing from the signing process. This has been corrected.
bin/verify-images.shnow verifies all 4 types. -
Fixed config file permissions resetting on every save: login token files and config backups are now also protected.
-
Builder engine updated: the OpenHands sidecar has been upgraded to SDK v1.37.1 (no change in usage).
📌 Version Pinning
- All images are now specified with pinned versions (removed
latest). This prevents different versions from being installed depending on when you reinstall. You can specify a desired version viaTAGin.env→ Installation.
⚠TAGchanged toPP_IMAGE_TAGon 2026-08-31 (PS_IMAGE_TAG_SERVERandPS_IMAGE_TAG_WEBwere also added so you can pin each image separately). For the current standards, see Environment Variable Reference.
🔑 Secret Management & Connection Stability
- Manage API keys only via environment variables — Platform, AI, Git, and registry keys that were
stored in plaintext in the config file are now exclusively managed by environment variables. Even if
the config file leaks, the keys aren't exposed. Existing installations continue to work, and the boot
log will guide you on what to migrate (values are not logged). The settings screen shows these keys as
"Managed via environment variables" and prevents editing.
⚠ This behavior was reversed on 2026-08-23 — it turned out that if an environment variable took precedence, you couldn't fix a dead key through the UI. Now, the UI value overrides the environment variable, and the input field is not locked. For the current standards, see Secret Management. - Automatic file permission hardening — on every server boot, the config file and
.envare forced to owner-only (0600). - Config change tracking — changes are logged to the audit log (for secrets, only a fingerprint is recorded, not the value). This makes it easier to trace "when did this start failing."
- Connection drop during long builds fixed — if the agent stayed silent for a long time while executing tools, the proxy would close the stream and show a "connection error." This is now resolved with server heartbeats (works regardless of proxy settings).
- Improved error messages — previously cryptic messages like "sidecar status: error" now explain the actual cause and the action to take (e.g., unable to reach the AI provider address → check settings).
- Reasoning model compatibility — a query that failed due to a gateway configuration conflict with models that use tools is now automatically corrected.
- Added full proxy configuration examples and a "symptom → cause" comparison table to the operations docs.
🔒 Security & Stability Enhancements
We conducted a comprehensive audit (security, code integrity, frontend, operations) and addressed all identified issues in one batch.
- Blocked builder sidecar exposure — the builder engine sidecar was accessible without authentication from anywhere on the internal network with default settings. It's now restricted to loopback binding and has memory, CPU, and log limits applied. If you're running in a non-air-gapped environment, apply this update immediately.
- Preview access control — with only the preview URL, anyone could view the source and chat attachments of a private project. Access is now restricted to owners, admins, and shared users (including the live update WebSocket).
- App origin proxy restriction — the data proxy for generated apps allowed all methods and all paths. It's now narrowed to a read-path allowlist + writes only when the app itself has authentication (screen behavior is unchanged).
- Watcher cost accident prevention — the update API didn't validate input, so invalid values could cause a watcher to stop or invoke AI every minute.
- Restore script provided — there was no restore mechanism, only backups. A restore script has been added (including a non-destructive mode for rehearsals), and backup file permissions have been hardened to owner-only.
- Reinstall safety — running the one-line installer again on an existing server deleted
.envand local backups, preventing the stack from starting. This has been fixed to preserve them. - Performance — first screen bundle reduced by 66% (chart engine, screen lazy loading), input lag during answer streaming removed, and polling stopped in background tabs.
- Accessibility & i18n — Added Esc and focus handling to 11 modals/drawers, and translated 83 error messages that appeared in Korean even in English mode.
🌐 Custom Domain Deployment Support
- App origin settings — In Settings → Runtime tab, specify the public URLs for preview and deployed apps. When deployed behind a reverse proxy/HTTPS domain, changes take effect immediately without a restart.
- Automatic login cookie domain — If the studio and app origin are sibling subdomains, the common parent domain is automatically applied to cookies, so data queries and private app access for deployed apps work after domain separation. ⚠ A one-time re-login is required after a domain configuration change.
- Mixed content guidance — If the studio is HTTPS and the app origin is HTTP, instead of a blank screen, the cause and solution are displayed on the preview and settings screens.
- Deployment guide — Documented the two-origin setup, Host preservation, WebSocket, and Cloudflare considerations → Domain & Reverse Proxy
- UI polish: removed the horizontal scrollbar in the English-mode builder screen, and adjusted the position of the context rail toggle.
🏗 3D Digital Twin + Extended Stack
- 3D digital twin — Create a 3D factory view via chat. A standard 3D kit with status colors, alarm pulses, and value billboards, plus a "3D Digital Twin" template, has been added.
- Drawing → floor texture — If you attach a drawing image to chat, it's automatically saved and applied to the floor of the 3D scene.
- 12 extended stack components pre-included — Process flow diagrams, animations, forms, drag-and-drop, virtual scrolling, QR code scanning maps, and more are ready to use without installation.
- Default memory for app session containers increased to 2 GB (to support 3D builds).
🧩 MCP Registry
- MCP tab in Settings — Add/remove external MCP servers, automatic tool discovery (10-min cache + manual refresh), per-tool active/chat/builder toggles, and new/conflict badges.
- Platform tools auto-reflected — When the platform adds a tool, it's automatically exposed in studio chat and builder.
🔒 Builder Build Standards
- Dependency locking (on by default) — Blocks arbitrary package installs and config changes in generated apps, pinning the standard stack. Admins can define exceptions in an allowlist.
- Layout enforcement (on by default) — Verifies that all screens use the standard shell; if not, the agent fixes it automatically.
- App default layout — Product name, accent color, max width, and footer are set in Settings and injected into new apps.
📦 Offline Export Bundle
- In the deployment version sidebar, clicking [Bundle] downloads a compressed file containing the app image
and run script. It can be launched in an air-gapped field with a single command,
bash run.sh.
🐳 Docker — Your App Anywhere
- App image push — Package a deployment version as a Docker image and push it to a registry with one click. It can run as a container anywhere outside the studio.
- Runtime panel — In the bottom status bar, view session container status (CPU/memory) in real time; click for logs and restart.
- App catalog — Open a deployed app instantly in a new tab by clicking its thumbnail.
🗣 Chat with Your Data Directly
- Natural language queries — Ask something like "Show me the tag count per equipment on Line 3" and it answers immediately using the platform's real data.
- Rich answers — Visualizes with tables (CSV copy support), charts, and process flow diagrams.
- Chat room management — Split conversations, rename, search, response time display, photo attachments.
- Chat → app conversion — Turn a good answer into a dashboard app draft with one click.
🛰 Watchers — Natural Language Monitoring Rules
- Just type "Notify me when line pressure exceeds 8 bar." The AI handles the periodic execution and condition evaluation.
- On trigger, real-time screen notifications (toasts) + unread badges (synced across devices).
- Notification list screen (search, load more), Slack/Teams-compatible webhook delivery.
- Create a watcher from chat with a single phrase: "Watch this."
🏭 Semantic Layer — An AI That Understands Your Factory
- The studio learns the site, line, equipment, and tag structure via snapshots.
- The agent interprets equipment names, aliases, and time expressions ("yesterday," "last week") as precise data addresses.
- The ISA-95 hierarchy picker lets humans browse the same structure.
📊 Operational Visibility
- Statistics dashboard (admin) — Usage, activity, apps, queries, deployment success/failure logs, and audit search in one tab.
- Deployments support a step-by-step progress dialog (build → transition) and QR code for field tablet access.
- Audit log full-text search, deployment history and rollback tracking.
🤖 Coding Agent Advanced
- OpenHands engine — You can choose an industry-standard open-source coding agent engine for app building (Settings → Agent → Builder Engine). Precision editing and conversation summarization/compression keep long sessions stable. Chat (querying) is unaffected, and you can switch back to the built-in engine anytime.
- Builder 3 modes — Plan (build after approving a proposal) · Auto (default) Accept (review edits in preview, then accept/undo — conversation history is preserved).
- Slash commands — Type
/in the chat input to see/plan/build/review/fix/test/loop/deploy./loopautomatically retries until type checking passes (max 3 attempts).
📱 Field Mobile
- Phone-only view — Accessing from a phone automatically switches to mobile view (tablets and desktops excluded).
- Bottom 4 tabs — Home · Chat · Watchers · Apps.
- Home summary — Unread alerts, active watchers, deployed apps, and conversation counts as cards, with recent alerts at a glance.
- Real-time notifications — Even if a watcher triggers on another device, you get a toast and unread badge immediately.
- Mobile watcher management — List, enable/disable, run now, delete, and create new watchers via natural language.
- Deployed app viewing — See deployed apps as live mini preview cards and open them with one tap.
- Theme & language — Light/dark, Korean/English.
App List & Design Updates
- App list with 2 tabs — [Deployed] and [Shared], separating apps you've deployed from those shared with you.
- Premium dashboard design — A subtle aurora background, glass cards, and pulsing status LEDs make field phone screens much clearer (industrial dark tones are retained).
🔒 Security & Operational Hardening
- Generated app origin separation (separate listener from studio) — clarifies the trust boundary.
- Platform API keys are stored only on the server and proxied only to authenticated users (anonymous blocked).
- Rate limiting on login and AI paths, audit logs, and role-based permissions (Admin/Builder/Viewer).
- All core data (conversations, watchers, notification read states, skills, deployment history) is persisted in PostgreSQL — no reliance on browser storage.
- Private deployed apps are usable only by owners, admins, and shared users (tightened from the previous "all logged-in users"). Sharing is set via 'User sharing' on the app card.
- Air-gapped installation and backup/restore scripts are included.
Installation & Upgrade
| Situation | Documentation |
|---|---|
| New installation | Installation |
| Install in an air-gapped network | Air-Gapped Installation |
| Serve with domain & HTTPS | Domain & Reverse Proxy |
| Backup before upgrade | Backup & Restore |
| Migrate keys to environment variables | Secret Management |
| When something goes wrong | Troubleshooting |
If you're new, start with Getting Started.