diff --git a/404.html b/404.html index 264b79ec..11561215 100644 --- a/404.html +++ b/404.html @@ -12,8 +12,8 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/apps/index.html b/apps/index.html index b94cd954..24ec704f 100644 --- a/apps/index.html +++ b/apps/index.html @@ -12,8 +12,8 @@ - - + +
Skip to main content

Neutralinojs Apps

Sample apps built with Neutralinojs

LiteMan

LiteMan

A simple file viewer app written in Neutralinojs.

AngularMaterial

LitePy

LitePy

World's simplest Python editor built with Neutralinojs

React

Fonline Name Colorizing

Fonline Name Colorizing

A lightweight application built with Neutralinojs and Preact

PreactTypeScriptRedux

Vale at Red Hat app

Vale at Red Hat app

A desktop app for linting AsciiDoc files, built with Neutralinojs.

JSMaterial

Display your Neutralinojs app here by making a pull request. You can learn more about the above projects from our YouTube channel .

Start developing lightweight apps today!

npm install -g @neutralinojs/neu

diff --git a/assets/js/0f9c640a.02bc9614.js b/assets/js/0f9c640a.02bc9614.js deleted file mode 100644 index 1d137e34..00000000 --- a/assets/js/0f9c640a.02bc9614.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkneutralinojs_github_io=self.webpackChunkneutralinojs_github_io||[]).push([[8278],{796:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>t,contentTitle:()=>l,default:()=>h,frontMatter:()=>o,metadata:()=>d,toc:()=>a});var s=i(4848),r=i(8453);const o={title:"Framework"},l=void 0,d={id:"release-notes/framework",title:"Framework",description:"Unreleased",source:"@site/docs/release-notes/framework.md",sourceDirName:"release-notes",slug:"/release-notes/framework",permalink:"/docs/release-notes/framework",draft:!1,unlisted:!1,editUrl:"https://github.com/neutralinojs/neutralinojs.github.io/edit/main/docs/release-notes/framework.md",tags:[],version:"current",frontMatter:{title:"Framework"},sidebar:"docs",previous:{title:"About Neutralinojs",permalink:"/docs/contributing/about-neutralinojs"},next:{title:"CLI",permalink:"/docs/release-notes/cli"}},t={},a=[{value:"Unreleased",id:"unreleased",level:2},{value:"v5.3.0",id:"v530",level:2},{value:"Configuration: window transparency on Windows",id:"configuration-window-transparency-on-windows",level:3},{value:"API: os",id:"api-os",level:3},{value:"API: filesystem",id:"api-filesystem",level:3},{value:"Improvements/bugfixes",id:"improvementsbugfixes",level:3},{value:"v5.2.0",id:"v520",level:2},{value:"Configuration: Configless framework initialization",id:"configuration-configless-framework-initialization",level:3},{value:"Configuration",id:"configuration",level:3},{value:"Core: Static server SPA (Single Page App) serving",id:"core-static-server-spa-single-page-app-serving",level:3},{value:"API: window",id:"api-window",level:3},{value:"Improvements/bugfixes",id:"improvementsbugfixes-1",level:3},{value:"v5.1.0",id:"v510",level:2},{value:"Configuration: window transparency",id:"configuration-window-transparency",level:3},{value:"API: clipboard",id:"api-clipboard",level:3},{value:"v5.0.0",id:"v500",level:2},{value:"API: Reading, writing with standard streams",id:"api-reading-writing-with-standard-streams",level:3},{value:"API: filesystem",id:"api-filesystem-1",level:3},{value:"API: os",id:"api-os-1",level:3},{value:"Core: security",id:"core-security",level:3},{value:"Global variables",id:"global-variables",level:3},{value:"Deprecations",id:"deprecations",level:3},{value:"v4.15.0",id:"v4150",level:2},{value:"Configuration: custom user agent string",id:"configuration-custom-user-agent-string",level:3},{value:"Configuration: custom configuration files",id:"configuration-custom-configuration-files",level:3},{value:"v4.14.1",id:"v4141",level:2},{value:"DevOps",id:"devops",level:3},{value:"v4.14.0",id:"v4140",level:2},{value:"Filesystem API",id:"filesystem-api",level:3},{value:"OS API",id:"os-api",level:3},{value:"Improvements/bugfixes",id:"improvementsbugfixes-2",level:3},{value:"DevOps",id:"devops-1",level:3},{value:"v4.13.0",id:"v4130",level:2},{value:"Core: persistent window state",id:"core-persistent-window-state",level:3},{value:"Improvements/bugfixes",id:"improvementsbugfixes-3",level:3},{value:"v4.12.0",id:"v4120",level:2},{value:"API: window",id:"api-window-1",level:3},{value:"Core: configuration",id:"core-configuration",level:3},{value:"Core: webview",id:"core-webview",level:3},{value:"Improvements/bugfixes",id:"improvementsbugfixes-4",level:3},{value:"v4.11.0",id:"v4110",level:2},{value:"API: File watchers",id:"api-file-watchers",level:3},{value:"Improvements/bugfixes",id:"improvementsbugfixes-5",level:3},{value:"v4.10.0",id:"v4100",level:2},{value:"DevOps",id:"devops-2",level:3},{value:"Improvements/bugfixes",id:"improvementsbugfixes-6",level:3},{value:"ESM/NPM support",id:"esmnpm-support",level:3},{value:"v4.9.0",id:"v490",level:2},{value:"API: Custom methods",id:"api-custom-methods",level:3},{value:"API: File streams",id:"api-file-streams",level:3},{value:"Functions",id:"functions",level:4},{value:"Events",id:"events",level:4},{value:"v4.8.0",id:"v480",level:2},{value:"API: os.getEnvs",id:"api-osgetenvs",level:3},{value:"API: filesystem",id:"api-filesystem-2",level:3},{value:"API: storage.getKeys",id:"api-storagegetkeys",level:3},{value:"API: computer.getMousePosition",id:"api-computergetmouseposition",level:3},{value:"Bugfixes/improvements",id:"bugfixesimprovements",level:3},{value:"v4.7.0",id:"v470",level:2},{value:"API: System information API",id:"api-system-information-api",level:3},{value:"API: os dialogs",id:"api-os-dialogs",level:3},{value:"DevOps",id:"devops-3",level:3},{value:"Bugfixes/improvements",id:"bugfixesimprovements-1",level:3},{value:"v4.6.0",id:"v460",level:2},{value:"API: Process spawning API",id:"api-process-spawning-api",level:3},{value:"Core: events",id:"core-events",level:3},{value:"DevOps",id:"devops-4",level:3},{value:"API: filesystem",id:"api-filesystem-3",level:3},{value:"Bugfixes/improvements",id:"bugfixesimprovements-2",level:3},{value:"v4.5.0",id:"v450",level:2},{value:"Core: events",id:"core-events-1",level:3},{value:"DevOps",id:"devops-5",level:3},{value:"Bugfixes/improvements",id:"bugfixesimprovements-3",level:3},{value:"Core: global variables",id:"core-global-variables",level:3},{value:"v4.4.0",id:"v440",level:2},{value:"API: window",id:"api-window-2",level:3},{value:"API: filesystem",id:"api-filesystem-4",level:3},{value:"Dependencies",id:"dependencies",level:3},{value:"Bugfixes/improvements",id:"bugfixesimprovements-4",level:3},{value:"v4.3.0",id:"v430",level:2},{value:"Core: auth",id:"core-auth",level:3},{value:"API: window",id:"api-window-3",level:3},{value:"Core: global variables",id:"core-global-variables-1",level:3},{value:"Bugfixes",id:"bugfixes",level:3},{value:"v4.2.0",id:"v420",level:2},{value:"API: clipboard",id:"api-clipboard-1",level:3},{value:"Core: configuration",id:"core-configuration-1",level:3},{value:"API: global variables",id:"api-global-variables",level:3},{value:"Bugfixes",id:"bugfixes-1",level:3},{value:"v4.1.0",id:"v410",level:2},{value:"API: window",id:"api-window-4",level:3},{value:"API: os",id:"api-os-2",level:3},{value:"Core: Chrome mode",id:"core-chrome-mode",level:3},{value:"Core: configuration",id:"core-configuration-2",level:3},{value:"v4.0.0",id:"v400",level:2},{value:"API: os.execCommand",id:"api-osexeccommand",level:3},{value:"Core: API extensions",id:"core-api-extensions",level:3},{value:"Core: Static server",id:"core-static-server",level:3},{value:"Core: Community driver processes",id:"core-community-driver-processes",level:3},{value:"API: app.broadcast",id:"api-appbroadcast",level:3},{value:"API: events.broadcast",id:"api-eventsbroadcast",level:3},{value:"API: extensions",id:"api-extensions",level:3},{value:"API: updater",id:"api-updater",level:3},{value:"Events",id:"events-1",level:3},{value:"Error codes",id:"error-codes",level:3},{value:"Bug fixes",id:"bug-fixes",level:3},{value:"Global variables",id:"global-variables-1",level:3}];function c(e){const n={a:"a",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"unreleased",children:"Unreleased"}),"\n",(0,s.jsx)(n.h2,{id:"v530",children:"v5.3.0"}),"\n",(0,s.jsx)(n.h3,{id:"configuration-window-transparency-on-windows",children:"Configuration: window transparency on Windows"}),"\n",(0,s.jsxs)(n.p,{children:["Window transparency support was added on the Windows version of the Neutralinojs framework. This can be activated with ",(0,s.jsx)(n.code,{children:"modes.window.transparent"})," configuration property or ",(0,s.jsx)(n.code,{children:"--window-transparent"})," command-line option. Unlike in other platforms, Windows native window becomes borderless (window controls will be hidden) with the activation of the transparent mode."]}),"\n",(0,s.jsx)(n.h3,{id:"api-os",children:"API: os"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add the ",(0,s.jsx)(n.code,{children:"temp"})," key for the supported directory list of the ",(0,s.jsx)(n.code,{children:"os.getPath(pathKey)"})," function."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"api-filesystem",children:"API: filesystem"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add the ",(0,s.jsx)(n.code,{children:"filesystem.getAbsolutePath(path)"})," function to let developers get a full path string from a relative path string."]}),"\n",(0,s.jsxs)(n.li,{children:["Add the ",(0,s.jsx)(n.code,{children:"filesystem.getRelativePath(path, ?base)"})," function to get a relative path from a path and a base path."]}),"\n",(0,s.jsxs)(n.li,{children:["Add the ",(0,s.jsx)(n.code,{children:"filesystem.getPathParts(path)"})," to parse and get path segments like filename, extension, root path, etc."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"improvementsbugfixes",children:"Improvements/bugfixes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Fix Unicode issues in the Windows version with filesystem, storage, and general modules."}),"\n",(0,s.jsx)(n.li,{children:"Fix standard output/error data display issues on Windows"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"v520",children:"v5.2.0"}),"\n",(0,s.jsx)(n.h3,{id:"configuration-configless-framework-initialization",children:"Configuration: Configless framework initialization"}),"\n",(0,s.jsxs)(n.p,{children:["Now, developers can load the Neutralinojs framework without creating a ",(0,s.jsx)(n.code,{children:"neutralino.config.json"})," file. Now, there is no mandatory configuration properties since Neutralinojs set reasonable defaults. Developers can launch the framework using the following methods without a configuration file:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'# Loading a remote URL\n./framework-bin --url=https://neutralino.js.org/docs\n\n# Launches a local static web app\n./framework-bin --url="/resources/" --window-title="My web app" --enable-server\n'})}),"\n",(0,s.jsx)(n.h3,{id:"configuration",children:"Configuration"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["New internal CLI arguments added: ",(0,s.jsx)(n.code,{children:"--single-page-serve"}),", ",(0,s.jsx)(n.code,{children:"--enable-native-api"})," and ",(0,s.jsx)(n.code,{children:"--document-root="})]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"core-static-server-spa-single-page-app-serving",children:"Core: Static server SPA (Single Page App) serving"}),"\n",(0,s.jsxs)(n.p,{children:["Earlier, Neutralinojs app developers had to use hash routing with their frontend-library-based apps since the internal static server didn't offer an inbuilt URL rewrite logic for SPAs (Single Page Apps). Now, they can use the ",(0,s.jsx)(n.code,{children:"singlePageServe: true"})," option in the app configuration file to activate SPA routing. If this setting is on, the static server will serve the main ",(0,s.jsx)(n.code,{children:"index.html"})," file when it receives directory requests that possibly send HTTP ",(0,s.jsx)(n.code,{children:"404"})," status."]}),"\n",(0,s.jsxs)(n.p,{children:["For example, the ",(0,s.jsx)(n.code,{children:"/invoices"})," path serves the main ",(0,s.jsx)(n.code,{children:"index.html"})," file if there is no directory named ",(0,s.jsx)(n.code,{children:"invoices"})," which holds an ",(0,s.jsx)(n.code,{children:"index.html"})," file."]}),"\n",(0,s.jsx)(n.h3,{id:"api-window",children:"API: window"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Improve the behaviour of the ",(0,s.jsx)(n.code,{children:"window.show()"})," function on Windows. Now, this function flashes the window if it's already in foreground and activates the window properly if it's minimized."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"improvementsbugfixes-1",children:"Improvements/bugfixes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Fix path issues with the ",(0,s.jsx)(n.code,{children:"defaultPath"})," option in system file dialogs on Windows."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"v510",children:"v5.1.0"}),"\n",(0,s.jsx)(n.h3,{id:"configuration-window-transparency",children:"Configuration: window transparency"}),"\n",(0,s.jsxs)(n.p,{children:["Neutralinojs offers the inbuilt borderless mode and draggable region API to create custom window frames using HTML and CSS. Earlier, Neutralinojs used a default opaque color (usually white) for the window and webview layer, so app developers couldn't make custom CSS-styled window frames transparent or implement custom window frame shapes (i.e., rounded edges). Now, it offers the ",(0,s.jsx)(n.code,{children:"window.transparent"})," boolean flag to activate window transparency."]}),"\n",(0,s.jsxs)(n.p,{children:["If the transparency mode is on, the Neutralinojs window and webview use an alpha color layer and become transparent, so developers can use the ",(0,s.jsx)(n.code,{children:"rgba"})," CSS color function on ",(0,s.jsx)(n.code,{children:"body"})," background to handle the transparency level of the app."]}),"\n",(0,s.jsxs)(n.p,{children:["The transparency mode can be activated using the ",(0,s.jsx)(n.code,{children:"--window-transparent="})," internal command-line option too."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.em,{children:"Note: This feature is not implemented for the Windows operating system yet."})}),"\n",(0,s.jsx)(n.h3,{id:"api-clipboard",children:"API: clipboard"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Implement ",(0,s.jsx)(n.code,{children:"clipboard.readImage()"})," and ",(0,s.jsx)(n.code,{children:"clipboard.writeImage(image)"})," functions to work with clipboard image data."]}),"\n",(0,s.jsxs)(n.li,{children:["Expose the ",(0,s.jsx)(n.code,{children:"clipboard.clear()"})," function to clear system clipboard."]}),"\n",(0,s.jsxs)(n.li,{children:["Expose the ",(0,s.jsx)(n.code,{children:"clipboard.getFormat()"})," function to check the system clipboard data format. This function returns ",(0,s.jsx)(n.code,{children:"text"}),", ",(0,s.jsx)(n.code,{children:"image"}),", and ",(0,s.jsx)(n.code,{children:"unknown"})," enum values based on existing data on the clipboard."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"v500",children:"v5.0.0"}),"\n",(0,s.jsx)(n.h3,{id:"api-reading-writing-with-standard-streams",children:"API: Reading, writing with standard streams"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Implement ",(0,s.jsx)(n.code,{children:"app.readProcessInput(readAll=false)"})," for reading string data from the standard input stream. This function can read a single line or multiple lines at once."]}),"\n",(0,s.jsxs)(n.li,{children:["Implement ",(0,s.jsx)(n.code,{children:"app.writeProcessOutput"})," and ",(0,s.jsx)(n.code,{children:"app.writeProcessError"})," for sending string data to standard output and error streams accordingly."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"api-filesystem-1",children:"API: filesystem"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Enable default recursive behavior in the ",(0,s.jsx)(n.code,{children:"filesystem.createDirectory"})," function."]}),"\n",(0,s.jsxs)(n.li,{children:["Add ",(0,s.jsx)(n.code,{children:"filesystem.copy"}),", ",(0,s.jsx)(n.code,{children:"filesystem.move"}),", and ",(0,s.jsx)(n.code,{children:"filesystem.remove"})," functions."]}),"\n",(0,s.jsxs)(n.li,{children:["Add ",(0,s.jsx)(n.code,{children:"{recursive}"})," options object to ",(0,s.jsx)(n.code,{children:"filesystem.readDirectory(path, options)"})," activate recursive directory listing."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"api-os-1",children:"API: os"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Accept stdin with the background mode of the ",(0,s.jsx)(n.code,{children:"os.execCommand"})," function."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"core-security",children:"Core: security"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Now, all app clients and extensions require a valid connect token (A part of the ",(0,s.jsx)(n.code,{children:"NL_TOKEN"}),") to connect to the Neutralinojs framework WebSocket server to receive app events."]}),"\n",(0,s.jsx)(n.li,{children:"The framework now sends the access token, connect token, port, and extension identifier to extension processes via the standard input, so other processes can't read them by scanning the process list."}),"\n",(0,s.jsx)(n.li,{children:"The WebSocket client connection origin is checked during the HTTP/WS handshake to make sure that only local clients connect with a specific Neutralinojs app that runs on window, browser, or Chrome mode. Any URL origin is allowed for the cloud mode."}),"\n",(0,s.jsx)(n.li,{children:"The above security enhancements fix two security advisories on GitHub."}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"global-variables",children:"Global variables"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Now the ",(0,s.jsx)(n.code,{children:"NL_ARCH"})," global variable returns the same value that ",(0,s.jsx)(n.code,{children:"computer.getArch"})," returns."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"deprecations",children:"Deprecations"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Removed ",(0,s.jsx)(n.code,{children:"filesystem.removeFile"}),", ",(0,s.jsx)(n.code,{children:"filesystem.removeDirectory"}),", ",(0,s.jsx)(n.code,{children:"filesystem.copyFile"}),", and ",(0,s.jsx)(n.code,{children:"filesystem.moveFile"})," functions."]}),"\n",(0,s.jsxs)(n.li,{children:["Extensions won't receive ",(0,s.jsx)(n.code,{children:"--nl-port"}),", ",(0,s.jsx)(n.code,{children:"--nl-token"}),", and ",(0,s.jsx)(n.code,{children:"--nl-extension-id"})," as command-line arguments. Now the framework sends these via stdin as a JSON string."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"v4150",children:"v4.15.0"}),"\n",(0,s.jsx)(n.h3,{id:"configuration-custom-user-agent-string",children:"Configuration: custom user agent string"}),"\n",(0,s.jsxs)(n.p,{children:["Developers sometimes use the user agent string to indentify the client in server-side and client-side source codes. Now, Neutralinojs lets app developers extend the default user agent string with a custom string via the ",(0,s.jsx)(n.code,{children:"window.extendUserAgentWith"})," configuration property and the ",(0,s.jsx)(n.code,{children:"--window-extend-user-agent-with="})," command-line option, as shown in the following example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-js",children:'"window": {\n // ---\n "extendUserAgentWith": "MyAppClient"\n}\n'})}),"\n",(0,s.jsx)(n.p,{children:"The above configuration extends the user agent string:"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-js",children:"console.log(navigator.userAgent) // MyAppClient \n"})}),"\n",(0,s.jsx)(n.h3,{id:"configuration-custom-configuration-files",children:"Configuration: custom configuration files"}),"\n",(0,s.jsxs)(n.p,{children:["The Neutralinojs framework typically loads the application configuration content from the ",(0,s.jsx)(n.code,{children:"neutralino.config.json"})," file, but sometimes app developers need to use a custom configuration filename during development (i.e., For separating production and development environments). Now, you can use the ",(0,s.jsx)(n.code,{children:"--config-file="})," internal command-line parameter to use a custom app configuration, as shown in the following example:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:"./myapp-linux_x64 --load-dir-res --config-file=neutralino-dev.config.json\n"})}),"\n",(0,s.jsx)(n.h2,{id:"v4141",children:"v4.14.1"}),"\n",(0,s.jsx)(n.h3,{id:"devops",children:"DevOps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Use Windows 2019 server and macOS 11 (Big Sur) to compile framework release artifacts."}),"\n",(0,s.jsxs)(n.li,{children:["Set minimum supported macOS version via ",(0,s.jsx)(n.code,{children:"MACOSX_DEPLOYMENT_TARGET=10.7"})]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"v4140",children:"v4.14.0"}),"\n",(0,s.jsx)(n.h3,{id:"filesystem-api",children:"Filesystem API"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Introduce the ",(0,s.jsx)(n.code,{children:"filesystem.getWatchers"})," function to get all created watchers."]}),"\n",(0,s.jsxs)(n.li,{children:["Add binary file reading support for the ",(0,s.jsx)(n.code,{children:"filesystem.updateOpenedFile(id, action, data)"})," function. This function implements ",(0,s.jsx)(n.code,{children:"readBinary"})," and ",(0,s.jsx)(n.code,{children:"readAllBinary"})," actions and ",(0,s.jsx)(n.code,{children:"dataBinary"})," output action in the ",(0,s.jsx)(n.code,{children:"openedFile"})," global event."]}),"\n",(0,s.jsxs)(n.li,{children:["Return the existing watcher identifier from ",(0,s.jsx)(n.code,{children:"filesystem.createWatcher"})," if there is an existing active watcher for the given path."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"os-api",children:"OS API"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add a way to set current working directory for process creation functions: ",(0,s.jsx)(n.code,{children:"os.execCommand(command, options)"})," now supports ",(0,s.jsx)(n.code,{children:"cwd"})," via the options object and ",(0,s.jsx)(n.code,{children:"os.spawnProcess(command, cwd)"})," accepts currently working directory via the second string parameter."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"improvementsbugfixes-2",children:"Improvements/bugfixes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Fix Unicode charactor issues in the tray menu on Windows."}),"\n",(0,s.jsxs)(n.li,{children:["Avoid including null bytes to file reader events initiated by the ",(0,s.jsx)(n.code,{children:"filesystem.openFile"})," function."]}),"\n",(0,s.jsxs)(n.li,{children:["Discard ",(0,s.jsx)(n.code,{children:"window"})," method executions on non-window modes."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"devops-1",children:"DevOps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Update external GitHub Action packages to their latest versions."}),"\n",(0,s.jsx)(n.li,{children:"Fix issues of the failing test cases"}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"v4130",children:"v4.13.0"}),"\n",(0,s.jsx)(n.h3,{id:"core-persistent-window-state",children:"Core: persistent window state"}),"\n",(0,s.jsxs)(n.p,{children:["Now the framework stores the primary window state in a temporary file (JSON formatted) and loads during the startup process.\nThis feature stores and sets the window position (x, y coordinates), size (width and height), and maximized status. This feature is enabled by default in all platforms, but app developers can turn it off by using ",(0,s.jsx)(n.code,{children:"false"})," for the ",(0,s.jsx)(n.code,{children:"window.useSavedState"})," configuration attribute or ",(0,s.jsx)(n.code,{children:"--window-use-saved-state"})," internal CLI argument."]}),"\n",(0,s.jsxs)(n.p,{children:["Also, the window state loading status is available via the ",(0,s.jsx)(n.code,{children:"NL_WSAVSTLOADED"})," global variable. The framework sets ",(0,s.jsx)(n.code,{children:"true"})," for this boolean variable if the window state was loaded from the saved configuration."]}),"\n",(0,s.jsx)(n.h3,{id:"improvementsbugfixes-3",children:"Improvements/bugfixes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Fix several issues in the webview Windows code (i.e., Wait for the window close event, window style fixes, etc.)."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"v4120",children:"v4.12.0"}),"\n",(0,s.jsx)(n.h3,{id:"api-window-1",children:"API: window"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add ",(0,s.jsx)(n.code,{children:"window.center"})," to center the application window programmatically."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"core-configuration",children:"Core: configuration"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Setting the initial window position via ",(0,s.jsx)(n.code,{children:"modes.window.x"})," and ",(0,s.jsx)(n.code,{children:"modes.window.y"})," integer config props."]}),"\n",(0,s.jsxs)(n.li,{children:["Centering the window at startup via ",(0,s.jsx)(n.code,{children:"modes.window.center"})," boolean config props."]}),"\n",(0,s.jsxs)(n.li,{children:["Add config overrides for the startup window position: ",(0,s.jsx)(n.code,{children:"--window-center="}),", ",(0,s.jsx)(n.code,{children:"--window-x="})," and ",(0,s.jsx)(n.code,{children:"--window-y="})]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"core-webview",children:"Core: webview"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Statically link the Webview2 loader library on Windows, so app developers can package their apps without including the ",(0,s.jsx)(n.code,{children:"WebView2Loader.dll"})," file."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"improvementsbugfixes-4",children:"Improvements/bugfixes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Added Unicode characters support for Neutralinojs Windows."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"v4110",children:"v4.11.0"}),"\n",(0,s.jsx)(n.h3,{id:"api-file-watchers",children:"API: File watchers"}),"\n",(0,s.jsxs)(n.p,{children:["In some scenarios, Neutralinojs app developers need to implement file watchers in their apps. Earlier, Neutralinojs API didn't offer a native file watcher API and developers had to use less-performant workarounds, such as making recursive ",(0,s.jsx)(n.code,{children:"filesystem.readDirectory"})," calls. The new file watchers API lets you create native, cross-platform, event-based file watchers for filesystem paths with the following functions:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"filesystem.createWatcher(path)"}),": Creates a new file watcher for a given path and returns the watcher identifier."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"filesystem.removeWatcher(watcherId)"}),": Removes a files watcher based on a file watcher identifier."]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Whenever a filesystem change occurs, file watcher instances dispatch the ",(0,s.jsx)(n.code,{children:"watchFile"})," event with the following data:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"id"}),": Watcher identifier"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"action"}),": Filesystem change: ",(0,s.jsx)(n.code,{children:"add"}),", ",(0,s.jsx)(n.code,{children:"delete"}),", ",(0,s.jsx)(n.code,{children:"modified"}),", and ",(0,s.jsx)(n.code,{children:"moved"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"dir"}),": Directory path"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"filename"}),": Modified file"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"improvementsbugfixes-5",children:"Improvements/bugfixes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Fix the initial window flashing and hidden window state issues on Windows."}),"\n",(0,s.jsx)(n.li,{children:"Fix data corruption in binary file appending."}),"\n",(0,s.jsx)(n.li,{children:"Apply dark/light themes based on system preferences on Windows."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"v4100",children:"v4.10.0"}),"\n",(0,s.jsx)(n.h3,{id:"devops-2",children:"DevOps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Generate official macOS ",(0,s.jsx)(n.code,{children:"arm64"})," (For Apple M1 and higher devices) and universal binaries with the GitHub workflow."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"improvementsbugfixes-6",children:"Improvements/bugfixes"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Add a ",(0,s.jsx)(n.a,{href:"https://json-schema.org/",children:"JSON schema"})," definition for the ",(0,s.jsx)(n.code,{children:"neutralino.config.json"})," file."]}),"\n",(0,s.jsxs)(n.li,{children:["Fix source code compilation issues on macOS ",(0,s.jsx)(n.code,{children:"arm64"})," systems."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"esmnpm-support",children:"ESM/NPM support"}),"\n",(0,s.jsxs)(n.p,{children:["Neutralinojs typically stores the client library implementation in a separate file (",(0,s.jsx)(n.code,{children:"neutralino.js"}),"). This approach makes Neutralinojs app development\nprocess easier with a globally exposed JavaScript object, ",(0,s.jsx)(n.code,{children:"Neutralino"}),". But, modern web developers use ES modules and they usually like to fetch dependencies from NPM. So, now, developers can load the ",(0,s.jsx)(n.code,{children:"__neutralino_globals.js"})," internal script (i.e., ",(0,s.jsx)(n.code,{children:' - - + + -

Neutralino.app

Neutralino.app namespace contains methods related to the current application instance.

+

Neutralino.app

Neutralino.app namespace contains methods related to the current application instance.

app.exit(exitCode)

Terminates the running application.

Parameters

diff --git a/docs/api/clipboard/index.html b/docs/api/clipboard/index.html index 8d87c75f..07bfb570 100644 --- a/docs/api/clipboard/index.html +++ b/docs/api/clipboard/index.html @@ -12,11 +12,11 @@ - - + + -

Neutralino.clipboard

Neutralino.clipboard namespace offers functions to access system clipboard.

+

Neutralino.clipboard

Neutralino.clipboard namespace offers functions to access system clipboard.

clipboard.getFormat()

Returns the current data format of the system clipboard. 

Return String (awaited):

diff --git a/docs/api/computer/index.html b/docs/api/computer/index.html index 358acaad..1258450c 100644 --- a/docs/api/computer/index.html +++ b/docs/api/computer/index.html @@ -12,11 +12,11 @@ - - + + -

Neutralino.computer

Neutralino.computer namespace contains methods related to the user's hardware.

+

Neutralino.computer

Neutralino.computer namespace contains methods related to the user's hardware.

computer.getMemoryInfo()

Returns system memory statistics in bytes.

Return Object (awaited):

diff --git a/docs/api/custom/index.html b/docs/api/custom/index.html index a0e55e35..6127965c 100644 --- a/docs/api/custom/index.html +++ b/docs/api/custom/index.html @@ -12,11 +12,11 @@ - - + + -

Neutralino.custom

Neutralinojs offers the extensions API to write custom backend code with any programming language, +

Neutralino.custom

Neutralinojs offers the extensions API to write custom backend code with any programming language, but extensions come with the following drawbacks that affect apps in several scenarios:

-

options

+

options

  • recursive Boolean: Read sub-directories recursively. The default value is false.
@@ -190,7 +193,7 @@

Parameterssource String: Source path.
  • destination String: Destination path.
  • -

    options

    +

    options

    • recursive Boolean: Copy sub-directories recursively. The default value is true.
    • overwrite Boolean: Overwrite an existing file with the same name. The default value is true.
    • @@ -260,6 +263,6 @@

      Retu
    • extension String: File extension.
    • stem String: Filename segment without extension.
    -
    let pathParts = await Neutralino.filesystem.getPathParts('./myFolder/myFile.txt');
    console.log('Parts:', pathParts);
    +
    let pathParts = await Neutralino.filesystem.getPathParts('./myFolder/myFile.txt');
    console.log('Parts:', pathParts);
    \ No newline at end of file diff --git a/docs/api/global-variables/index.html b/docs/api/global-variables/index.html index 00cd071b..05cfb421 100644 --- a/docs/api/global-variables/index.html +++ b/docs/api/global-variables/index.html @@ -12,11 +12,11 @@ - - + + -

    Global Variables

    These JavaScript variables can be used anywhere because these variables are defined in the window scope.

    +

    Global Variables

    These JavaScript variables can be used anywhere because these variables are defined in the window scope.

    Predefined global variables

    VariableDescription
    NL_OSOperating system name: Linux, Windows, or Darwin
    NL_ARCHCPU architecture: x64, arm, itanium, ia32, or unknown
    NL_APPIDApplication identifier
    NL_APPVERSIONApplication version
    NL_PORTApplication port
    NL_MODEMode of the application: window, browser, cloud, or chrome
    NL_VERSIONNeutralinojs framework version
    NL_CVERSIONNeutralinojs client version
    NL_CWDCurrent working directory
    NL_PATHApplication path
    NL_ARGSCommand-line arguments
    NL_PIDIdentifier of the current process
    NL_RESMODESource of application resources: bundle or directory
    NL_EXTENABLEDReturns true if extensions are enabled
    NL_COMMITFramework binary's release commit hash
    NL_CCOMMITClient librar's release commit hash
    NL_CMETHODSCustom method identifiers (Returns the same output that custom.getMethods returns).
    NL_WSAVSTLOADEDReturns true if the initial window state was loaded from the saved configuration
    tip

    You can use NL_COMMIT and NL_CCOMMIT values to identify the codebase snapshot if you use nightly releases.

    diff --git a/docs/api/init/index.html b/docs/api/init/index.html index 4e29d128..5bd193f9 100644 --- a/docs/api/init/index.html +++ b/docs/api/init/index.html @@ -12,11 +12,11 @@ - - + + -

    Neutralino.init

    init is not a namespace, it's a function that initializes a Neutralinojs application.

    +

    Neutralino.init

    init is not a namespace, it's a function that initializes a Neutralinojs application.

    init()

    The application developer needs to call this method explicitly via a JavaScript source file before using any native API function. The init function does the following tasks when it's called.

    diff --git a/docs/api/os/index.html b/docs/api/os/index.html index d3515a1f..411643f1 100644 --- a/docs/api/os/index.html +++ b/docs/api/os/index.html @@ -12,11 +12,11 @@ - - + + -

    Neutralino.os

    Neutralino.os namespace contains methods related to the user's operating system.

    +

    Neutralino.os

    Neutralino.os namespace contains methods related to the user's operating system.

    os.execCommand(command, options)

    Executes a command and returns the output.

    Parameters

    diff --git a/docs/api/overview/index.html b/docs/api/overview/index.html index 8fa6bd09..6c068d65 100644 --- a/docs/api/overview/index.html +++ b/docs/api/overview/index.html @@ -12,11 +12,11 @@ - - + + -

    Native API Overview

    Neutralinojs offers a JavaScript client library (also known as Neutralino.js) for developers to interact +

    \ No newline at end of file diff --git a/docs/api/resources/index.html b/docs/api/resources/index.html new file mode 100644 index 00000000..5199e69d --- /dev/null +++ b/docs/api/resources/index.html @@ -0,0 +1,54 @@ + + + + + +Neutralino.resources | Neutralinojs + + + + + + + + + + + + +

    Neutralino.resources

    Neutralino.resources namespace implements several methods to parse, read, and extract the loaded resource bundle (resources.neu). If the app doesn't load resources +from the resource bundle and uses the resources directory, all these methods will throw the NE_RS_APIRQRF error.

    +

    resources.getFiles()

    +

    Returns all files and directories embedded in the resource bundle.

    +

    Return Object (awaited):

    +

    An array of path strings.

    +
    let files = await Neutralino.resources.getFiles();
    console.log('Files: ', files);
    +

    resources.extractFile(path, destination)

    +

    Extracts a file from the resources bundle to a preferred path.

    +

    Parameters

    +
      +
    • path String: Resource file path, i.e., /resources/icons/appIcon.png, starts with / similar to all Neutralinojs app resources.
    • +
    • destination String: Path where the extract file should be created.
    • +
    +
    await Neutralino.resources.extractFile('/resources/scripts/run.sh', './scripts/run.sh');
    +

    resources.readFile(path)

    +

    Reads a text file from resources.

    +

    Parameters

    +
      +
    • path: Resource path.
    • +
    +

    Return String (awaited):

    +

    File content.

    +
    let data = await Neutralino.resources.readFile();
    console.log(data);
    +

    resources.readBinaryFile(path)

    +

    Reads a binary file from resources.

    +

    Parameters

    +
      +
    • path: Resource path.
    • +
    +

    Return Object (awaited):

    +

    Content of the binary file as an +ArrayBuffer.

    +
    let data = await Neutralino.resources.readBinaryFile('/resources/images/myImage.png');
    let view = new Uint8Array(data);

    console.log('Binary content: ', view);
    + + \ No newline at end of file diff --git a/docs/api/storage/index.html b/docs/api/storage/index.html index 3d885951..e1a3c6e7 100644 --- a/docs/api/storage/index.html +++ b/docs/api/storage/index.html @@ -12,11 +12,11 @@ - - + + -

    Neutralino.storage

    Neutralinojs has a built-in shared key-value storage. It's like a +

    Neutralino.storage

    Neutralinojs has a built-in shared key-value storage. It's like a global LocalStorage for all Neutralinojs modes. Neutralino.storage exposes methods for interacting with this storage feature.

    tip

    The storage API persists all data records into .storage directory in the diff --git a/docs/api/updater/index.html b/docs/api/updater/index.html index 72626f65..39712667 100644 --- a/docs/api/updater/index.html +++ b/docs/api/updater/index.html @@ -12,11 +12,11 @@ - - + + -

    Neutralino.updater

    Neutralino.updater namespace contains methods related to built-in automatic updater. Neutralinojs offers +

    Neutralino.updater

    Neutralino.updater namespace contains methods related to built-in automatic updater. Neutralinojs offers a built-in client-based updating mechanism. Therefore, you can update Neutralinojs apps without even calling third-party update services, operating system level services, or other binaries/scripts.

    Learn more about extensions with this guide.

    diff --git a/docs/api/window/index.html b/docs/api/window/index.html index 8412fb22..7daf9d2d 100644 --- a/docs/api/window/index.html +++ b/docs/api/window/index.html @@ -12,11 +12,11 @@ - - + + -

    Neutralino.window

    The Neutralino.window namespace contains methods related to the current native window instance. +

    Neutralino.window

    The Neutralino.window namespace contains methods related to the current native window instance. This namespace's methods will work only for the window mode.

    window.setTitle(title)

    Sets the title of the native window.

    @@ -33,6 +33,16 @@

    Return

    window.minimize()

    Minimizes the native window.

    await Neutralino.window.minimize();
    +

    window.unminimize()

    +

    Restores the native window from the minimized state.

    +
    await Neutralino.window.unminimize();
    +

    window.isMinimized()

    +

    Returns true if the native window is minimized.

    +

    Return Boolean (awaited):

    +
      +
    • true or false based on current minimized status.
    • +
    +
    let status = await Neutralino.window.isMinimized();

    window.maximize()

    Maximizes the native window.

    await Neutralino.window.maximize();
    @@ -41,7 +51,7 @@

    window.unma
    await Neutralino.window.unmaximize();

    window.isMaximized()

    Returns true if the native window is maximized.

    -

    Return Boolean (awaited):

    +

    Return Boolean (awaited):

    • true or false based on current maximized status.
    @@ -54,7 +64,7 @@

    window.
    await Neutralino.window.exitFullScreen();

    window.isFullScreen()

    Returns true if the native window is in the full screen mode.

    -

    Return Boolean (awaited):

    +

    Return Boolean (awaited):

    • true or false based on current full screen status.
    @@ -67,7 +77,7 @@

    window.hide()
    await Neutralino.window.hide();

    window.isVisible()

    Returns true if the native window is visible.

    -

    Return Boolean (awaited):

    +

    Return Boolean (awaited):

    • true or false based on current visibility status.
    @@ -139,7 +149,7 @@

    Options
    await Neutralino.window.setSize({
    width: 500,
    height: 200,
    maxWidth: 600,
    maxHeight: 400
    });

    await Neutralino.window.setSize({
    resizable: false
    });

    window.getSize()

    Returns window size information.

    -

    Return Boolean (awaited):

    +

    Return Boolean (awaited):

    • width Number: Window width in pixels.
    • height Number: Window height in pixels.
    • @@ -152,7 +162,7 @@

      Ret
      let sizeInfo = await Neutralino.window.getSize();

      console.log(sizeInfo);

      window.getPosition()

      Returns window position coordinates.

      -

      Return Boolean (awaited):

      +

      Return Boolean (awaited):

      • x Number: Horizontal coordinate of the left edge of the window.
      • y Number: Vertical coordinate of the top edge of the window.
      • @@ -197,6 +207,6 @@

        Return
      • stdErr String: Standard error. This value is always empty since the new window process starts asynchronously.
      • exitCode Number: Exit code of the process.
      -
      await Neutralino.window.create('/resources/aboutWindow.html', {
      icon: '/resources/icons/aboutIcon.png',
      enableInspector: false,
      width: 500,
      height: 300,
      maximizable: false,
      exitProcessOnClose: true,
      processArgs: '--window-id=W_ABOUT'
      });
    +
    await Neutralino.window.create('/resources/aboutWindow.html', {
    icon: '/resources/icons/aboutIcon.png',
    enableInspector: false,
    width: 500,
    height: 300,
    maximizable: false,
    exitProcessOnClose: true,
    processArgs: '--window-id=W_ABOUT'
    });
    \ No newline at end of file diff --git a/docs/cli/internal-cli-arguments/index.html b/docs/cli/internal-cli-arguments/index.html index 3c7f7279..cc645d0e 100644 --- a/docs/cli/internal-cli-arguments/index.html +++ b/docs/cli/internal-cli-arguments/index.html @@ -12,8 +12,8 @@ - - + +

    Internal CLI Arguments

    neu CLI wraps Neutralinojs's internal CLI arguments to provide a simple interface for developers. For example, diff --git a/docs/cli/neu-cli/index.html b/docs/cli/neu-cli/index.html index 65901aa8..69cb3fa4 100644 --- a/docs/cli/neu-cli/index.html +++ b/docs/cli/neu-cli/index.html @@ -12,8 +12,8 @@ - - + +

    neu CLI

    npm diff --git a/docs/configuration/modes/index.html b/docs/configuration/modes/index.html index 028eb76a..dc4a1c97 100644 --- a/docs/configuration/modes/index.html +++ b/docs/configuration/modes/index.html @@ -12,8 +12,8 @@ - - + +

    Modes

    Neutralinojs applications can be executed on Linux, Windows, macOS, and Browser with four modes: window, browser, diff --git a/docs/configuration/neutralino.config.json/index.html b/docs/configuration/neutralino.config.json/index.html index 91ad0f31..aa70cdc9 100644 --- a/docs/configuration/neutralino.config.json/index.html +++ b/docs/configuration/neutralino.config.json/index.html @@ -12,8 +12,8 @@ - - + +

    neutralino.config.json

    neutralino.config.json file contains the application configuration details. Every Neutralinojs app typically diff --git a/docs/configuration/project-structure/index.html b/docs/configuration/project-structure/index.html index c74f2dea..0f9295f3 100644 --- a/docs/configuration/project-structure/index.html +++ b/docs/configuration/project-structure/index.html @@ -12,8 +12,8 @@ - - + +

    Project Structure

    Neutralinojs has a flexible project structure. Imagine a structure of a normal web application. diff --git a/docs/contributing/about-neutralinojs/index.html b/docs/contributing/about-neutralinojs/index.html index ea1a5127..1c80540e 100644 --- a/docs/contributing/about-neutralinojs/index.html +++ b/docs/contributing/about-neutralinojs/index.html @@ -12,8 +12,8 @@ - - + +

    About Neutralinojs

    Every open-source project has a great history. Some open-source projects decide to share their development diff --git a/docs/contributing/architecture/index.html b/docs/contributing/architecture/index.html index 963a50de..4884d857 100644 --- a/docs/contributing/architecture/index.html +++ b/docs/contributing/architecture/index.html @@ -12,8 +12,8 @@ - - + +

    Architecture

    The Neutralinojs framework core follows a single-process, monolithic, and layered architectural pattern diff --git a/docs/contributing/code-style-guide/index.html b/docs/contributing/code-style-guide/index.html index bfc41aca..bbb2aabd 100644 --- a/docs/contributing/code-style-guide/index.html +++ b/docs/contributing/code-style-guide/index.html @@ -12,8 +12,8 @@ - - + +

    Code Style Guide

    Code style guide documents motivate contributors to submit code changes by maintaining code quality and diff --git a/docs/contributing/committers/index.html b/docs/contributing/committers/index.html index 2f1838a3..34cb17ec 100644 --- a/docs/contributing/committers/index.html +++ b/docs/contributing/committers/index.html @@ -12,8 +12,8 @@ - - + +

    Committers

    -

    Bugfixes/improvements

    +

    Bugfixes/improvements

    • Check and validate neutralino.config.json file before executing app-specific commands.
    • Check app template validity before downloading content from a specific GitHub repository using the official GitHub API.
    • @@ -47,7 +64,7 @@

      Core: Bundler
    • Add cli.distributionPath into the neutralino.config.json file to customize the default dist distribution directory.

    v11.0.1

    -

    Bugfixes/improvements

    +

    Bugfixes/improvements

    -

    Bugfixes/improvements

    +

    Bugfixes/improvements

    • Fixed issues with the frontend library command execution.

    v10.1.1

    -

    Bugfixes/improvements

    +

    Bugfixes/improvements

    • Fixed app development issues with the Vite server.

    v10.1.0

    -

    Bugfixes/improvements

    +

    Bugfixes/improvements

    • Fixed several issues in the frontend-library-based development flow (i.e., removed the hardcoded port number, fixed double devCommand execution, etc.,).
    @@ -93,7 +110,7 @@

    Core:
  • Download the TypeScript definition file for standalone client library mode. This won't include the TypeScript definition file to the final application bundle.
  • v9.6.1

    -

    Bugfixes/Improvements

    +

    Bugfixes/Improvements

    • Fix the hot-reloading issue that occurs with newer Node runtime versions.
    @@ -103,7 +120,7 @@

    Core: Bundler
  • Avoid copying the WebView2Loader.dll file to the final app package since it was removed from the Neutralinojs framework.
  • v9.5.1

    -

    Bugfixes/Improvements

    +

    Bugfixes/Improvements

    • Use the decompress library instead of unzipper to fix issues with latest Node.js runtime versions.
    • Generate the Mac universal binary with the neu build command.
    • @@ -118,7 +135,7 @@

      DevOps
      • Initiate a new Node.js-based test suite.
      -

      Bugfixes/Improvements

      +

      Bugfixes/Improvements

      • Clean project files if the neu create command wan't successful.
      • Display an error message if the neu build --copy-storage fails due to missing .storage directory.
      • @@ -141,7 +158,7 @@

        GeneralBugfixes/improvements

        +

        Bugfixes/improvements

        • Fix plugin listing issue.
        @@ -227,6 +244,6 @@

        Core: Down

        neu version

        • Removed global Neutralino version details
        • -
    +
    \ No newline at end of file diff --git a/docs/release-notes/client-library/index.html b/docs/release-notes/client-library/index.html index 6d82e90a..9dfc0118 100644 --- a/docs/release-notes/client-library/index.html +++ b/docs/release-notes/client-library/index.html @@ -12,11 +12,25 @@ - - + +

    Client Library

    Unreleased

    +

    v5.4.0

    +

    API: resources

    +
      +
    • Export getFiles(), extractFile(path, dest), readFile(path), and readBinaryFile(path) functions.
    • +
    +

    API: window

    +
      +
    • Export minimize(), unminimize(), and isMinimized() functions.
    • +
    • Add alwaysCapture and dragMinDistance options to the window.setDraggableRegion() function and improve the performance of the overall draggable window implementation.
    • +
    +

    Bugfixes/improvements

    +
      +
    • Fix several issues with TypeScript exports and definitions.
    • +

    v5.3.0

    API: filesystem

      @@ -27,7 +41,7 @@

      API: filesy
      • Accept overwrite, skip, and recursive options for the filesystem.copy() function.
      -

      Bugfixes/improvements

      +

      Bugfixes/improvements

      • Improve the window.create() function's option-to-CLI argument mapping logic.
      @@ -61,7 +75,7 @@

      API: filesy
    • Export/deprecate functions based on framework's v5 release. See framework changelog for more details.

    v3.13.0

    -

    API: window

    +

    API: window

    • Add extendUserAgentWith and exitProcessOnClose options to window.create TypeScript definition.
    @@ -72,12 +86,12 @@

    Improve
  • Fix the restarting issue that happens when the app path contains spaces.
  • v3.11.0

    -

    API: window

    +

    API: window

    • Avoid saving the window state for child windows in the window.create function by using the --window-use-saved-state=false internal CLI argument.

    v3.10.0

    -

    API: window

    +

    API: window

    • Export the window.center function.
    @@ -135,7 +149,7 @@

    Core:
  • Add NL_CCOMMIT to hold the release commit of the client library.
  • v3.3.0

    -

    API: window

    +

    API: window

    • Add window.getPosition to get the current window coordinates.
    @@ -150,7 +164,7 @@

    API: initAPI: window

    +

    API: window

    • Add window.setAlwaysOnTop(bool).
    • Add window.getSize.
    • @@ -198,6 +212,6 @@

      Events

    +
    \ No newline at end of file diff --git a/docs/release-notes/framework/index.html b/docs/release-notes/framework/index.html index 453c7a3e..5586ad70 100644 --- a/docs/release-notes/framework/index.html +++ b/docs/release-notes/framework/index.html @@ -12,11 +12,27 @@ - - + +

    Framework

    Unreleased

    +

    v5.4.0

    +

    API: resources

    +
      +
    • Implement getFiles(), extractFile(path, dest), readFile(path), and readBinaryFile(path) functions via the resources module for reading the files embedded in the resources.neu resources bundle. These functions works only if the framework loaded resources from the resource bundle -- they will throw NE_RS_APIRQRF if the framework loaded resources from the resources directory.
    • +
    +

    API: window

    +
      +
    • Implement minimize(), unminimize(), and isMinimized() functions to minimize and restore the native app window.
    • +
    +

    Improvements/bugfixes

    +
      +
    • Fix issues with the clipboard.writeImage() function on Windows.
    • +
    • Fix the unwanted delay with the window.exitProcessOnClose configuration option on Windows.
    • +
    • Fix a bug with the window.isFullScreen() function on GNU/Linux-based platforms.
    • +
    • Fix duplicate virtual PID issues with the os.spawnProcess() function.
    • +

    v5.3.0

    Configuration: window transparency on Windows

    Window transparency support was added on the Windows version of the Neutralinojs framework. This can be activated with modes.window.transparent configuration property or --window-transparent command-line option. Unlike in other platforms, Windows native window becomes borderless (window controls will be hidden) with the activation of the transparent mode.

    @@ -30,7 +46,7 @@

    API: filesyst
  • Add the filesystem.getRelativePath(path, ?base) function to get a relative path from a path and a base path.
  • Add the filesystem.getPathParts(path) to parse and get path segments like filename, extension, root path, etc.
  • -

    Improvements/bugfixes

    +

    Improvements/bugfixes

    • Fix Unicode issues in the Windows version with filesystem, storage, and general modules.
    • Fix standard output/error data display issues on Windows
    • @@ -46,11 +62,11 @@

      Configuration<

      Core: Static server SPA (Single Page App) serving

      Earlier, Neutralinojs app developers had to use hash routing with their frontend-library-based apps since the internal static server didn't offer an inbuilt URL rewrite logic for SPAs (Single Page Apps). Now, they can use the singlePageServe: true option in the app configuration file to activate SPA routing. If this setting is on, the static server will serve the main index.html file when it receives directory requests that possibly send HTTP 404 status.

      For example, the /invoices path serves the main index.html file if there is no directory named invoices which holds an index.html file.

      -

      API: window

      +

      API: window

      • Improve the behaviour of the window.show() function on Windows. Now, this function flashes the window if it's already in foreground and activates the window properly if it's minimized.
      -

      Improvements/bugfixes

      +

      Improvements/bugfixes

      • Fix path issues with the defaultPath option in system file dialogs on Windows.
      @@ -124,7 +140,7 @@

      OS APIImprovements/bugfixes

      +

      Improvements/bugfixes

      • Fix Unicode charactor issues in the tray menu on Windows.
      • Avoid including null bytes to file reader events initiated by the filesystem.openFile function.
      • @@ -140,12 +156,12 @@

        Now the framework stores the primary window state in a temporary file (JSON formatted) and loads during the startup process. This feature stores and sets the window position (x, y coordinates), size (width and height), and maximized status. This feature is enabled by default in all platforms, but app developers can turn it off by using false for the window.useSavedState configuration attribute or --window-use-saved-state internal CLI argument.

        Also, the window state loading status is available via the NL_WSAVSTLOADED global variable. The framework sets true for this boolean variable if the window state was loaded from the saved configuration.

        -

        Improvements/bugfixes

        +

        Improvements/bugfixes

        • Fix several issues in the webview Windows code (i.e., Wait for the window close event, window style fixes, etc.).

        v4.12.0

        -

        API: window

        +

        API: window

        • Add window.center to center the application window programmatically.
        @@ -159,7 +175,7 @@

        Core: webview
      • Statically link the Webview2 loader library on Windows, so app developers can package their apps without including the WebView2Loader.dll file.
      -

      Improvements/bugfixes

      +

      Improvements/bugfixes

      • Added Unicode characters support for Neutralinojs Windows.
      @@ -177,7 +193,7 @@

      API: File
    • dir: Directory path
    • filename: Modified file
    -

    Improvements/bugfixes

    +

    Improvements/bugfixes

    -

    API: window

    +

    API: window

    • window.setAlwaysOnTop(bool) was added.
    • window.getSize was added.
    • @@ -386,7 +402,7 @@

      Bugfixesv4.1.0

      -

      API: window

      +

      API: window

      • window.getTitle returns the current native window title.
      @@ -470,6 +486,6 @@

      Bug fixesGlobal variables

      • NL_APPVERSION: Value of the version key in the config file.
      • -
    +
    \ No newline at end of file diff --git a/index.html b/index.html index 05534c33..722ed187 100644 --- a/index.html +++ b/index.html @@ -12,10 +12,10 @@ - - + + -
    Neutralinojs logo animation

    Neutralinojs

    Build lightweight cross-platform desktop apps with JavaScript, HTML, and CSS

    Build once with JavaScript

    Run on Linux, Windows, macOS, Web, and Chrome Browser.

    Neutralinojs is a lightweight and portable desktop application development framework. It lets you develop lightweight cross-platform desktop applications using JavaScript, HTML and CSS. You can extend Neutralinojs with any programming language (via extensions IPC) and use Neutralinojs as a part of any source file (via child processes IPC).

    In Electron and NWjs, you have to install Node.js and hundreds of dependency libraries. Embedded Chromium and Node.js make simple apps bloaty — in most scenarios, the framework weighs more than your app source. Neutralinojs offers a lightweight and portable SDK which is an alternative for Electron and NW.js. Neutralinojs doesn't bundle Chromium and uses the existing web browser library in the operating system (e.g., gtk-webkit2 on Linux). Neutralinojs implements a secure WebSocket connection for native operations and embeds a static web server to serve the web content. Also, it offers a built-in JavaScript client library for developers.

    If you can build a website, you can build cross-platform desktop apps too because Neutralinojs is a framework for creating native desktop applications with web technologies like JavaScript, HTML and CSS. You can indeed use your favorite frontend framework (such as Angular, React, Svelte, Vue, etc.) for building your next Neutralinojs app.

    Learn Neutralinojs in 5 mins

    Start building lightweight apps

    Native API

    Native API

    Neutralinojs Javascript API exposes access to operating system level functions such as file manipulation, executing commands and showing native dialog boxes.

    Portable & Zero Dependency

    Portable & Zero Dependency

    No extra dependencies are required to run Neutralinojs apps. The great advantage is that you can develop applications for all platforms using just one platform. No compilers are required!

    Cross-Platform Support

    Cross-Platform Support

    Neutralinojs apps function on Linux, Windows, macOS, Web and Chrome. A single portable application is compatible with all popular operating systems and web browsers.

    Lightweight & Fast

    Lightweight & Fast

    A simple uncompressed Neutralinojs app is only ~2MB, and a compressed app size is ~0.5MB. Indeed, it will not consume either physical memory or storage like any other Chromium-based cross-platform application development framework.

    Simple & Flexible

    Simple & Flexible

    The Neutralinojs team always offers simple and flexible development interfaces for programmers. The framework has a simple portable auto-updater and CLI. We don't use OOP-based classes everywhere and time-consuming setups to complicate your work.

    Any Backend, Any Frontend

    Any Backend, Any Frontend

    You can build Neutralinojs apps with any frontend framework with your favorite features like HMR. Also, you can use Neutralinojs as a part of any source file with the child process IPC or extend Neutralinojs API with any backend language with the extensions IPC.

    Start building lightweight apps!

    npm install -g @neutralinojs/neu

    +
    Neutralinojs logo animation

    Neutralinojs

    Build lightweight cross-platform desktop apps with JavaScript, HTML, and CSS

    Build once with JavaScript

    Run on Linux, Windows, macOS, Web, and Chrome Browser.

    Neutralinojs is a lightweight and portable desktop application development framework. It lets you develop lightweight cross-platform desktop applications using JavaScript, HTML and CSS. You can extend Neutralinojs with any programming language (via extensions IPC) and use Neutralinojs as a part of any source file (via child processes IPC).

    In Electron and NWjs, you have to install Node.js and hundreds of dependency libraries. Embedded Chromium and Node.js make simple apps bloaty — in most scenarios, the framework weighs more than your app source. Neutralinojs offers a lightweight and portable SDK which is an alternative for Electron and NW.js. Neutralinojs doesn't bundle Chromium and uses the existing web browser library in the operating system (e.g., gtk-webkit2 on Linux). Neutralinojs implements a secure WebSocket connection for native operations and embeds a static web server to serve the web content. Also, it offers a built-in JavaScript client library for developers.

    If you can build a website, you can build cross-platform desktop apps too because Neutralinojs is a framework for creating native desktop applications with web technologies like JavaScript, HTML and CSS. You can indeed use your favorite frontend framework (such as Angular, React, Svelte, Vue, etc.) for building your next Neutralinojs app.

    Learn Neutralinojs in 5 mins

    Start building lightweight apps

    Native API

    Native API

    Neutralinojs Javascript API exposes access to operating system level functions such as file manipulation, executing commands and showing native dialog boxes.

    Portable & Zero Dependency

    Portable & Zero Dependency

    No extra dependencies are required to run Neutralinojs apps. The great advantage is that you can develop applications for all platforms using just one platform. No compilers are required!

    Cross-Platform Support

    Cross-Platform Support

    Neutralinojs apps function on Linux, Windows, macOS, Web and Chrome. A single portable application is compatible with all popular operating systems and web browsers.

    Lightweight & Fast

    Lightweight & Fast

    A simple uncompressed Neutralinojs app is only ~2MB, and a compressed app size is ~0.5MB. Indeed, it will not consume either physical memory or storage like any other Chromium-based cross-platform application development framework.

    Simple & Flexible

    Simple & Flexible

    The Neutralinojs team always offers simple and flexible development interfaces for programmers. The framework has a simple portable auto-updater and CLI. We don't use OOP-based classes everywhere and time-consuming setups to complicate your work.

    Any Backend, Any Frontend

    Any Backend, Any Frontend

    You can build Neutralinojs apps with any frontend framework with your favorite features like HMR. Also, you can use Neutralinojs as a part of any source file with the child process IPC or extend Neutralinojs API with any backend language with the extensions IPC.

    Start building lightweight apps!

    npm install -g @neutralinojs/neu

    \ No newline at end of file diff --git a/lunr-index-1727165743246.json b/lunr-index-1727165743246.json deleted file mode 100644 index 7d887be9..00000000 --- a/lunr-index-1727165743246.json +++ /dev/null @@ -1 +0,0 @@ -{"version":"2.3.9","fields":["title","content","keywords"],"fieldVectors":[["title/0",[0,1396.187]],["content/0",[]],["keywords/0",[]],["title/1",[1,475.405]],["content/1",[1,5.235,2,11.578,3,7.044,4,10.401,5,4.543,6,5.054,7,3.951,8,7.84,9,7.044,10,5.018,11,3.951,12,5.331,13,6.675,14,7.527,15,7.267,16,6.849,17,7.044,18,6.151,19,3.763,20,9.857,21,7.267,22,5.198,23,2.554,24,7.527,25,3.595]],["keywords/1",[]],["title/2",[26,1523.181]],["content/2",[]],["keywords/2",[]],["title/3",[27,1523.181]],["content/3",[5,6.053,28,12.291,29,8.328]],["keywords/3",[]],["title/4",[30,573.163]],["content/4",[31,12.826,32,6.25,33,12.057,34,8.659,35,6.41,36,6.199,37,5.549,38,9.34,39,10.643,40,12.826,41,4.709,42,13.992,43,12.826]],["keywords/4",[]],["title/5",[44,1523.181]],["content/5",[5,6.276,11,4.793,25,6.44,28,8.198,34,7.758,41,3.204,45,10.802,46,8.368,47,12.536,48,12.536,49,9.536,50,6.307,51,8.368,52,9.536,53,12.536]],["keywords/5",[]],["title/6",[54,1523.181]],["content/6",[5,5.87,55,14.959,56,9.077,57,10.753]],["keywords/6",[]],["title/7",[58,485.4]],["content/7",[5,3.955,25,4.621,41,4.313,55,10.078,59,13.848,60,3.269,61,7.139,62,4.742,63,7.356,64,6.944,65,5.674,66,10.078,67,4.937,68,12.28,69,15.467,70,4.983]],["keywords/7",[]],["title/8",[71,1523.181]],["content/8",[5,5.535,56,8.559,72,5.256,73,7.494,74,10.46,75,6.68]],["keywords/8",[]],["title/9",[41,254.297,72,304.251,75,386.689]],["content/9",[5,3.177,7,4.081,11,2.763,18,4.302,23,2.638,39,7.505,41,2.522,56,4.913,64,5.579,70,5.047,73,8.203,75,3.835,76,8.502,77,9.866,78,4.683,79,6.733,80,8.097,81,9.866,82,7.774,83,8.398,84,4.64,85,4.444,86,5.821,87,9.866,88,9.866,89,9.866]],["keywords/9",[]],["title/10",[90,1203.639,91,483.923]],["content/10",[57,10.437,67,7.113,92,11.81,93,8.247,94,5.638]],["keywords/10",[]],["title/11",[30,573.163]],["content/11",[41,4.98,58,3.995,60,3.337,61,7.288,75,4.872,91,6.881,93,5.844,95,9.243,96,6.005,97,9.878,98,19.486,99,9.878,100,9.878,101,7.088]],["keywords/11",[]],["title/12",[102,1523.181]],["content/12",[5,5.236,25,6.118,60,4.327,91,6.537,103,8.354,104,9.193,105,10.853,106,8.265]],["keywords/12",[]],["title/13",[30,573.163]],["content/13",[7,4.696,36,5.031,37,4.503,41,2.902,58,5.092,63,6.801,70,3.353,72,3.472,96,7.654,103,5.834,104,6.42,106,5.772,107,10.408,108,5.157,109,4.801,110,5.898,111,10.408,112,8.946,113,8.14,114,6.91,115,10.408,116,11.354]],["keywords/13",[]],["title/14",[41,254.297,60,264.815,72,304.251]],["content/14",[91,7.328,104,10.306,105,12.167,106,9.266]],["keywords/14",[]],["title/15",[117,1523.181]],["content/15",[5,5.236,25,6.118,60,4.327,91,6.537,104,9.193,106,8.265,118,8.445,119,10.853]],["keywords/15",[]],["title/16",[30,573.163]],["content/16",[41,5.205,60,3.64,70,5.359,91,7.295,96,8.692,115,12.534,120,11.222,121,13.674,122,13.674,123,13.674]],["keywords/16",[]],["title/17",[124,1523.181]],["content/17",[5,5.236,25,6.118,60,4.327,91,6.537,104,9.193,106,8.265,118,8.445,125,7.579]],["keywords/17",[]],["title/18",[30,573.163]],["content/18",[41,4.046,60,4.214,91,8.02,120,12.992,126,15.831,127,8.048,128,14.511,129,11.349]],["keywords/18",[]],["title/19",[1,475.405]],["content/19",[1,4.836,2,3.581,3,3.217,4,3.217,6,1.563,9,3.217,10,2.292,11,3.29,20,3.048,25,1.642,94,3.151,127,2.218,130,11.748,131,4.363,132,2.242,133,3.217,134,4.363,135,3.048,136,4.417,137,4.363,138,6.472,139,3.319,140,2.09,141,3.128,142,4.363,143,5.248,144,3.999,145,3.76,146,9.888,147,2.853,148,2.404,149,2.467,150,8.017,151,2.501,152,3.99,153,1.933,154,2.798,155,3.999,156,4.363,157,2.7,158,2.574,159,2.434,160,2.242,161,2.74,162,3.999,163,2.747,164,2.09,165,3.128,166,2.318,167,3.048,168,4.363,169,1.949,170,2.977,171,4.363,172,16.364,173,4.363,174,4.363,175,4.363,176,4.363,177,4.363,178,3.999,179,2.434,180,2.912,181,4.363,182,4.363,183,3.76,184,3.128,185,2.195,186,1.601,187,3.438,188,4.363,189,4.363,190,3.217,191,4.363,192,3.319,193,4.363,194,2.467]],["keywords/19",[]],["title/20",[195,1203.639,196,639.49]],["content/20",[1,2.846,3,6.724,5,2.937,6,4.883,10,4.79,23,2.438,29,4.04,61,5.302,62,3.521,94,2.906,103,4.685,135,6.372,138,7.858,139,6.937,153,4.04,157,5.643,197,9.119,198,6.088,199,9.523,200,9.119,201,9.119,202,3.368,203,4.04,204,9.119,205,4.685,206,9.119,207,7.484,208,4.142,209,9.119,210,4.902,211,2.3,212,5.849,213,9.119,214,8.359,215,6.088]],["keywords/20",[]],["title/21",[10,445.355,203,375.673,216,578.597,217,516.048]],["content/21",[1,4.88,4,5.102,7,4.555,22,5.992,65,3.197,85,4.96,152,3.676,153,3.066,157,6.815,167,4.835,180,4.619,203,3.066,211,1.745,212,4.438,216,9.36,217,6.702,218,2.707,219,7.063,220,4.96,221,7.694,222,8.334,223,6.919,224,8.376,225,5.962,226,6.342,227,10.094,228,5.133,229,5.263,230,5.452,231,6.342,232,4.96,233,4.619,234,5.962,235,6.342,236,4.764,237,6.342,238,5.452,239,4.438]],["keywords/21",[]],["title/22",[240,1523.181]],["content/22",[]],["keywords/22",[]],["title/23",[241,1312.537]],["content/23",[56,8.559,72,5.256,91,6.91,153,7.615,242,10.46,243,10.823]],["keywords/23",[]],["title/24",[41,254.297,60,264.815,72,304.251]],["content/24",[41,3.844,70,4.442,242,12.979,243,9.471,244,9.647,245,10.264,246,12.344,247,15.04,248,15.04]],["keywords/24",[]],["title/25",[249,1523.181]],["content/25",[118,9.467,153,8.076,243,11.478,244,11.69]],["keywords/25",[]],["title/26",[30,573.163]],["content/26",[37,6.278,41,4.046,60,4.214,153,7.014,243,9.969,244,12.794,250,11.349,251,15.831]],["keywords/26",[]],["title/27",[252,1312.537]],["content/27",[118,9.467,153,8.076,243,11.478,245,12.438]],["keywords/27",[]],["title/28",[75,386.689,105,664.158,253,911.968]],["content/28",[32,9.673,41,1.998,70,2.309,91,3.143,222,3.817,245,11.411,254,4.612,255,6.736,256,7.817,257,6.736,258,9.947,259,6.416,260,7.817,261,5.764,262,7.817,263,7.817,264,12.12,265,7.817,266,12.12,267,7.817,268,12.12,269,7.817,270,7.817,271,7.817,272,7.817,273,6.736,274,7.817,275,6.736,276,4.253,277,6.159,278,7.817,279,7.817]],["keywords/28",[]],["title/29",[280,1396.187]],["content/29",[72,5.41,103,9.09,153,7.838,243,11.141,244,11.347]],["keywords/29",[]],["title/30",[41,254.297,60,264.815,72,304.251]],["content/30",[41,3.943,70,4.556,153,6.835,243,9.714,244,9.894,250,11.058,281,19.623,282,15.426,283,15.426]],["keywords/30",[]],["title/31",[284,1312.537]],["content/31",[72,5.41,103,9.09,153,7.838,243,11.141,245,12.073]],["keywords/31",[]],["title/32",[41,254.297,72,304.251,75,386.689]],["content/32",[41,3.661,70,4.23,72,4.381,75,5.568,202,5.29,253,19.097,285,8.865,286,10.269,287,14.325,288,14.325,289,14.325]],["keywords/32",[]],["title/33",[290,1396.187]],["content/33",[]],["keywords/33",[]],["title/34",[291,1396.187]],["content/34",[6,6.157,50,8.646,72,5.256,94,5.477,292,8.737,293,9.351]],["keywords/34",[]],["title/35",[41,254.297,72,304.251,276,541.341]],["content/35",[41,3.943,50,9.872,60,4.106,70,4.556,276,8.393,292,7.842,294,7.682,295,14.14,296,15.426]],["keywords/35",[]],["title/36",[58,317.056,297,994.919,298,994.919]],["content/36",[1,4.563,7,6.047,22,5.458,32,4.481,35,4.595,36,4.444,50,10.14,72,3.067,233,6.696,236,4.34,292,5.099,299,6.105,300,7.63,301,6.105,302,6.696,303,5.526,304,10.031,305,4.481,306,10.031,307,7.191,308,10.031,309,9.194,310,7.396,311,8.643,312,8.232]],["keywords/36",[]],["title/37",[30,573.163]],["content/37",[25,5.66,32,10.051,313,15.04,314,9.836,315,19.308,316,15.04,317,13.786]],["keywords/37",[]],["title/38",[58,485.4]],["content/38",[108,8.497,305,8.357,318,13.131,319,17.149,320,14.325,321,17.149,322,14.325,323,14.325,324,13.131]],["keywords/38",[]],["title/39",[32,444.426,41,254.297,72,304.251]],["content/39",[1,2.472,11,2.218,25,2.98,30,4.607,37,3.141,41,3.129,50,3.984,58,2.524,61,4.604,70,5.684,105,5.287,110,6.359,158,4.672,180,5.287,198,5.287,208,3.597,305,3.538,309,15.435,318,7.26,319,7.26,321,7.26,325,7.92,326,5.84,327,7.92,328,7.92,329,6.5,330,7.92,331,7.92,332,4.309,333,6.825,334,5.405,335,5.534,336,7.92,337,7.92,338,4.82,339,6.025]],["keywords/39",[]],["title/40",[340,1523.181]],["content/40",[]],["keywords/40",[]],["title/41",[341,1523.181]],["content/41",[72,5.41,153,7.838,261,13.044,342,15.245,343,15.245]],["keywords/41",[]],["title/42",[41,254.297,72,304.251,75,386.689]],["content/42",[32,8.211,41,2.404,70,2.777,75,5.42,342,15.839,344,16.848,345,7.884,346,16.848,347,13.944,348,10.281,349,15.085,350,9.404,351,9.404,352,9.404,353,6.15,354,9.404]],["keywords/42",[]],["title/43",[355,1250.059]],["content/43",[72,4.381,216,9.775,217,8.719,221,10.009,224,10.897,246,11.756,294,7.134,356,18.709,357,14.325,358,13.131,359,14.325,360,13.131]],["keywords/43",[]],["title/44",[41,254.297,60,264.815,72,304.251]],["content/44",[41,4.271,70,4.935,216,11.403,217,10.17,361,15.316,362,16.71,363,16.71]],["keywords/44",[]],["title/45",[364,1396.187]],["content/45",[72,5.41,152,9.399,153,7.838,345,10.003,365,15.245]],["keywords/45",[]],["title/46",[41,254.297,72,304.251,75,386.689]],["content/46",[41,3.139,60,4.491,70,3.627,157,7.599,211,3.097,228,5.724,230,9.676,242,7.474,365,10.582,366,12.28,367,7.599,368,12.28,369,12.28,370,11.256,371,11.256,372,12.28,373,12.28,374,12.28,375,12.28]],["keywords/46",[]],["title/47",[376,1396.187]],["content/47",[72,5.574,152,9.684,153,8.076,345,10.306]],["keywords/47",[]],["title/48",[41,254.297,72,304.251,75,386.689]],["content/48",[41,3.139,60,5.131,70,3.627,96,5.883,152,8.965,153,7.476,228,5.724,242,7.474,370,11.256,371,11.256,377,12.28,378,12.28,379,12.28,380,12.28,381,12.28,382,12.28]],["keywords/48",[]],["title/49",[383,1396.187]],["content/49",[72,5.748,216,12.826,345,10.627]],["keywords/49",[]],["title/50",[41,254.297,72,304.251,75,386.689]],["content/50",[32,8.964,37,3.141,41,2.024,56,3.944,60,3.984,70,2.339,72,2.422,96,3.794,216,10.213,217,4.82,285,4.901,344,11.222,384,12.243,385,7.92,386,10.55,387,7.92,388,7.26,389,7.26,390,7.92,391,7.92,392,7.92,393,6.5,394,7.26,395,7.92,396,7.92,397,3.509,398,7.92,399,7.92,400,7.92,401,7.92,402,7.92,403,7.92,404,7.92,405,7.92]],["keywords/50",[]],["title/51",[406,1396.187]],["content/51",[72,5.574,160,9.365,345,10.306,407,10.306]],["keywords/51",[]],["title/52",[41,254.297,72,304.251,75,386.689]],["content/52",[75,7.305,276,10.227,407,10.627]],["keywords/52",[]],["title/53",[407,861.244]],["content/53",[32,8.598,37,3.141,41,2.024,70,4.42,75,3.078,254,4.672,255,6.825,257,6.825,258,10.048,259,6.5,345,4.478,349,6.5,389,7.26,407,11.346,408,4.478,409,7.92,410,7.26,411,4.744,412,12.243,413,7.92,414,7.92,415,7.92,416,7.92,417,7.26,418,6.825,419,7.92,420,7.92,421,7.26,422,7.92,423,7.92,424,7.26,425,7.92]],["keywords/53",[]],["title/54",[426,1396.187]],["content/54",[56,8.81,72,5.41,427,16.216,428,12.683,429,10.437]],["keywords/54",[]],["title/55",[41,254.297,72,304.251,75,386.689]],["content/55",[32,7.538,41,3.139,70,3.627,259,10.078,430,8.581,431,15.467,432,9.676,433,13.848,434,11.515,435,12.28,436,8.581,437,9.676,438,12.28,439,12.28,440,12.28,441,12.28]],["keywords/55",[]],["title/56",[442,1523.181]],["content/56",[]],["keywords/56",[]],["title/57",[91,400.007,95,733.569,443,994.919]],["content/57",[19,7.675,57,7.396,67,5.04,92,8.368,93,5.844,136,5.6,160,6.441,169,5.6,202,4.629,444,9.878,445,7.894,446,10.288,447,6.995,448,6.66,449,9.878,450,10.802,451,12.536]],["keywords/57",[]],["title/58",[30,573.163]],["content/58",[19,4.74,41,4.253,58,3.835,60,4.429,61,6.997,75,4.678,91,6.69,93,5.61,96,5.765,97,9.483,100,9.483,101,6.805,452,12.035,453,12.035,454,16.641,455,16.641]],["keywords/58",[]],["title/59",[91,483.923,456,1203.639]],["content/59",[11,3.305,19,8.037,25,4.44,67,6.599,92,7.877,93,7.651,127,5.998,160,9.698,448,6.269,457,5.936,458,9.683,459,8.7,460,11.799,461,8.7,462,7.43]],["keywords/59",[]],["title/60",[30,573.163]],["content/60",[41,4.98,58,3.995,60,3.337,61,7.288,75,4.872,91,6.881,93,5.844,95,9.243,96,6.005,97,9.878,99,9.878,100,9.878,101,7.088,463,19.486]],["keywords/60",[]],["title/61",[464,1396.187]],["content/61",[19,6.968,72,5.41,160,9.09,457,8.9,465,9.626]],["keywords/61",[]],["title/62",[41,254.297,72,304.251,75,386.689]],["content/62",[19,6.294,20,7.934,25,4.273,41,2.902,60,4.253,70,4.719,159,6.336,160,8.21,208,5.157,276,8.694,457,8.039,462,7.15,466,11.354,467,6.336,468,14.646,469,11.354,470,10.408]],["keywords/62",[]],["title/63",[471,1523.181]],["content/63",[]],["keywords/63",[]],["title/64",[93,561.075,367,744.849]],["content/64",[5,3.054,19,4.764,23,1.538,25,1.212,34,3.56,35,1.475,51,2.149,57,3.394,61,1.872,67,3.135,78,1.528,91,3.135,93,2.682,94,2.485,103,1.654,106,3.964,129,4.124,136,1.438,160,4.006,164,2.756,166,1.711,169,5.865,179,1.797,208,1.462,211,3.051,294,4.722,305,1.438,338,5.771,346,8.691,348,2.374,408,1.821,428,2.308,445,3.623,449,2.537,472,2.643,473,1.351,474,3.22,475,12.895,476,8.941,477,3.22,478,3.297,479,2.374,480,2.449,481,2.537,482,2.951,483,2.951,484,2.951,485,2.951,486,2.374,487,2.951,488,2.951,489,3.22,490,2.308,491,3.22,492,3.22,493,3.22,494,3.22,495,1.993,496,3.22,497,2.951,498,2.951,499,2.951,500,4.721,501,2.951,502,2.951,503,2.951,504,2.951,505,3.22,506,2.537,507,1.9,508,4.957,509,2.028,510,4.242,511,2.775,512,4.02,513,2.643,514,2.775,515,2.951,516,2.537,517,2.951,518,1.821,519,2.106,520,3.56,521,2.775,522,2.775,523,2.537,524,2.537,525,1.9]],["keywords/64",[]],["title/65",[526,1203.639,527,821.36]],["content/65",[67,7.328,93,8.496,527,12.438,528,14.959]],["keywords/65",[]],["title/66",[30,573.163]],["content/66",[1,3.184,41,2.607,57,6.018,60,2.715,61,5.93,70,4.371,91,5.951,93,4.755,95,7.521,96,4.886,202,6.433,447,8.259,465,5.55,475,7.127,527,6.961,529,9.35,530,5.847,531,10.2,532,10.2,533,5.847,534,10.2,535,10.2,536,10.2,537,10.2,538,9.35]],["keywords/66",[]],["title/67",[527,821.36,539,1203.639]],["content/67",[93,8.762,527,12.826,540,17.229]],["keywords/67",[]],["title/68",[30,573.163]],["content/68",[41,3.943,60,4.106,95,11.374,96,7.39,202,7.247,529,14.14,538,14.14,541,10.778,542,15.426]],["keywords/68",[]],["title/69",[91,483.923,543,1203.639]],["content/69",[1,4.173,11,3.745,12,7.461,56,6.659,57,7.888,67,5.376,92,11.933,93,8.333,94,4.261,161,4.878,169,5.973,202,4.938,447,7.461,544,7.366]],["keywords/69",[]],["title/70",[30,573.163]],["content/70",[41,3.576,58,4.459,60,3.724,61,8.134,75,5.438,91,7.407,93,6.522,95,10.317,96,6.703,97,11.025,100,11.025,101,7.912,545,13.992]],["keywords/70",[]],["title/71",[91,483.923,546,1203.639]],["content/71",[19,6.404,67,6.537,92,10.853,93,7.579,94,5.181,169,9.061,547,12.811]],["keywords/71",[]],["title/72",[30,573.163]],["content/72",[41,4.774,58,3.688,60,3.08,61,6.728,70,3.418,75,4.498,91,7.51,93,5.394,95,8.533,96,5.544,97,9.118,99,9.118,100,9.118,101,6.543,548,18.68,549,7.161,550,10.608]],["keywords/72",[]],["title/73",[551,1523.181]],["content/73",[]],["keywords/73",[]],["title/74",[367,744.849,552,1203.639]],["content/74",[5,4.123,18,5.582,23,3.423,28,8.372,29,7.692,104,7.239,106,6.508,118,6.65,119,8.546,127,8.825,170,8.736,218,5.009,553,11.735,554,12.802,555,9.439,556,8.372]],["keywords/74",[]],["title/75",[30,573.163]],["content/75",[1,3.239,36,4.597,37,5.942,41,4.496,58,3.307,60,3.988,125,8.199,127,8.941,166,5.513,299,9.12,367,6.421,475,7.25,557,10.376,558,6.121,559,13.379,560,10.376,561,10.376,562,10.376]],["keywords/75",[]],["title/76",[35,551.372,125,561.075]],["content/76",[]],["keywords/76",[]],["title/77",[35,388.407,125,395.243,161,309.305,563,256.689]],["content/77",[10,1.521,11,0.811,19,1.14,23,3.022,25,1.967,30,1.089,35,1.326,50,3.597,64,1.637,78,5.364,94,0.923,96,1.387,103,1.487,118,2.716,125,6.862,127,2.658,132,1.487,136,1.293,153,1.283,158,1.708,160,1.487,161,3.195,164,1.387,219,1.857,294,1.442,301,1.762,338,1.762,408,2.956,445,1.823,457,1.456,475,2.023,480,2.202,481,2.281,495,1.791,509,1.823,520,3.235,523,2.281,533,1.659,544,1.595,563,0.876,564,4.12,565,2.895,566,14.014,567,2.375,568,2.194,569,2.895,570,2.654,571,1.708,572,2.178,573,2.895,574,2.654,575,1.4,576,2.023,577,2.281,578,1.857,579,2.654,580,2.654,581,2.495,582,2.495,583,2.654,584,2.281,585,2.495,586,2.376,587,2.654,588,4.218,589,2.495,590,2.654,591,2.895,592,2.654,593,4.291,594,2.895,595,2.654,596,2.495,597,2.654,598,2.654,599,1.893,600,2.495,601,2.654,602,2.654,603,2.654,604,2.495,605,2.654,606,2.654,607,2.654,608,4.12,609,9.275,610,2.895,611,2.895,612,2.495,613,2.895,614,2.654,615,2.895,616,2.895,617,3.182,618,2.895,619,5.228,620,2.895,621,2.654,622,2.023,623,2.654,624,3.653,625,1.427,626,2.895,627,2.895,628,2.281,629,2.895,630,2.202,631,2.895,632,2.895,633,2.895,634,2.654,635,2.654,636,2.654,637,4.675,638,2.895,639,2.376,640,4.792,641,2.895,642,1.975,643,2.654,644,4.505,645,2.654]],["keywords/77",[]],["title/78",[646,1396.187]],["content/78",[]],["keywords/78",[]],["title/79",[647,1200.171]],["content/79",[1,3.835,5,1.503,6,1.672,11,2.229,12,2.604,18,2.035,22,2.539,23,1.248,29,2.068,38,3.116,50,2.348,62,1.802,65,3.677,70,3.071,93,4.848,99,6.269,109,1.974,136,2.085,159,4.44,160,4.088,161,4.482,164,3.812,169,3.554,179,2.604,186,1.713,202,3.841,211,1.177,218,3.113,228,2.176,299,2.841,301,2.841,446,3.83,447,8.942,448,2.48,506,6.269,527,3.185,563,3.149,576,3.261,646,7.293,647,6.269,648,3.83,649,3.261,650,4.667,651,3.185,652,4.667,653,5.312,654,5.01,655,3.261,656,5.56,657,4.667,658,4.278,659,4.667,660,3.677,661,3.55,662,2.993,663,3.261,664,7.957,665,4.667,666,4.022,667,6.856,668,4.667,669,3.185,670,3.677,671,2.993]],["keywords/79",[]],["title/80",[672,618.422,673,632.214]],["content/80",[]],["keywords/80",[]],["title/81",[672,511.183,673,522.583,674,911.968]],["content/81",[1,2.374,5,4.697,7,3.146,11,2.13,19,1.744,22,2.409,25,1.666,37,1.756,50,2.227,56,3.787,62,1.709,63,2.652,64,2.503,72,3.628,73,1.93,86,2.612,96,2.121,110,3.95,119,2.955,148,2.439,151,2.538,152,2.352,153,1.961,157,2.74,169,3.397,190,3.264,205,2.275,210,2.38,211,2.522,216,3.021,217,2.694,221,3.093,224,3.367,228,4.66,230,3.488,246,3.633,285,2.74,291,4.058,292,2.25,294,5.908,358,4.058,360,4.058,457,2.227,473,1.858,490,3.174,555,3.264,568,3.192,572,1.844,575,2.141,658,4.058,673,2.325,675,4.427,676,4.058,677,4.427,678,3.633,679,3.633,680,4.427,681,2.352,682,4.427,683,4.058,684,3.815,685,4.427,686,4.427,687,4.058,688,4.058,689,2.25,690,6.971,691,4.427,692,5.898,693,6.241,694,6.971,695,6.971,696,4.427,697,4.058,698,4.058,699,3.021,700,3.367,701,3.815,702,3.021]],["keywords/81",[]],["title/82",[292,505.769,672,511.183,673,522.583]],["content/82",[18,3.088,37,2.808,70,5.424,84,3.331,91,2.847,109,2.995,140,3.392,185,3.563,186,2.599,292,7.08,329,5.812,367,4.382,476,5.812,495,4.382,662,4.542,663,4.948,672,8.14,673,7.316,674,6.491,703,4.382,704,11.217,705,7.082,706,6.491,707,7.082,708,4.242,709,7.082,710,7.082,711,5.387,712,7.082,713,7.082,714,7.082,715,7.082,716,7.082,717,5.58,718,10.282,719,6.102,720,7.082,721,7.082,722,6.491,723,7.082,724,7.082,725,4.833]],["keywords/82",[]],["title/83",[161,362.941,563,301.201,726,816.52]],["content/83",[]],["keywords/83",[]],["title/84",[161,362.941,307,713.244,563,301.201]],["content/84",[727,20.047]],["keywords/84",[]],["title/85",[728,1523.181]],["content/85",[]],["keywords/85",[]],["title/86",[729,1523.181]],["content/86",[1,3.612,72,3.539,78,7.686,160,5.946,332,6.297,334,7.897,367,7.161,530,6.633,609,9.497,636,10.608,637,10.59,730,8.296,731,8.811,732,11.572,733,11.572,734,9.972,735,6.633,736,11.572,737,8.803,738,5.493]],["keywords/86",[]],["title/87",[30,573.163]],["content/87",[60,4.574,78,8.157,637,11.239,642,11.728,731,11.421]],["keywords/87",[]],["title/88",[41,254.297,72,304.251,75,386.689]],["content/88",[41,4.046,70,5.891,78,7.514,637,13.045,731,8.614,739,14.511,740,13.642]],["keywords/88",[]],["title/89",[644,1312.537]],["content/89",[11,2.554,25,3.432,41,3.483,70,6.222,78,7.745,132,7.002,202,3.368,228,4.251,303,5.024,457,4.588,637,10.671,643,8.359,645,8.359,678,7.484,730,6.537,731,4.962,735,7.812,739,8.359,740,7.858,741,8.359,742,7.484,743,8.359,744,8.359,745,7.484]],["keywords/89",[]],["title/90",[746,1523.181]],["content/90",[]],["keywords/90",[]],["title/91",[91,483.923,747,1203.639]],["content/91",[1,5.522,91,7.113,118,9.189,617,10.767,748,13.94]],["keywords/91",[]],["title/92",[30,573.163]],["content/92",[37,4.679,41,3.016,58,3.76,60,4.369,70,3.485,75,4.586,91,6.599,476,9.683,533,6.763,749,9.683,750,11.799,751,11.799,752,6.343,753,9.683,754,11.799,755,11.799,756,11.799,757,10.815,758,10.815,759,10.815]],["keywords/92",[]],["title/93",[760,1523.181]],["content/93",[1,5.075,72,4.972,91,6.537,103,8.354,530,9.319,533,9.319,617,9.895,748,12.811]],["keywords/93",[]],["title/94",[30,573.163]],["content/94",[60,4.574,91,6.91,294,8.559,533,9.851,617,10.46,753,14.105]],["keywords/94",[]],["title/95",[41,254.297,60,264.815,72,304.251]],["content/95",[41,3.943,60,4.106,70,4.556,91,8.676,617,9.388,753,12.66,761,15.426,762,15.426]],["keywords/95",[]],["title/96",[763,1250.059]],["content/96",[72,5.748,533,10.774,617,11.439]],["keywords/96",[]],["title/97",[41,254.297,72,304.251,276,541.341]],["content/97",[41,3.751,60,3.906,70,5.612,149,8.297,276,7.984,533,12.081,617,8.931,764,14.674,765,14.674]],["keywords/97",[]],["title/98",[64,562.552,85,448.117,544,548.108]],["content/98",[]],["keywords/98",[]],["title/99",[766,791.174]],["content/99",[]],["keywords/99",[]],["title/100",[457,500.531,524,783.934,767,756.806]],["content/100",[1,5.047,6,3.218,23,3.603,29,3.98,94,4.294,164,6.456,205,9.233,218,3.515,219,5.762,222,4.386,457,6.78,479,6.623,544,4.949,555,6.623,568,5.656,593,7.372,642,6.13,656,9.416,671,5.762,689,4.567,742,7.372,768,7.741,769,9.416,770,5.874,771,7.078,772,5.997]],["keywords/100",[]],["title/101",[83,699.748,773,1203.639]],["content/101",[5,2.62,6,2.914,11,2.278,23,4.927,36,3.604,58,2.592,62,3.141,70,2.402,73,8.036,74,4.951,83,4.729,85,3.664,94,3.983,109,3.439,148,4.481,162,7.456,218,3.182,236,3.519,250,5.831,292,6.353,299,4.951,302,5.43,457,4.092,459,5.997,576,5.683,703,5.034,772,5.43,774,5.683,775,5.217,776,7.456,777,7.456,778,5.319,779,8.134,780,5.551,781,6.675]],["keywords/101",[]],["title/102",[782,1523.181]],["content/102",[84,7.074,205,7.728,519,9.836,572,8.885,672,7.728,673,7.9,684,12.96,783,10.782,784,12.344]],["keywords/102",[]],["title/103",[785,1523.181]],["content/103",[36,7.204,37,6.448,84,7.647,151,9.319,190,11.988,211,4.101,473,6.824,558,9.592]],["keywords/103",[]],["title/104",[218,331.741,653,566.008,654,533.929,655,592.448]],["content/104",[1,3.901,5,2.62,6,2.914,11,2.278,25,3.061,29,3.604,36,3.604,62,3.141,64,8.605,85,6.854,93,3.792,205,4.179,218,5.954,219,5.217,292,4.135,293,4.426,512,5.683,625,4.01,654,5.122,655,10.634,656,8.732,671,5.217,725,5.551,770,5.319,786,8.134,787,7.456,788,6.675,789,7.009,790,8.134,791,13.95,792,8.134,793,7.456,794,5.551]],["keywords/104",[]],["title/105",[19,391.886,218,389.267,655,695.182]],["content/105",[5,5.079,6,3.993,11,3.121,19,4.39,20,7.787,25,4.193,58,3.551,64,6.301,85,7.103,205,5.726,210,8.477,218,4.36,312,9.146,457,7.933,459,8.217,478,6.388,500,9.146,544,6.139,568,4.677,670,8.781,795,11.144]],["keywords/105",[]],["title/106",[796,1523.181]],["content/106",[5,6.053,84,8.84,731,10.227]],["keywords/106",[]],["title/107",[797,721.007,798,1203.639]],["content/107",[84,8.321,163,11.141,164,8.475,797,10.598,799,11.347]],["keywords/107",[]],["title/108",[800,1523.181]],["content/108",[5,4.506,11,3.919,39,10.643,84,6.581,86,10.868,348,10.317,445,8.811,519,9.15,530,8.02,672,7.189,673,7.349,679,11.483,801,12.826]],["keywords/108",[]],["title/109",[556,787.108,802,1203.639]],["content/109",[84,8.573,196,9.684,556,11.919,803,11.093]],["keywords/109",[]],["title/110",[118,440.412,556,843.607,804,847.889]],["content/110",[23,4.73,84,8.321,196,9.399,556,11.569,803,10.767]],["keywords/110",[]],["title/111",[805,678.93,806,783.934,807,994.919]],["content/111",[84,8.321,109,7.481,465,9.626,805,12.073,806,13.94]],["keywords/111",[]],["title/112",[689,611.873,808,1203.639]],["content/112",[19,7.179,84,8.573,348,13.439,809,18.227]],["keywords/112",[]],["title/113",[689,611.873,810,1203.639]],["content/113",[23,3.352,58,3.995,109,5.301,110,6.511,127,6.373,161,4.573,163,7.894,164,8.198,196,6.66,457,6.307,563,3.795,689,6.373,731,6.821,811,11.678,812,8.368,813,9.536,814,8.759]],["keywords/113",[]],["title/114",[161,362.941,689,505.769,815,994.919]],["content/114",[84,8.083,161,6.27,563,5.203,624,12.009,625,8.474,816,14.105]],["keywords/114",[]],["title/115",[817,678.93,818,713.244,819,994.919]],["content/115",[58,5.638,84,8.321,165,12.683,817,12.073,818,12.683]],["keywords/115",[]],["title/116",[211,303.58,473,505.182]],["content/116",[5,5.236,11,4.554,29,7.204,64,9.193,85,7.323,186,5.967,211,4.101,473,6.824]],["keywords/116",[]],["title/117",[211,303.58,820,1203.639]],["content/117",[84,8.84,211,4.741,821,11.836]],["keywords/117",[]],["title/118",[211,303.58,822,1203.639]],["content/118",[84,8.84,211,4.741,823,10.927]],["keywords/118",[]],["title/119",[211,250.937,824,664.158,825,994.919]],["content/119",[84,8.083,434,11.728,575,8.311,803,10.46,824,11.473,826,10.636]],["keywords/119",[]],["title/120",[38,664.158,211,250.937,827,994.919]],["content/120",[84,8.321,436,12.362,473,7.425,575,8.555,826,10.948]],["keywords/120",[]],["title/121",[211,303.58,828,1203.639]],["content/121",[84,8.573,473,7.65,826,11.279,829,13.865]],["keywords/121",[]],["title/122",[211,303.58,830,1203.639]],["content/122",[84,8.321,575,8.555,803,10.767,826,10.948,831,13.044]],["keywords/122",[]],["title/123",[211,303.58,832,1203.639]],["content/123",[84,8.321,575,8.555,803,10.767,826,10.948,833,15.245]],["keywords/123",[]],["title/124",[211,303.58,834,1203.639]],["content/124",[84,8.321,575,8.555,803,10.767,826,10.948,835,15.245]],["keywords/124",[]],["title/125",[211,303.58,836,987.814]],["content/125",[84,8.84,211,4.741,254,11.089]],["keywords/125",[]],["title/126",[211,303.58,837,987.814]],["content/126",[84,8.84,211,4.741,411,11.259]],["keywords/126",[]],["title/127",[211,250.937,836,816.52,838,911.968]],["content/127",[84,8.573,254,10.753,826,11.279,839,12.438]],["keywords/127",[]],["title/128",[211,250.937,837,816.52,838,911.968]],["content/128",[84,8.573,411,10.918,826,11.279,839,12.438]],["keywords/128",[]],["title/129",[211,250.937,836,816.52,840,911.968]],["content/129",[84,8.573,254,10.753,826,11.279,841,13.439]],["keywords/129",[]],["title/130",[211,250.937,837,816.52,840,911.968]],["content/130",[84,8.573,411,10.918,826,11.279,841,13.439]],["keywords/130",[]],["title/131",[211,303.58,842,1203.639]],["content/131",[84,8.321,211,4.462,429,10.437,430,12.362,432,13.94]],["keywords/131",[]],["title/132",[211,303.58,843,1203.639]],["content/132",[84,8.321,211,4.462,429,10.437,436,12.362,844,12.683]],["keywords/132",[]],["title/133",[211,303.58,845,1203.639]],["content/133",[84,8.083,429,10.139,575,8.311,826,10.636,846,14.105,847,12.321]],["keywords/133",[]],["title/134",[211,303.58,848,1203.639]],["content/134",[84,8.573,211,4.597,473,7.65,849,13.439]],["keywords/134",[]],["title/135",[211,303.58,850,1203.639]],["content/135",[84,8.321,575,8.555,803,10.767,826,10.948,851,14.519]],["keywords/135",[]],["title/136",[25,319.055,34,524.7,211,213.853,852,847.889]],["content/136",[51,12.167,84,8.573,853,18.227,854,15.706]],["keywords/136",[]],["title/137",[211,250.937,689,505.769,855,994.919]],["content/137",[6,6.338,211,4.462,588,10.437,770,11.569,856,12.362]],["keywords/137",[]],["title/138",[11,237.488,211,213.853,699,578.597,857,847.889]],["content/138",[84,8.083,109,7.267,196,9.131,211,4.335,490,12.321,699,11.728]],["keywords/138",[]],["title/139",[15,561.923,211,186.319,478,423.433,858,582.065,859,738.72]],["content/139",[84,8.321,109,7.481,292,8.993,478,10.141,858,13.94]],["keywords/139",[]],["title/140",[473,505.182,681,639.49]],["content/140",[5,5.236,11,4.554,29,7.204,64,9.193,85,7.323,186,5.967,473,6.824,681,8.638]],["keywords/140",[]],["title/141",[681,639.49,836,987.814]],["content/141",[254,11.089,681,9.986,826,11.631]],["keywords/141",[]],["title/142",[681,639.49,837,987.814]],["content/142",[411,11.259,681,9.986,826,11.631]],["keywords/142",[]],["title/143",[681,639.49,860,1203.639]],["content/143",[11,3.861,25,3.484,37,3.672,58,2.951,61,5.383,64,7.794,65,4.279,84,4.355,85,4.171,103,4.757,108,4.206,110,4.81,194,5.236,211,4.153,367,5.73,473,3.886,555,6.827,661,7.043,671,5.939,681,7.324,824,10.992,861,5.636,862,7.979,863,9.259,864,9.259,865,6.319,866,9.259,867,9.259,868,9.259]],["keywords/143",[]],["title/144",[869,1523.181]],["content/144",[]],["keywords/144",[]],["title/145",[870,1523.181]],["content/145",[192,11.734,567,7.006,568,9.058,735,8.842,871,11.374,872,15.426,873,12.66,874,11.374]],["keywords/145",[]],["title/146",[30,573.163]],["content/146",[41,4.935,60,4.003,67,6.047,70,4.442,568,6.313,572,8.045,875,15.04,876,15.04,877,15.04]],["keywords/146",[]],["title/147",[878,1523.181]],["content/147",[23,3.575,166,7.104,202,4.938,530,7.664,568,8.452,570,12.256,571,11.88,572,5.571,735,7.664,752,7.188,871,9.859,874,9.859]],["keywords/147",[]],["title/148",[30,573.163]],["content/148",[23,4.233,41,5.099,60,4.214,568,6.645,572,8.311,879,15.831,880,15.831]],["keywords/148",[]],["title/149",[91,483.923,881,1203.639]],["content/149",[23,5.424,118,10.536,125,7.579,244,10.428,584,12.811,735,9.319]],["keywords/149",[]],["title/150",[30,573.163]],["content/150",[23,4.125,41,3.943,60,5.223,166,10.426,300,11.734,525,9.1,882,12.66,883,15.426]],["keywords/150",[]],["title/151",[91,483.923,884,1203.639]],["content/151",[23,5.647,67,5.147,91,5.147,118,6.65,125,5.968,147,8.372,149,7.239,166,6.802,202,4.728,219,8.211,244,8.211,567,5.815,584,10.087,735,7.338,885,9.738]],["keywords/151",[]],["title/152",[30,573.163]],["content/152",[41,4.782,60,4.98,70,4.23,166,9.94,300,10.897,525,8.451,882,11.756,885,10.897,886,18.709]],["keywords/152",[]],["title/153",[91,483.923,887,1203.639]],["content/153",[23,5.424,118,10.536,125,7.579,222,7.938,584,12.811,735,9.319]],["keywords/153",[]],["title/154",[30,573.163]],["content/154",[23,4.057,41,2.699,60,2.81,67,6.101,70,6.074,166,5.609,222,7.408,273,9.098,525,6.229,699,7.205,882,8.665,888,9.098,889,13.908,890,9.678,891,9.098,892,9.678,893,9.678,894,9.098,895,9.678,896,10.558]],["keywords/154",[]],["title/155",[91,483.923,897,1203.639]],["content/155",[23,5.647,67,5.147,91,6.98,118,6.65,125,5.968,147,8.372,149,7.239,202,4.728,219,8.211,222,6.251,567,5.815,584,10.087,735,7.338,885,9.738]],["keywords/155",[]],["title/156",[30,573.163]],["content/156",[23,2.682,41,3.737,60,2.67,67,5.878,70,5.952,166,5.329,222,7.139,273,8.643,525,5.918,699,6.845,882,8.232,885,7.63,888,8.643,889,15.814,890,9.194,891,8.643,892,9.194,893,9.194,894,8.643,895,9.194,898,14.621]],["keywords/156",[]],["title/157",[899,1523.181]],["content/157",[23,5.424,103,10.422,125,7.579,244,10.428,581,14.01,735,9.319]],["keywords/157",[]],["title/158",[30,573.163]],["content/158",[23,4.78,32,7.985,58,5.697,60,3.559,261,9.859,277,10.535,353,8.744,428,9.585,429,7.888,525,7.888,900,12.256,901,12.256,902,11.522]],["keywords/158",[]],["title/159",[41,254.297,60,264.815,72,304.251]],["content/159",[23,3.284,41,4.313,70,6.13,91,8.345,166,6.525,326,9.054,353,8.031,437,9.676,903,16.874,904,16.874,905,10.582]],["keywords/159",[]],["title/160",[906,1523.181]],["content/160",[23,5.424,103,10.422,125,7.579,222,7.938,581,14.01,735,9.319]],["keywords/160",[]],["title/161",[30,573.163]],["content/161",[23,4.78,32,7.985,58,5.697,60,3.559,261,9.859,277,10.535,353,8.744,428,9.585,429,7.888,525,7.888,900,12.256,901,12.256,902,11.522]],["keywords/161",[]],["title/162",[41,254.297,72,304.251,75,386.689]],["content/162",[23,3.352,41,3.204,67,5.04,70,6.183,91,5.04,166,9.092,222,6.121,525,7.396,888,10.802,891,14.747,907,12.536,908,12.536,909,12.536,910,12.536]],["keywords/162",[]],["title/163",[911,1523.181]],["content/163",[23,5.334,106,8.048,125,7.38,567,7.191,587,14.511,588,9.34,735,9.074,912,12.992]],["keywords/163",[]],["title/164",[30,573.163]],["content/164",[60,5.003,525,13.067]],["keywords/164",[]],["title/165",[32,444.426,41,254.297,72,304.251]],["content/165",[23,4.233,41,4.046,70,4.675,106,8.048,294,7.884,913,18.285,914,14.511,915,13.642]],["keywords/165",[]],["title/166",[91,400.007,338,605.534,916,911.968]],["content/166",[7,5.185,23,4.576,50,6.307,78,5.95,103,6.441,106,9.906,338,7.63,447,6.995,588,7.396,590,11.491,735,7.186,912,10.288,917,11.491,918,9.878,919,11.491,920,10.802]],["keywords/166",[]],["title/167",[30,573.163]],["content/167",[11,1.763,23,3.719,32,1.591,36,1.579,37,1.413,41,2.608,51,2.378,58,1.135,60,0.948,61,2.071,70,5.419,75,1.385,91,3.399,103,8.361,106,5.188,107,7.749,109,2.661,166,3.344,184,4.512,186,1.308,205,1.831,222,3.073,261,9.49,277,4.959,285,3.895,326,2.627,338,7.093,353,4.116,408,2.014,428,9.227,429,4.987,448,3.344,500,2.924,513,2.924,514,3.07,527,2.431,558,2.102,669,2.431,793,3.266,905,8.794,913,5.769,914,3.266,919,5.769,921,3.266,922,3.07,923,2.71,924,3.563,925,6.294,926,3.563,927,2.807,928,6.294,929,3.563,930,3.563,931,3.563,932,3.563,933,3.266,934,3.266,935,3.563,936,2.924,937,3.563,938,3.07,939,3.07,940,5.423,941,3.563,942,3.563,943,8.454,944,2.627]],["keywords/167",[]],["title/168",[945,1523.181]],["content/168",[23,5.247,72,4.717,106,9.975,294,7.682,334,10.526,465,8.393,592,14.14,735,8.842]],["keywords/168",[]],["title/169",[30,573.163]],["content/169",[23,4.73,32,7.903,106,8.993,294,8.81,408,10.003]],["keywords/169",[]],["title/170",[41,254.297,72,304.251,75,386.689]],["content/170",[23,4.217,32,8.175,41,2.848,46,7.439,70,3.291,103,5.726,106,9.304,108,5.062,110,5.789,261,8.217,299,6.783,408,6.301,428,7.989,513,9.146,946,11.144,947,11.144,948,11.144,949,9.603,950,11.144,951,11.144]],["keywords/170",[]],["title/171",[952,1396.187]],["content/171",[72,3.915,149,9.816,202,4.728,294,6.375,467,7.144,518,7.239,520,13.07,530,7.338,567,5.815,572,5.334,603,11.735,735,7.338,873,10.507,953,10.087]],["keywords/171",[]],["title/172",[30,573.163]],["content/172",[60,4.851,568,7.65,572,9.061]],["keywords/172",[]],["title/173",[32,444.426,41,254.297,72,304.251]],["content/173",[23,3.284,41,3.139,70,6.639,294,6.115,520,7.599,669,8.38,915,10.582,936,10.078,954,14.54,955,11.256,956,12.28,957,12.28,958,10.582,959,12.28]],["keywords/173",[]],["title/174",[960,1523.181]],["content/174",[518,9.193,520,12.552,571,11.967,605,14.903,735,9.319,953,12.811]],["keywords/174",[]],["title/175",[30,573.163]],["content/175",[23,4.73,32,7.903,294,8.81,520,10.948,954,15.245]],["keywords/175",[]],["title/176",[32,444.426,41,254.297,72,304.251]],["content/176",[23,4.022,41,4.935,70,4.442,294,7.49,520,9.307,915,12.96,954,16.638,955,13.786,961,15.04]],["keywords/176",[]],["title/177",[962,1396.187]],["content/177",[23,4.73,72,5.41,345,10.003,520,10.948,567,8.035]],["keywords/177",[]],["title/178",[41,254.297,72,304.251,75,386.689]],["content/178",[75,7.305,276,10.227,963,17.229]],["keywords/178",[]],["title/179",[963,1396.187]],["content/179",[23,3.423,32,5.719,41,3.272,60,3.408,70,5.817,408,7.239,424,11.735,520,13.661,572,5.334,964,12.802,965,12.802,966,12.802]],["keywords/179",[]],["title/180",[58,383.57,967,1103.286]],["content/180",[103,8.354,147,10.632,149,9.193,166,8.638,568,6.824,572,6.774,595,14.903,735,9.319]],["keywords/180",[]],["title/181",[30,573.163]],["content/181",[60,4.851,572,9.061,968,18.227]],["keywords/181",[]],["title/182",[58,485.4]],["content/182",[36,7.014,37,6.278,103,8.134,108,7.191,114,9.635,568,6.645,871,14.708,969,12.992]],["keywords/182",[]],["title/183",[41,254.297,72,304.251,75,386.689]],["content/183",[75,7.305,276,10.227,970,17.229]],["keywords/183",[]],["title/184",[970,1396.187]],["content/184",[23,4.78,41,3.418,60,4.758,70,5.279,367,8.274,568,5.612,971,15.411,972,13.371,973,13.371,974,13.371]],["keywords/184",[]],["title/185",[975,1203.639,976,915.574]],["content/185",[23,4.125,67,6.202,153,6.835,568,6.474,572,6.427,598,14.14,599,12.832,735,8.842,976,11.734]],["keywords/185",[]],["title/186",[30,573.163]],["content/186",[22,11.226,60,5.491,572,6.962,976,12.711,977,15.316]],["keywords/186",[]],["title/187",[58,485.4]],["content/187",[23,3.817,36,7.501,37,6.714,41,3.648,96,6.838,108,7.689,114,5.908,149,8.071,285,8.833,568,4.074,599,6.348,871,10.525,969,7.967,978,9.707,979,8.365,980,9.707,981,8.365,982,9.707,983,8.898,984,9.707,985,9.707]],["keywords/187",[]],["title/188",[976,915.574,986,1203.639]],["content/188",[23,4.125,67,6.202,153,6.835,523,12.154,568,6.474,572,6.427,601,14.14,735,8.842,976,11.734,987,14.14]],["keywords/188",[]],["title/189",[30,573.163]],["content/189",[22,10.179,41,4.782,60,4.98,572,5.968,976,10.897,977,13.131,983,13.131,988,14.325,989,14.325,990,14.325]],["keywords/189",[]],["title/190",[991,1523.181]],["content/190",[11,3.586,23,4.642,50,6.441,72,3.915,147,8.372,149,9.816,332,6.966,343,11.032,530,9.951,564,10.087,568,5.373,572,7.233,671,8.211,992,12.802]],["keywords/190",[]],["title/191",[30,573.163]],["content/191",[23,4.73,60,4.709,568,7.425,572,8.901]],["keywords/191",[]],["title/192",[41,254.297,72,304.251,75,386.689]],["content/192",[10,4.16,23,3.274,32,6.685,41,2.024,70,3.616,72,3.744,108,5.561,110,6.359,211,1.998,353,8.006,468,11.222,470,7.26,572,5.101,788,10.048,873,6.5,949,10.55,993,7.92,994,12.243,995,6.825,996,7.92,997,7.92,998,18.206,999,14.966,1000,8.355,1001,7.92,1002,7.92,1003,7.92]],["keywords/192",[]],["title/193",[1004,1312.537]],["content/193",[72,4.599,149,8.504,153,6.664,202,5.554,210,8.085,301,9.154,530,8.621,572,8.885,784,12.344]],["keywords/193",[]],["title/194",[30,573.163]],["content/194",[60,5.003,572,9.228]],["keywords/194",[]],["title/195",[41,254.297,60,264.815,72,304.251]],["content/195",[41,4.271,70,4.935,572,8.596,784,13.713,1005,16.71,1006,15.316]],["keywords/195",[]],["title/196",[208,546.694,1007,1037.186]],["content/196",[72,4.487,149,8.297,153,6.502,202,5.419,208,6.665,210,7.888,301,8.931,530,8.411,572,8.781,783,10.52]],["keywords/196",[]],["title/197",[30,573.163]],["content/197",[11,4.863,30,6.533,36,5.672,58,4.08,60,4.621,208,5.815,219,8.211,572,8.799,683,11.735,783,9.178,1008,12.802,1009,12.802]],["keywords/197",[]],["title/198",[41,254.297,60,264.815,72,304.251]],["content/198",[41,4.782,70,5.525,572,8.68,783,10.269,1006,17.149,1010,18.709,1011,14.325]],["keywords/198",[]],["title/199",[1012,1312.537]],["content/199",[21,13.457,72,5.41,530,10.141,572,7.371,1013,15.245]],["keywords/199",[]],["title/200",[30,573.163]],["content/200",[60,5.003,572,9.228]],["keywords/200",[]],["title/201",[41,254.297,72,304.251,75,386.689]],["content/201",[19,3.436,23,2.332,41,2.23,60,5.689,70,2.576,525,5.146,549,8.157,568,3.661,572,7.92,783,6.253,799,11.356,923,6.635,1014,8.723,1015,8.723,1016,8.723,1017,8.723,1018,8.723,1019,7.996,1020,8.723,1021,8.723,1022,8.723,1023,13.181,1024,8.723,1025,8.723]],["keywords/201",[]],["title/202",[85,542.125,218,470.93]],["content/202",[]],["keywords/202",[]],["title/203",[132,782.6]],["content/203",[11,3.305,18,5.145,28,7.716,29,5.228,62,4.556,85,7.393,132,8.433,186,4.331,218,4.616,301,7.181,672,8.433,1026,7.181,1027,10.815,1028,14.144,1029,14.144,1030,8.7,1031,10.815]],["keywords/203",[]],["title/204",[62,588.121]],["content/204",[]],["keywords/204",[]],["title/205",[218,389.267,567,451.893,1032,994.919]],["content/205",[1,2.89,5,4.439,11,2.594,18,4.038,23,2.476,30,3.484,36,4.103,37,3.672,46,6.181,58,2.951,67,3.723,94,2.951,96,4.436,109,3.915,185,4.658,208,4.206,222,6.73,242,5.636,294,4.611,567,4.206,778,6.055,1033,10.561,1034,9.259,1035,8.487,1036,9.632,1037,8.487,1038,5.73,1039,6.47,1040,9.259,1041,7.979,1042,7.599]],["keywords/205",[]],["title/206",[218,470.93,236,520.751]],["content/206",[1,3.131,3,7.396,5,5.556,10,5.269,23,3.909,56,4.995,58,3.196,62,3.873,148,8.055,203,4.444,205,7.512,222,4.897,567,6.641,599,9.561,617,8.899,692,5.918,701,8.643,769,7.009,1043,7.191,1044,6.559,1045,10.031,1046,8.643,1047,9.194]],["keywords/206",[]],["title/207",[29,533.295,218,470.93]],["content/207",[1,3.432,5,4.413,6,3.29,11,2.572,13,2.768,19,1.56,23,1.847,25,3.456,29,3.06,56,3.44,58,2.927,61,2.303,62,2.667,64,3.906,73,1.727,85,3.111,94,1.262,106,2.014,109,2.921,119,2.644,133,2.921,135,2.768,136,1.769,151,2.271,152,2.105,153,1.755,157,2.451,161,1.445,164,1.898,169,1.769,170,4.714,180,2.644,185,1.993,196,3.67,205,2.035,212,2.541,215,2.644,216,2.703,217,2.411,218,1.55,222,3.372,239,2.541,257,5.952,285,2.451,462,2.494,473,1.663,519,2.59,547,3.121,558,2.337,563,1.199,624,2.768,625,4.528,648,3.251,653,6.131,654,6.925,672,2.035,673,2.081,689,4.669,752,2.129,770,2.59,774,2.768,788,3.251,811,4.714,847,2.84,861,2.411,894,3.413,1000,2.703,1048,3.961,1049,3.251,1050,3.631,1051,3.961,1052,3.549,1053,6.907,1054,3.631,1055,3.961,1056,3.251,1057,2.59,1058,3.961,1059,3.961,1060,2.768,1061,3.961,1062,3.961,1063,3.121,1064,3.961]],["keywords/207",[]],["title/208",[78,571.283,218,470.93]],["content/208",[1,1.86,7,2.465,11,4.43,18,2.599,23,1.594,58,1.899,62,2.301,70,1.76,73,2.599,78,4.634,94,3.951,136,2.663,149,3.37,169,2.663,196,5.187,220,4.273,222,2.91,228,7.372,232,4.273,233,3.979,236,5.364,237,5.463,303,3.284,465,5.312,541,4.165,559,4.534,563,1.804,578,3.823,642,6.662,671,3.823,692,5.759,702,9.782,703,3.689,725,4.067,730,8.888,766,3.096,770,3.898,781,8.012,1038,3.689,1065,4.696,1066,4.534,1067,5.463,1068,5.136,1069,8.948,1070,9.762,1071,5.96,1072,5.463]],["keywords/208",[]],["title/209",[218,470.93,228,561.075]],["content/209",[1,3.996,5,4.123,62,4.943,112,10.087,170,11.847,228,9.182,345,7.239,465,9.446,568,5.373,625,6.312,672,6.578,752,6.882,1073,12.802,1074,7.144]],["keywords/209",[]],["title/210",[218,389.267,1075,950.459]],["content/210",[25,3.539,30,3.539,37,3.729,58,2.997,62,3.631,67,5.606,79,6.417,85,7.485,149,5.317,218,5.456,294,4.683,303,5.181,305,4.201,457,4.731,504,8.62,528,7.718,540,8.62,571,5.548,1026,5.724,1075,13.446,1076,6.742,1077,5.39,1078,9.404,1079,9.404,1080,8.62,1081,7.718]],["keywords/210",[]],["title/211",[1075,996.069]],["content/211",[1,4.367,6,6.6,62,5.403,85,8.298,94,4.459,118,7.268,218,5.475,305,6.25,1075,12.047,1082,13.992,1083,9.777]],["keywords/211",[]],["title/212",[6,431.222,1075,787.108]],["content/212",[11,1.721,30,3.765,35,2.814,60,1.635,62,7.312,67,2.47,70,5.592,75,2.387,85,4.507,128,5.631,186,2.255,194,3.473,202,2.269,218,2.403,305,2.744,332,3.342,338,3.739,345,3.473,393,5.041,447,3.428,528,11.978,567,2.79,667,5.293,669,6.828,797,3.68,861,3.739,1026,3.739,1075,6.543,1077,5.735,1084,12.659,1085,6.143,1086,4.84,1087,6.143,1088,6.143,1089,5.631,1090,6.417,1091,6.143,1092,6.143,1093,6.143,1094,6.143,1095,6.143,1096,6.143,1097,6.143,1098,4.404]],["keywords/212",[]],["title/213",[1075,787.108,1099,987.814]],["content/213",[11,4.197,22,5.646,132,5.331,158,6.121,170,7.081,218,5.863,305,4.635,465,5.646,571,8.84,1026,6.315,1075,12.596,1077,5.948,1099,8.516,1100,7.65,1101,9.511,1102,8.941,1103,10.376,1104,14.985,1105,14.985,1106,10.376,1107,8.516]],["keywords/213",[]],["title/214",[1108,1200.171]],["content/214",[332,9.917,1038,11.279,1098,13.067,1108,14.362]],["keywords/214",[]],["title/215",[1109,1523.181]],["content/215",[]],["keywords/215",[]],["title/216",[1110,1523.181]],["content/216",[109,7.707,161,6.649,211,4.597,821,11.478]],["keywords/216",[]],["title/217",[30,573.163]],["content/217",[30,5.265,41,3.576,58,4.459,60,3.724,202,5.167,211,3.529,447,7.808,549,8.659,821,13.783,1111,12.826,1112,13.992]],["keywords/217",[]],["title/218",[1113,1396.187]],["content/218",[72,5.574,161,6.649,211,4.597,821,11.478]],["keywords/218",[]],["title/219",[41,254.297,60,264.815,72,304.251]],["content/219",[41,3.751,56,7.307,57,8.657,70,5.612,161,5.353,211,3.701,821,13.272,1114,14.674,1115,14.674]],["keywords/219",[]],["title/220",[1116,1523.181]],["content/220",[41,4.522,161,6.454,211,4.462,1042,14.519,1117,17.691]],["keywords/220",[]],["title/221",[1118,1523.181]],["content/221",[41,4.522,161,6.454,211,4.462,831,13.044,1119,17.691]],["keywords/221",[]],["title/222",[1120,1523.181]],["content/222",[41,4.522,161,6.454,211,4.462,1121,17.691,1122,17.691]],["keywords/222",[]],["title/223",[1123,1523.181]],["content/223",[72,5.41,110,9.189,161,6.454,211,4.462,831,13.044]],["keywords/223",[]],["title/224",[41,254.297,72,304.251,108,451.893]],["content/224",[41,3.943,56,7.682,70,4.556,110,8.012,114,9.388,208,7.006,803,11.943,831,11.374,1124,15.426]],["keywords/224",[]],["title/225",[1125,1523.181]],["content/225",[41,4.393,434,11.728,473,7.213,689,8.737,824,11.473,1126,17.186]],["keywords/225",[]],["title/226",[1127,1523.181]],["content/226",[34,10.636,41,4.393,434,11.728,473,7.213,824,11.473,1128,17.186]],["keywords/226",[]],["title/227",[1129,1523.181]],["content/227",[72,5.11,110,8.679,161,6.096,211,4.214,434,11.403,473,7.013,824,11.155]],["keywords/227",[]],["title/228",[41,254.297,72,304.251,108,451.893]],["content/228",[41,3.844,56,7.49,70,4.442,110,7.812,114,9.154,208,6.831,434,10.264,803,11.752,824,10.04,1130,15.04]],["keywords/228",[]],["title/229",[1131,1396.187]],["content/229",[41,4.522,161,6.454,211,4.462,1132,12.683,1133,17.691]],["keywords/229",[]],["title/230",[1134,1523.181]],["content/230",[41,4.522,161,6.454,211,4.462,1135,14.519,1136,17.691]],["keywords/230",[]],["title/231",[1137,1523.181]],["content/231",[72,5.41,110,9.189,161,6.454,211,4.462,833,15.245]],["keywords/231",[]],["title/232",[41,254.297,72,304.251,108,451.893]],["content/232",[41,3.943,56,7.682,70,4.556,110,8.012,114,9.388,208,7.006,803,11.943,833,13.292,1138,15.426]],["keywords/232",[]],["title/233",[1139,1523.181]],["content/233",[41,4.522,161,6.454,211,4.462,487,16.216,1140,17.691]],["keywords/233",[]],["title/234",[1141,1523.181]],["content/234",[38,11.81,436,12.362,467,9.872,473,7.425,1142,17.691]],["keywords/234",[]],["title/235",[30,573.163]],["content/235",[36,5.924,37,5.302,41,4.569,58,4.261,70,3.949,108,6.073,110,6.945,436,9.343,467,7.461,473,5.612,1143,13.371,1144,10.535,1145,13.371,1146,13.371,1147,13.371]],["keywords/235",[]],["title/236",[844,862.872,1148,1203.639]],["content/236",[9,8.217,10,5.853,153,4.938,161,4.065,179,6.218,211,2.811,432,12.425,434,10.761,436,11.019,462,7.018,523,8.781,530,6.388,541,7.787,1049,9.146,1054,10.215,1149,11.995,1150,15.769,1151,11.144,1152,8.781,1153,11.144]],["keywords/236",[]],["title/237",[30,573.163]],["content/237",[32,8.229,37,7.306,41,3.576,429,8.255,430,9.777,1154,16.887,1155,12.826,1156,12.826,1157,12.826,1158,13.992,1159,12.826]],["keywords/237",[]],["title/238",[1160,1312.537]],["content/238",[41,4.046,56,7.884,94,5.045,161,5.775,211,3.993,407,8.951,846,12.992,1161,12.474,1162,15.831]],["keywords/238",[]],["title/239",[1163,1523.181]],["content/239",[109,7.481,161,6.454,211,4.462,823,10.285,1164,17.691]],["keywords/239",[]],["title/240",[30,573.163]],["content/240",[23,3.352,41,3.204,60,3.337,70,3.702,152,6.66,153,5.554,203,5.554,210,6.739,245,8.554,572,5.223,823,11.328,1165,12.536,1166,8.759,1167,10.802,1168,11.491,1169,12.536,1170,12.536]],["keywords/240",[]],["title/241",[58,383.57,1171,1203.639]],["content/241",[140,5.544,161,4.222,196,6.148,211,4.084,292,5.883,473,4.857,478,6.633,530,9.282,829,8.803,1172,10.608,1173,12.318,1174,11.315,1175,8.803,1176,8.533,1177,13.954,1178,10.608,1179,10.608,1180,10.608]],["keywords/241",[]],["title/242",[30,573.163]],["content/242",[58,4.565,60,3.813,70,4.23,292,7.282,854,12.344,1173,10.897,1174,10.009,1175,10.897,1176,10.562,1181,13.131,1182,13.131,1183,14.325,1184,13.131]],["keywords/242",[]],["title/243",[1184,1396.187]],["content/243",[14,5.515,24,8.757,32,3.127,36,4.924,38,4.673,41,2.841,56,3.486,58,3.542,70,3.282,93,3.263,108,3.179,109,2.96,110,5.773,179,6.201,259,5.744,326,5.161,333,6.032,429,4.129,431,6.416,523,5.515,774,4.891,839,4.776,1174,7.765,1176,5.161,1177,11.91,1185,11.114,1186,13.821,1187,7,1188,7,1189,7,1190,5.324,1191,9.121,1192,4.891,1193,7,1194,6.416,1195,7,1196,7,1197,6.416,1198,7,1199,11.114,1200,7,1201,7]],["keywords/243",[]],["title/244",[1202,1523.181]],["content/244",[93,7.191,527,10.526,571,9.1,995,13.292,1172,14.14,1173,11.734,1174,10.778,1175,11.734,1176,11.374,1177,13.292]],["keywords/244",[]],["title/245",[30,573.163]],["content/245",[41,4.046,60,4.214,70,4.675,294,7.884,1173,12.042,1174,11.062,1181,14.511,1182,14.511,1203,15.831]],["keywords/245",[]],["title/246",[1204,1523.181]],["content/246",[50,9.17,109,7.707,211,4.597,353,11.919]],["keywords/246",[]],["title/247",[58,485.4]],["content/247",[32,7.659,37,2.411,38,4.059,41,2.536,50,3.059,58,5.764,70,2.931,108,4.507,109,4.196,114,3.701,140,2.913,185,3.059,211,4.562,254,10.116,411,9.574,839,6.772,841,7.317,851,8.144,1159,5.574,1205,5.574,1206,5.574,1207,5.574,1208,5.574,1209,5.574,1210,5.574,1211,3.091,1212,4.99,1213,6.081,1214,6.081,1215,6.081,1216,9.923,1217,5.574,1218,6.081,1219,6.081,1220,6.081,1221,6.081]],["keywords/247",[]],["title/248",[1222,1396.187]],["content/248",[72,5.574,211,4.597,345,10.306,353,11.919]],["keywords/248",[]],["title/249",[41,254.297,72,304.251,108,451.893]],["content/249",[32,8.98,41,2.262,70,2.614,108,4.02,211,5.262,254,10.523,411,9.601,839,9.094,841,9.826,851,7.264,1144,6.974,1205,8.113,1206,8.113,1207,8.113,1208,8.113,1209,8.113,1210,8.113,1211,4.5,1223,8.851,1224,8.851,1225,8.851]],["keywords/249",[]],["title/250",[1226,1312.537]],["content/250",[72,5.574,211,4.597,429,10.753,1149,13.865]],["keywords/250",[]],["title/251",[41,254.297,72,304.251,108,451.893]],["content/251",[32,7.755,41,3.272,70,3.781,211,3.229,429,7.553,430,8.945,432,10.087,433,14.248,436,8.945,1149,13.206,1155,11.735,1157,11.735,1227,12.802,1228,12.802,1229,12.802]],["keywords/251",[]],["title/252",[1230,1203.639,1231,1037.186]],["content/252",[1,4.352,11,2.634,25,3.539,50,4.731,67,6.681,94,4.444,106,4.781,161,5.087,210,5.055,211,5.368,236,4.069,507,5.548,509,5.922,512,6.571,563,2.847,567,7.548,617,5.724,671,6.032,1100,6.934,1194,8.62,1232,7.718,1233,9.404]],["keywords/252",[]],["title/253",[30,573.163]],["content/253",[57,6.827,58,5.16,60,3.08,65,5.347,94,3.688,154,7.422,203,5.127,205,8.32,367,7.161,457,8.147,547,9.118,572,4.821,731,8.811,813,8.803,1231,9.972,1234,11.572,1235,11.05,1236,11.572]],["keywords/253",[]],["title/254",[1231,1312.537]],["content/254",[5,1.564,6,1.739,25,3.096,32,7.675,34,3.005,51,3.241,60,2.85,61,2.823,62,3.177,63,4.929,64,4.653,67,1.952,108,7.804,109,2.053,140,3.942,150,3.313,203,2.151,211,4.672,254,4.854,255,4.184,332,2.642,411,4.929,430,3.393,434,3.313,436,3.393,467,4.592,478,2.783,479,3.58,544,2.675,588,2.864,821,3.057,823,2.823,824,3.241,826,3.005,835,4.184,839,5.615,841,6.067,844,3.481,856,3.393,861,2.955,1135,3.985,1156,4.45,1237,4.855,1238,4.855,1239,4.855,1240,4.855,1241,4.45,1242,4.855,1243,4.855,1244,3.693,1245,4.855,1246,4.855,1247,4.855,1248,4.855,1249,4.855,1250,4.855,1251,4.855,1252,4.855,1253,4.855,1254,4.855]],["keywords/254",[]],["title/255",[41,254.297,72,304.251,75,386.689]],["content/255",[25,6.206,32,5.307,34,4.715,35,3.49,37,4.712,38,7.931,41,1.947,60,3.162,67,4.777,70,4.313,104,6.718,110,3.958,114,7.231,119,5.086,125,3.552,179,6.63,211,3.683,254,4.495,411,4.564,823,4.43,835,6.566,1217,6.984,1255,6.004,1256,6.984,1257,9.361,1258,7.619,1259,7.619,1260,7.619,1261,7.619,1262,7.619,1263,7.619,1264,6.984,1265,7.619,1266,7.619]],["keywords/255",[]],["title/256",[1267,1396.187]],["content/256",[]],["keywords/256",[]],["title/257",[58,383.57,1268,1103.286]],["content/257",[62,7.038,72,5.574,119,12.167,625,8.987]],["keywords/257",[]],["title/258",[30,573.163]],["content/258",[60,4.851,62,8.398,625,8.987]],["keywords/258",[]],["title/259",[58,485.4]],["content/259",[11,2.676,25,5.308,56,4.757,58,3.044,60,3.755,62,3.689,65,4.414,104,5.402,105,6.377,108,4.339,109,4.04,110,4.962,140,4.576,160,4.908,202,3.528,210,5.136,447,5.331,563,2.892,567,4.339,568,4.01,625,4.71,666,8.232,812,9.417,1269,9.553,1270,8.232,1271,9.553,1272,8.232,1273,8.232,1274,8.757,1275,9.553,1276,9.553]],["keywords/259",[]],["title/260",[41,254.297,72,304.251,75,386.689]],["content/260",[25,5.569,32,6.611,34,6.312,35,4.673,41,3.783,60,3.939,70,5.144,104,8.369,110,5.298,179,5.692,228,6.899,299,6.208,812,6.809,1255,8.037,1256,9.35,1277,10.2,1278,10.2,1279,10.2,1280,10.2,1281,9.35,1282,10.2,1283,10.2]],["keywords/260",[]],["title/261",[1284,1037.186,1285,1103.286]],["content/261",[6,5.986,25,6.288,62,6.452,208,7.59,509,10.522,812,11.155,1286,11.403]],["keywords/261",[]],["title/262",[30,573.163]],["content/262",[56,7.49,58,4.793,60,5.139,62,7.455,67,6.047,210,8.085,568,6.313,625,7.416,1287,15.04]],["keywords/262",[]],["title/263",[41,254.297,72,304.251,75,386.689]],["content/263",[11,2.056,18,3.201,25,6.081,28,4.8,32,5.155,34,7.141,35,3.363,37,2.911,41,1.876,70,5.968,129,5.263,152,3.9,153,3.252,161,2.678,184,10.221,294,5.746,408,4.151,445,4.623,510,5.412,660,5.784,669,5.009,936,6.025,938,6.326,939,6.326,940,12.286,958,6.326,1286,5.009,1288,7.341,1289,7.341,1290,6.729,1291,6.729,1292,6.729,1293,7.341,1294,6.729,1295,6.729,1296,7.341]],["keywords/263",[]],["title/264",[91,400.007,338,605.534,1297,994.919]],["content/264",[25,7.266,78,9.164,91,6.047,208,6.831,219,9.647,338,9.154,509,9.471,607,13.786,735,8.621]],["keywords/264",[]],["title/265",[30,573.163]],["content/265",[18,2.303,23,1.412,25,5.007,28,5.776,32,2.359,34,5.465,35,2.419,37,2.094,41,2.909,51,3.525,58,1.683,60,2.351,61,3.07,70,5.644,75,2.053,91,4.577,104,4.994,105,7.599,106,2.685,129,3.786,184,8.16,186,1.938,326,3.894,338,5.375,408,2.986,445,3.326,448,4.692,510,3.894,558,3.116,660,4.161,669,3.604,718,4.841,921,4.841,922,4.551,936,4.334,938,4.551,939,4.551,940,9.809,958,4.551,1292,4.841,1294,4.841,1295,4.841,1298,8.393,1299,5.281,1300,5.281,1301,5.281,1302,5.281,1303,5.281,1304,5.281,1305,5.281,1306,5.281,1307,8.832,1308,5.281,1309,5.281]],["keywords/265",[]],["title/266",[1310,1523.181]],["content/266",[25,7.073,72,5.748,509,11.836]],["keywords/266",[]],["title/267",[41,254.297,72,304.251,75,386.689]],["content/267",[25,6.818,32,6.953,41,4.631,70,3.231,75,4.253,152,5.813,153,4.848,276,5.953,294,5.449,408,6.187,445,6.89,508,13.413,660,8.621,1290,14.268,1291,10.029,1311,10.942,1312,10.942,1313,10.942,1314,10.942]],["keywords/267",[]],["title/268",[1315,1523.181]],["content/268",[37,7.016,215,11.81,219,11.347,530,10.141,673,9.292]],["keywords/268",[]],["title/269",[30,573.163]],["content/269",[60,4.709,96,8.475,215,11.81,533,10.141,673,9.292]],["keywords/269",[]],["title/270",[41,254.297,60,264.815,72,304.251]],["content/270",[37,7.898,41,3.343,60,3.482,70,5.202,72,4,215,11.758,530,7.498,673,9.252,865,8.926,1257,10.307,1316,13.08,1317,13.08]],["keywords/270",[]],["title/271",[1318,1158.64]],["content/271",[37,7.228,72,5.574,215,12.167,673,9.574]],["keywords/271",[]],["title/272",[41,254.297,72,304.251,75,386.689]],["content/272",[37,5.964,41,3.844,70,4.442,215,10.04,465,8.184,533,8.621,673,7.9,1319,15.04,1320,15.04,1321,15.04,1322,15.04]],["keywords/272",[]],["title/273",[58,383.57,1323,1203.639]],["content/273",[11,4.321,23,5.247,149,8.722,202,5.697,572,6.427,588,9.1,1132,11.058,1324,9.714,1325,11.734]],["keywords/273",[]],["title/274",[30,573.163]],["content/274",[58,5.638,60,4.709,821,13.453,1324,11.141]],["keywords/274",[]],["title/275",[58,485.4]],["content/275",[19,3.951,23,3.909,58,5.498,60,4.592,75,3.899,96,4.805,154,6.433,276,7.955,407,5.672,575,4.851,689,5.099,1166,7.009,1232,8.232,1324,6.316,1326,17.268,1327,10.031,1328,10.031,1329,8.643,1330,9.194,1331,8.232]],["keywords/275",[]],["title/276",[41,254.297,72,304.251,75,386.689]],["content/276",[19,6.053,23,2.873,41,2.747,70,6.362,96,7.361,245,7.333,276,5.847,745,8.82,971,12.859,1166,7.509,1326,8.82,1331,8.82,1332,11.33,1333,10.746,1334,9.26,1335,7.924,1336,9.85]],["keywords/276",[]],["title/277",[58,383.57,1337,1203.639]],["content/277",[11,4.213,23,5.163,67,6.047,202,5.554,567,6.831,572,6.266,699,10.264,1132,10.782,1324,9.471,1325,11.441]],["keywords/277",[]],["title/278",[30,573.163]],["content/278",[58,5.638,60,4.709,821,13.453,1324,11.141]],["keywords/278",[]],["title/279",[58,485.4]],["content/279",[19,3.763,23,4.485,58,5.345,60,4.464,75,3.713,96,4.576,108,4.339,154,6.127,276,7.676,407,5.402,559,7.267,575,4.62,979,8.232,981,8.232,1166,6.675,1324,6.016,1326,16.971,1329,8.232,1330,8.757,1331,7.84,1338,9.553,1339,9.553]],["keywords/279",[]],["title/280",[41,254.297,60,264.815,72,304.251]],["content/280",[19,6.131,23,4.162,41,2.797,70,6.4,96,7.457,245,7.467,525,6.455,745,8.98,971,11.159,1166,7.645,1326,8.98,1331,8.98,1332,11.477,1335,8.067,1340,10.942,1341,10.942]],["keywords/280",[]],["title/281",[1342,1523.181]],["content/281",[588,10.753,1044,11.919,1132,13.067,1324,11.478]],["keywords/281",[]],["title/282",[30,573.163]],["content/282",[58,5.638,60,4.709,821,13.453,1324,11.141]],["keywords/282",[]],["title/283",[58,485.4]],["content/283",[58,5.325,60,4.448,407,9.448,572,6.962,575,8.08,1324,10.522,1335,12.32]],["keywords/283",[]],["title/284",[41,254.297,60,264.815,72,304.251]],["content/284",[41,3.495,70,6.014,132,7.026,568,5.739,745,11.222,971,13.008,1044,8.942,1332,13.379,1335,10.082,1336,12.534,1343,13.674]],["keywords/284",[]],["title/285",[166,528.598,823,578.407,1344,994.919]],["content/285",[127,9.555,407,10.627,1345,17.229]],["keywords/285",[]],["title/286",[30,573.163]],["content/286",[36,4.301,37,5.661,41,3.648,58,3.093,60,4.506,70,2.867,96,4.65,125,6.654,166,5.157,210,5.218,299,5.908,559,7.384,821,6.113,823,5.643,1345,8.898,1346,9.707,1347,9.707,1348,8.898,1349,7.967,1350,9.707,1351,9.707,1352,9.707,1353,9.707,1354,9.707,1355,9.707,1356,9.707,1357,9.707,1358,8.898]],["keywords/286",[]],["title/287",[166,450.481,823,492.929,1359,847.889,1360,730.633]],["content/287",[127,9.555,407,10.627,612,16.196]],["keywords/287",[]],["title/288",[30,573.163]],["content/288",[36,5.971,37,7.126,58,4.294,60,4.783,96,4.303,125,4.188,127,8.221,166,4.773,299,8.202,559,6.833,612,7.741,821,8.486,823,5.222,1348,12.352,1349,7.372,1361,8.983,1362,8.983,1363,7.741,1364,8.983,1365,8.983,1366,8.234,1367,8.983,1368,8.983,1369,8.983,1370,8.983]],["keywords/288",[]],["title/289",[41,254.297,60,264.815,72,304.251]],["content/289",[41,4.253,43,11.032,70,6.077,1030,8.874,1267,11.032,1349,9.877,1360,10.371,1363,10.371,1366,11.032,1371,9.483,1372,12.035,1373,12.035,1374,12.035,1375,7.719,1376,12.035,1377,12.035,1378,12.035]],["keywords/289",[]],["title/290",[1379,1523.181]],["content/290",[480,13.865,481,14.362,823,10.596,1380,18.227]],["keywords/290",[]],["title/291",[58,485.4]],["content/291",[11,1.533,23,1.463,41,1.399,58,3.721,60,3.108,70,4.46,75,2.127,108,6.18,152,2.908,154,3.51,203,2.425,210,2.942,244,7.49,245,3.735,276,2.978,294,2.725,353,3.579,408,6.603,480,6.921,481,11.899,482,8.34,483,10.704,512,3.824,572,2.28,656,6.358,749,4.492,752,4.891,823,6.789,1166,3.824,1167,4.716,1332,4.035,1381,9.099,1382,5.473,1383,5.473,1384,5.473,1385,5.473,1386,6.209,1387,5.017,1388,5.473,1389,4.163,1390,5.473,1391,5.473,1392,5.473,1393,5.017,1394,5.473,1395,9.099,1396,9.099,1397,9.099,1398,5.473]],["keywords/291",[]],["title/292",[1399,1523.181]],["content/292",[10,8.102,72,4.717,82,12.154,303,8.498,417,14.14,752,8.292,1044,10.087,1400,14.14,1401,15.426,1402,11.374]],["keywords/292",[]],["title/293",[30,573.163]],["content/293",[37,4.773,60,3.203,83,6.997,91,4.839,96,7.972,558,7.1,609,9.877,614,11.032,735,6.898,797,7.209,821,7.579,1044,10.882,1400,11.032,1403,11.032,1404,12.035,1405,12.035,1406,12.035,1407,12.035,1408,11.032]],["keywords/293",[]],["title/294",[41,254.297,60,264.815,72,304.251]],["content/294",[41,4.156,70,4.801,572,6.774,1044,10.632,1409,20.284,1410,16.259,1411,16.259]],["keywords/294",[]],["title/295",[1412,1523.181]],["content/295",[5,4.404,29,6.059,36,8.039,50,6.879,67,5.498,150,12.382,151,10.401,555,10.082,588,10.705,731,7.44,1413,11.783]],["keywords/295",[]],["title/296",[30,573.163]],["content/296",[60,4.709,588,10.437,731,11.624,1414,17.691]],["keywords/296",[]],["title/297",[1074,671.636,1415,887.461]],["content/297",[]],["keywords/297",[]],["title/298",[6,303.769,94,270.201,1416,695.854,1417,847.889]],["content/298",[1,3.079,5,4.652,6,3.535,11,2.763,12,5.505,23,2.638,36,4.371,37,3.913,70,5.555,78,4.683,85,4.444,96,4.726,113,7.073,186,3.621,205,7.422,218,3.86,568,4.141,703,6.106,1416,8.097,1418,8.502,1419,8.097,1420,9.044,1421,9.866,1422,9.044,1423,9.866,1424,9.044,1425,9.866]],["keywords/298",[]],["title/299",[6,303.769,7,350.695,94,270.201,1052,435.64]],["content/299",[1,5.194,5,3.876,7,4.978,11,4.661,49,9.155,94,5.303,113,8.628,140,5.765,239,7.719,302,8.034,332,6.548,547,9.483,1039,8.409,1052,8.55,1426,9.155,1427,10.371,1428,9.877]],["keywords/299",[]],["title/300",[185,766.292]],["content/300",[94,5.638,300,13.457,1098,12.683,1429,16.216,1430,15.245]],["keywords/300",[]],["title/301",[473,639.298]],["content/301",[]],["keywords/301",[]],["title/302",[211,384.174]],["content/302",[1,3.996,5,5.591,6,4.587,9,9.439,10,6.724,11,3.586,29,5.672,152,6.802,161,4.67,211,4.379,473,5.373,1332,9.439,1371,10.087,1431,11.735,1432,11.735,1433,11.032]],["keywords/302",[]],["title/303",[151,873.085]],["content/303",[1,4.206,5,5.208,11,2.516,18,3.917,36,3.98,94,2.863,140,4.303,150,11.036,151,9.27,152,8.592,153,5.971,161,3.277,196,4.773,199,6.277,236,3.887,457,4.519,473,3.77,495,8.339,576,6.277,671,5.762,774,6.277,918,7.078,1286,6.13,1371,7.078,1434,6.623,1435,7.741,1436,6.13]],["keywords/303",[]],["title/304",[190,1123.064]],["content/304",[1,3.316,2,5.429,5,5.376,7,2.736,11,1.853,18,2.885,25,2.489,29,4.707,127,3.363,140,5.089,150,7.249,152,3.515,161,2.413,164,6.377,179,3.691,183,5.7,184,4.742,185,3.328,187,5.212,285,4.094,349,5.429,473,4.459,495,4.094,516,5.212,555,4.877,578,4.243,593,5.429,624,4.622,737,5.032,780,4.514,812,4.416,1057,4.326,1060,4.622,1065,5.212,1102,5.7,1286,4.514,1375,4.243,1434,4.877,1437,6.615,1438,6.615,1439,6.615,1440,6.615,1441,6.615,1442,6.064,1443,6.615,1444,6.064,1445,6.615,1446,6.615,1447,5.429,1448,6.064,1449,6.064]],["keywords/304",[]],["title/305",[681,809.262]],["content/305",[1,2.639,5,2.027,7,1.474,11,1.763,18,1.554,19,1.403,20,2.489,25,2.368,29,2.789,36,2.789,61,2.071,62,2.43,63,3.77,64,4.78,78,1.691,91,1.432,94,2.694,125,1.661,127,1.811,132,4.344,138,7.285,140,1.707,150,4.295,151,4.846,154,2.285,161,1.3,169,1.591,186,1.308,194,2.014,203,1.579,208,1.618,210,1.915,211,0.899,219,2.285,220,2.554,228,1.661,258,2.924,292,1.811,314,2.33,332,1.939,407,2.014,433,2.924,473,1.495,478,3.608,516,2.807,653,2.378,655,2.489,681,6.191,711,2.71,737,2.71,753,2.924,811,13.849,812,6.812,861,2.168,1060,2.489,1429,3.266,1436,2.431,1450,3.563,1451,3.266,1452,3.563,1453,3.563,1454,2.924,1455,3.563,1456,5.769,1457,3.563,1458,3.07,1459,3.563,1460,3.563,1461,3.563,1462,3.563,1463,3.563,1464,3.07,1465,3.563,1466,3.266,1467,3.563,1468,3.266,1469,3.563,1470,3.266,1471,3.563,1472,3.563,1473,3.563,1474,3.563,1475,3.563,1476,3.563,1477,3.563,1478,3.563,1479,3.563,1480,3.563,1481,3.563,1482,2.924,1483,3.563,1484,3.266]],["keywords/305",[]],["title/306",[1,475.405]],["content/306",[]],["keywords/306",[]],["title/307",[1485,1523.181]],["content/307",[1,2.805,2,4.425,4,2.209,6,3.715,7,1.239,9,3.976,10,4.72,11,2.517,12,1.672,22,2.934,35,1.372,66,2.459,67,1.204,79,3.68,86,1.767,94,1.718,96,3.522,136,1.338,140,1.435,149,1.694,151,1.717,159,1.672,166,1.592,178,2.746,179,1.672,203,1.327,207,2.459,208,1.361,210,1.61,211,0.756,212,1.921,217,1.823,234,2.581,236,2.333,285,1.854,311,2.581,429,1.767,445,1.886,506,2.36,507,3.181,541,2.093,563,0.907,575,1.449,577,2.36,588,3.181,608,4.249,700,2.279,752,1.61,767,2.279,781,2.459,794,2.044,797,1.794,1038,1.854,1065,2.36,1069,2.746,1072,2.746,1074,8.358,1099,4.425,1192,2.093,1273,2.581,1486,2.581,1487,2.996,1488,2.996,1489,2.581,1490,2.996,1491,7.744,1492,2.996,1493,2.996,1494,2.996,1495,2.996,1496,10.369,1497,7.353,1498,5.392,1499,2.279,1500,2.459,1501,4.646,1502,2.996,1503,2.36,1504,2.996,1505,6.74,1506,5.392,1507,2.996,1508,2.996,1509,6.336,1510,2.996,1511,2.746,1512,8.987,1513,6.74,1514,2.746,1515,2.459,1516,2.581,1517,2.996,1518,2.746,1519,2.996,1520,2.996,1521,2.996,1522,2.996,1523,2.996,1524,2.996,1525,2.996,1526,2.746,1527,2.746,1528,2.746,1529,1.921,1530,1.959,1531,2.459,1532,2.746,1533,2.581,1534,2.581,1535,2.996,1536,2.996,1537,2.746,1538,2.996,1539,2.996,1540,2.996,1541,2.996,1542,2.459]],["keywords/307",[]],["title/308",[6,431.222,56,599.395]],["content/308",[1,2.409,6,4.299,7,3.192,11,2.161,22,4.199,35,3.535,67,3.103,118,4.008,196,4.1,203,5.316,210,4.149,228,3.597,238,6.081,293,4.199,310,5.69,507,7.079,588,4.553,692,4.553,797,4.623,1074,9.267,1180,7.074,1491,6.65,1509,6.65,1518,10.999,1528,7.074,1530,5.046,1537,7.074,1543,7.074,1544,7.717,1545,7.717,1546,7.717,1547,7.717,1548,7.717,1549,7.717,1550,7.717,1551,7.717,1552,7.717,1553,6.65,1554,7.717,1555,6.333,1556,5.87,1557,6.65]],["keywords/308",[]],["title/309",[1558,1103.286,1559,1203.639]],["content/309",[1,5.158,6,1.783,7,2.058,18,3.663,22,4.571,35,2.279,67,2,94,1.586,103,2.556,106,4.271,118,2.584,147,3.254,180,3.321,196,2.644,203,2.205,208,2.26,210,2.675,236,3.635,292,2.529,386,4.288,507,6.432,555,3.669,558,4.956,588,4.956,766,2.584,1000,3.395,1038,3.079,1074,6.084,1491,4.288,1501,7.239,1509,4.288,1526,4.561,1530,3.254,1531,6.894,1543,4.561,1556,3.785,1558,4.561,1560,12.81,1561,4.976,1562,4.561,1563,3.395,1564,4.288,1565,4.288,1566,4.976,1567,4.976,1568,4.976,1569,4.976,1570,10.902,1571,4.976,1572,4.976,1573,4.976,1574,4.561,1575,4.976,1576,4.976,1577,8.401,1578,4.976,1579,4.976,1580,4.976,1581,4.976,1582,4.561,1583,4.561,1584,4.976,1585,4.976,1586,4.976,1587,8.401,1588,4.561,1589,4.976]],["keywords/309",[]],["title/310",[703,942.591]],["content/310",[]],["keywords/310",[]],["title/311",[816,1250.059]],["content/311",[1,5.215,37,6.626,186,6.133,473,7.013,1533,14.399,1590,16.71,1591,16.71]],["keywords/311",[]],["title/312",[60,320.369,639,987.814]],["content/312",[5,5.535,60,4.574,154,11.023,294,8.559,749,14.105,1592,17.186]],["keywords/312",[]],["title/313",[60,320.369,228,561.075]],["content/313",[5,5.87,154,11.69,228,8.496,1593,18.227]],["keywords/313",[]],["title/314",[60,320.369,1594,1203.639]],["content/314",[5,5.236,37,6.448,151,9.319,190,11.988,211,4.101,473,6.824,558,9.592,681,8.638]],["keywords/314",[]],["title/315",[766,791.174]],["content/315",[11,2.763,37,3.913,70,6.178,73,4.302,84,4.64,185,4.964,186,3.621,211,2.488,473,6.063,662,6.328,663,6.894,731,7.86,752,5.304,799,6.328,1434,10.651,1533,8.502,1595,7.774,1596,12.448,1597,8.502,1598,9.044,1599,8.502,1600,9.866,1601,9.866]],["keywords/315",[]],["title/316",[32,537.66,86,710.09]],["content/316",[1,4.941,5,5.099,11,4.434,37,6.278,39,12.042,86,11.768,348,11.673,801,14.511]],["keywords/316",[]],["title/317",[108,546.694,1602,1203.639]],["content/317",[22,5.458,23,2.682,36,4.444,37,3.978,58,4.659,109,6.182,110,5.21,114,8.899,127,5.099,140,4.805,161,3.659,163,6.316,164,7.004,196,5.329,205,5.154,457,7.356,563,3.037,689,5.099,731,5.458,811,9.977,812,6.696,813,7.63,814,7.009,1235,6.845,1375,6.433]],["keywords/317",[]],["title/318",[108,546.694,1603,1203.639]],["content/318",[11,3.83,36,6.059,37,5.423,58,4.358,109,5.782,110,7.103,114,8.323,161,6.619,202,5.05,563,5.493,689,6.951,811,9.331,1030,10.082]],["keywords/318",[]],["title/319",[108,546.694,1604,1103.286]],["content/319",[23,2.823,36,4.678,37,4.187,58,4.835,94,3.365,114,6.426,147,6.904,149,5.97,163,6.649,164,5.058,165,10.878,467,5.891,568,6.368,689,5.367,752,5.676,817,7.205,818,7.569,969,12.453,1090,6.772,1563,7.205,1595,8.319,1605,9.098,1606,10.558,1607,8.665]],["keywords/319",[]],["title/320",[60,320.369,1608,1103.286]],["content/320",[1,1.515,5,2.65,6,1.739,11,3.952,36,2.151,37,3.263,38,3.241,46,3.241,49,6.259,58,3.413,67,3.308,70,2.43,82,3.826,94,1.547,109,2.053,113,5.899,125,2.263,127,2.468,151,2.783,154,3.114,158,2.864,159,2.709,161,3.002,164,6.04,169,6.303,170,3.313,186,1.782,232,3.481,447,2.709,448,4.372,495,7.803,507,2.864,518,2.745,544,2.675,558,2.864,563,2.491,621,4.45,622,8.81,653,3.241,662,3.114,738,2.304,766,2.522,772,3.241,865,3.313,1000,5.615,1090,3.114,1100,3.58,1235,5.615,1426,3.693,1436,5.615,1444,4.45,1464,4.184,1595,3.826,1609,3.481,1610,3.985,1611,4.855,1612,4.855,1613,7.542,1614,4.855,1615,4.855,1616,3.241,1617,4.45,1618,4.184]],["keywords/320",[]],["title/321",[60,320.369,731,654.906]],["content/321",[1,3.079,5,3.177,11,2.763,83,5.736,170,6.733,185,4.964,186,3.621,286,7.073,457,8.598,544,5.435,547,7.774,558,5.821,575,6.986,708,5.91,731,10.894,783,7.073,784,8.097,813,7.505,971,7.073,1596,12.448,1597,8.502,1607,8.097,1619,9.866,1620,9.866]],["keywords/321",[]],["title/322",[60,320.369,1621,987.814]],["content/322",[11,3.901,52,5.387,65,3.272,70,5.424,73,4.891,109,2.995,140,3.392,163,7.064,164,5.373,185,3.563,186,4.117,205,5.763,568,4.708,642,4.833,662,4.542,663,4.948,731,6.103,797,8.343,799,8.933,847,5.077,969,5.812,1358,6.491,1375,4.542,1596,12.002,1597,9.666,1621,5.812,1622,12.767,1623,15.842,1624,7.082,1625,7.082]],["keywords/322",[]],["title/323",[108,546.694,1626,1103.286]],["content/323",[1,3.415,11,4.36,20,7.645,23,2.926,25,4.117,70,4.597,74,6.659,159,6.106,160,5.622,186,4.016,465,8.469,708,6.554,805,7.467,1415,8.067,1627,11.477,1628,9.429,1629,10.942,1630,10.029,1631,10.029,1632,10.942,1633,9.429,1634,10.029]],["keywords/323",[]],["title/324",[108,546.694,1635,1103.286]],["content/324",[19,6.77,58,5.477,180,11.473,194,9.718,861,10.46,1636,17.186]],["keywords/324",[]],["title/325",[19,474.098,75,467.811]],["content/325",[19,6.582,58,5.325,180,11.155,194,9.448,276,9.092,861,10.17,1637,12.32]],["keywords/325",[]],["title/326",[60,320.369,1638,1203.639]],["content/326",[5,4.037,50,6.307,65,5.792,70,5.754,161,4.573,276,6.821,516,9.878,780,8.554,971,8.987,1052,6.441,1389,9.536,1639,11.491,1640,10.288,1641,17.114,1642,12.536,1643,10.802]],["keywords/326",[]],["title/327",[60,320.369,1447,987.814]],["content/327",[5,4.037,50,6.307,65,5.792,70,5.754,161,4.573,276,6.821,780,11.678,971,8.987,1052,6.441,1389,9.536,1639,11.491,1640,10.288,1644,14.747,1645,12.536,1646,12.536]],["keywords/327",[]],["title/328",[75,467.811,1647,1203.639]],["content/328",[12,9.072,37,6.448,75,6.319,208,7.385,292,8.265,533,9.319,672,8.354,673,8.54]],["keywords/328",[]],["title/329",[108,546.694,1648,1203.639]],["content/329",[196,9.684,556,11.919,689,9.266,811,12.438]],["keywords/329",[]],["title/330",[108,546.694,1649,1203.639]],["content/330",[7,5.656,23,3.656,104,7.732,106,6.951,109,5.782,114,8.323,118,9.425,459,10.082,553,12.534,556,13.317,689,6.951,811,9.331]],["keywords/330",[]],["title/331",[75,467.811,1650,1103.286]],["content/331",[25,4.193,70,5.877,73,4.859,159,6.218,163,7.018,164,5.339,185,5.606,186,4.09,292,8.016,448,5.921,706,10.215,722,10.215,734,15.77,1651,10.215,1652,11.144,1653,8.781,1654,9.603,1655,11.144,1656,11.144]],["keywords/331",[]],["title/332",[211,303.58,473,505.182]],["content/332",[5,5.236,11,4.554,29,7.204,37,6.448,73,7.089,186,5.967,211,4.101,473,6.824]],["keywords/332",[]],["title/333",[60,320.369,1657,1203.639]],["content/333",[161,6.857,211,4.741,821,11.836]],["keywords/333",[]],["title/334",[32,537.66,1658,1203.639]],["content/334",[161,6.857,211,4.741,254,11.089]],["keywords/334",[]],["title/335",[32,537.66,1659,1203.639]],["content/335",[161,6.857,211,4.741,411,11.259]],["keywords/335",[]],["title/336",[32,537.66,1660,1203.639]],["content/336",[161,6.649,211,4.597,254,10.753,839,12.438]],["keywords/336",[]],["title/337",[32,537.66,1661,1203.639]],["content/337",[161,6.649,211,4.597,411,10.918,839,12.438]],["keywords/337",[]],["title/338",[32,537.66,1662,1203.639]],["content/338",[161,6.649,211,4.597,254,10.753,841,13.439]],["keywords/338",[]],["title/339",[32,537.66,1663,1203.639]],["content/339",[161,6.649,211,4.597,411,10.918,841,13.439]],["keywords/339",[]],["title/340",[32,537.66,1664,1103.286]],["content/340",[161,6.454,211,4.462,429,10.437,430,12.362,432,13.94]],["keywords/340",[]],["title/341",[32,537.66,1665,1103.286]],["content/341",[161,6.454,211,4.462,429,10.437,661,13.457,844,12.683]],["keywords/341",[]],["title/342",[108,546.694,1666,1103.286]],["content/342",[94,5.638,161,6.454,211,4.462,575,8.555,846,14.519]],["keywords/342",[]],["title/343",[108,546.694,1667,1103.286]],["content/343",[5,2.203,10,3.593,11,3.813,14,5.39,36,3.031,37,2.713,46,4.566,57,4.036,58,2.18,114,4.163,161,3.981,170,4.668,196,3.634,202,2.526,211,4.788,275,5.895,292,5.547,299,4.163,418,9.403,467,7.596,473,5.714,478,3.921,567,3.107,689,3.477,812,7.284,814,4.78,829,5.203,849,13.339,1286,4.668,1668,6.841,1669,6.27,1670,6.841,1671,6.841,1672,6.841,1673,6.27,1674,6.27,1675,5.895,1676,5.895]],["keywords/343",[]],["title/344",[108,546.694,1677,1203.639]],["content/344",[434,12.438,467,10.171,473,7.65,824,12.167]],["keywords/344",[]],["title/345",[60,320.369,1678,1103.286]],["content/345",[5,4.404,23,5.445,49,10.402,96,6.551,205,7.026,245,9.331,568,5.739,849,10.082,1152,10.775,1166,9.555,1424,12.534,1679,13.674,1680,11.222]],["keywords/345",[]],["title/346",[108,546.694,1681,1203.639]],["content/346",[436,13.133,467,10.488,473,7.889]],["keywords/346",[]],["title/347",[108,546.694,1682,1203.639]],["content/347",[6,6.338,211,4.462,588,10.437,770,11.569,856,12.362]],["keywords/347",[]],["title/348",[108,546.694,1683,1203.639]],["content/348",[467,10.488,473,7.889,829,14.297]],["keywords/348",[]],["title/349",[108,546.694,1684,1203.639]],["content/349",[5,6.053,831,13.858,1244,14.297]],["keywords/349",[]],["title/350",[108,546.694,1685,1203.639]],["content/350",[36,7.615,37,6.816,110,8.927,140,8.233,211,4.335,851,14.105]],["keywords/350",[]],["title/351",[108,546.694,1686,1203.639]],["content/351",[6,5.825,11,4.554,109,6.875,140,7.789,211,4.101,812,10.853,1687,16.259,1688,16.259]],["keywords/351",[]],["title/352",[108,546.694,1689,1203.639]],["content/352",[7,5.787,25,5.265,34,8.659,51,9.34,92,9.34,93,6.522,94,4.459,109,5.917,110,7.268,112,11.025,478,8.02,479,10.317,484,12.826,1363,12.057]],["keywords/352",[]],["title/353",[108,546.694,1690,1203.639]],["content/353",[36,5.924,37,7.089,110,6.945,211,3.372,254,7.888,411,8.009,430,9.343,457,6.727,490,9.585,699,9.124,770,8.744,803,8.138,816,10.973,831,9.859,844,9.585]],["keywords/353",[]],["title/354",[60,320.369,1691,1203.639]],["content/354",[10,6.078,15,8.803,36,7.175,37,4.589,60,3.08,109,6.847,292,5.883,478,9.282,577,9.118,752,8.705,775,7.422,814,11.315,858,12.759,1468,10.608,1692,10.608,1693,11.572,1694,10.608]],["keywords/354",[]],["title/355",[473,505.182,681,639.49]],["content/355",[5,5.236,11,4.554,37,6.448,73,7.089,179,9.072,186,5.967,473,6.824,681,8.638]],["keywords/355",[]],["title/356",[32,537.66,1695,1203.639]],["content/356",[211,4.741,254,11.089,681,9.986]],["keywords/356",[]],["title/357",[32,537.66,1696,1203.639]],["content/357",[211,4.741,411,11.259,681,9.986]],["keywords/357",[]],["title/358",[60,320.369,1697,1203.639]],["content/358",[25,5.66,61,8.744,62,5.807,63,9.01,64,8.504,103,7.728,194,8.504,473,6.313,681,10.259,861,9.154]],["keywords/358",[]],["title/359",[85,686.049]],["content/359",[11,4.814,37,6.816,73,7.494,85,7.741,186,6.308,218,6.724]],["keywords/359",[]],["title/360",[60,320.369,1698,1203.639]],["content/360",[5,5.099,23,4.233,96,7.584,222,9.739,242,9.635,1036,11.062,1037,14.511,1699,15.831]],["keywords/360",[]],["title/361",[60,320.369,1700,1203.639]],["content/361",[5,6.053,205,9.657,572,7.831]],["keywords/361",[]],["title/362",[60,320.369,1701,1103.286]],["content/362",[22,6.548,23,4.45,70,5.633,73,5.248,94,3.835,148,6.63,185,6.055,186,4.417,236,5.207,778,10.882,1426,9.155,1702,11.032,1703,13.112,1704,8.874,1705,11.032,1706,12.035]],["keywords/362",[]],["title/363",[60,320.369,1707,1203.639]],["content/363",[5,6.053,19,7.403,572,7.831]],["keywords/363",[]],["title/364",[60,320.369,1708,1103.286]],["content/364",[19,4.74,23,4.45,70,5.633,73,5.248,94,3.835,185,6.055,186,4.417,299,7.325,556,7.87,568,5.051,778,7.87,1077,6.898,1426,9.155,1702,11.032,1703,13.112,1709,12.035,1710,12.035]],["keywords/364",[]],["title/365",[60,320.369,1711,1203.639]],["content/365",[1,5.689,12,10.171,136,8.142,525,10.753]],["keywords/365",[]],["title/366",[60,320.369,1067,1103.286]],["content/366",[1,5.075,11,4.554,164,7.789,228,7.579,236,7.034,702,13.842,1066,12.367]],["keywords/366",[]],["title/367",[60,320.369,1068,1037.186]],["content/367",[1,5.075,11,4.554,169,7.263,228,7.579,236,7.034,702,13.842,1066,12.367]],["keywords/367",[]],["title/368",[60,320.369,1712,1203.639]],["content/368",[11,2.634,12,5.247,23,3.728,70,5.797,73,4.101,109,3.977,185,4.731,186,3.452,192,7.153,520,5.82,653,9.308,654,8.781,662,6.032,663,6.571,811,6.417,1389,7.153,1703,7.41,1713,13.944,1714,13.944,1715,9.404,1716,9.404,1717,8.62,1718,13.944,1719,9.404,1720,9.404]],["keywords/368",[]],["title/369",[75,467.811,1721,1103.286]],["content/369",[6,4.899,7,5.656,29,6.059,62,5.28,180,9.128,194,7.732,218,5.35,689,6.951,856,9.555,861,8.323,1052,9.323,1402,10.082,1565,11.783,1722,12.534]],["keywords/369",[]],["title/370",[60,320.369,1723,1203.639]],["content/370",[11,3.919,56,6.968,62,5.403,109,5.917,568,5.873,572,7.675,625,6.899,794,9.548,1074,11.493,1724,13.583]],["keywords/370",[]],["title/371",[60,320.369,1725,1203.639]],["content/371",[62,7.577,94,4.916,218,6.035,303,8.498,486,11.374,567,7.006,625,7.605,1033,9.894,1724,11.374]],["keywords/371",[]],["title/372",[60,320.369,1726,1203.639]],["content/372",[29,8.987,62,7.832,179,9.072,218,6.361,1074,9.072,1724,11.988]],["keywords/372",[]],["title/373",[60,320.369,1727,1203.639]],["content/373",[35,6.264,62,7.006,94,4.358,148,9.996,218,5.35,228,6.374,236,5.916,625,6.742,649,9.555,766,9.425,1074,7.63,1724,10.082]],["keywords/373",[]],["title/374",[60,320.369,1728,1203.639]],["content/374",[23,4.512,62,4.742,94,3.913,103,6.31,148,6.765,218,4.805,236,5.313,250,8.804,572,5.116,599,8.031,625,8.32,778,8.031,1044,8.031,1074,6.852,1724,9.054,1729,9.676,1730,9.676,1731,11.256]],["keywords/374",[]],["title/375",[60,320.369,1732,1103.286]],["content/375",[36,5.031,37,4.503,65,5.246,70,4.719,85,5.114,109,6.757,167,7.934,185,5.712,186,4.167,218,4.442,222,5.544,236,6.913,572,4.731,772,7.58,1043,11.455,1044,7.425,1733,15.979,1734,11.354,1735,11.354]],["keywords/375",[]],["title/376",[58,317.056,211,250.937,752,534.844]],["content/376",[10,7.183,58,5.782,61,7.95,73,5.963,211,3.449,625,6.742,703,8.462,799,8.771,865,9.331,1386,12.382,1418,11.783,1736,13.674,1737,13.674]],["keywords/376",[]],["title/377",[60,320.369,1738,1203.639]],["content/377",[5,5.236,96,7.789,625,8.016,912,13.343,1386,11.095,1739,16.259,1740,13.343,1741,16.259]],["keywords/377",[]],["title/378",[60,320.369,1742,1203.639]],["content/378",[11,3.371,23,3.218,36,5.332,109,5.089,242,7.325,703,7.448,772,8.034,783,8.628,823,11.964,1152,9.483,1166,11.628,1678,15.253,1729,9.483,1743,12.035,1744,12.035,1745,9.877]],["keywords/378",[]],["title/379",[60,320.369,1515,987.814]],["content/379",[5,5.535,6,6.157,625,8.474,1386,11.728,1740,14.105,1746,17.186]],["keywords/379",[]],["title/380",[60,320.369,472,987.814]],["content/380",[5,4.844,23,4.022,312,12.344,472,12.344,625,9.52,1076,10.782,1386,10.264,1740,12.344,1747,15.04,1748,15.04]],["keywords/380",[]],["title/381",[60,320.369,1749,1103.286]],["content/381",[70,5.476,73,3.595,185,4.148,345,4.662,625,4.065,661,6.272,1386,5.627,1419,6.767,1740,6.767,1749,7.558,1750,8.245,1751,7.558,1752,8.245,1753,7.558,1754,8.245,1755,8.245,1756,8.245,1757,8.245,1758,8.245,1759,8.245,1760,15.348,1761,8.245,1762,8.245,1763,8.245,1764,8.245,1765,8.245,1766,7.558,1767,8.245,1768,8.245,1769,8.245,1770,8.245,1771,8.245,1772,8.245,1773,8.245,1774,8.245,1775,8.245,1776,8.245,1777,8.245]],["keywords/381",[]],["title/382",[217,927.048]],["content/382",[1,4.032,5,3.768,7,4.839,10,1.882,11,1.772,12,4.739,16,2.569,17,2.643,18,1.563,19,3.346,25,3.196,29,2.803,35,1.642,65,1.656,118,1.862,127,3.216,136,3.794,140,1.717,150,7.983,151,3.627,152,1.904,159,3.53,160,1.841,161,3.739,164,1.717,165,4.536,169,3.794,186,3.117,190,2.643,202,2.336,205,3.251,208,1.628,214,3.285,217,6.237,238,2.824,310,4.665,335,2.504,397,5.183,461,2.643,465,1.95,473,1.504,507,2.114,533,2.054,563,3.103,576,2.504,625,3.119,681,1.904,711,2.726,741,3.285,752,1.927,814,4.421,817,2.446,995,3.088,1334,3.088,1426,4.813,1434,2.643,1435,3.088,1563,2.446,1627,2.643,1653,6.692,1654,3.088,1778,8.494,1779,3.584,1780,10.081,1781,3.584,1782,8.494,1783,5.452,1784,2.941,1785,3.088,1786,3.285,1787,2.824,1788,2.941,1789,3.285,1790,3.584]],["keywords/382",[]],["title/383",[35,455.76,239,638.12,1791,695.182]],["content/383",[]],["keywords/383",[]],["title/384",[16,713.244,1792,911.968,1793,857.33]],["content/384",[1,3.019,6,1.185,7,1.368,11,3.108,15,4.483,16,2.372,17,2.439,22,4.336,23,2.131,35,6.522,65,2.723,67,4.461,78,1.57,96,1.585,101,1.871,118,1.718,136,1.478,140,4.633,141,2.372,149,5.469,152,4.234,153,3.531,158,3.477,186,2.163,194,1.871,196,5.139,199,4.118,202,1.222,203,1.466,208,1.503,210,1.778,232,4.225,242,2.014,285,2.047,293,1.8,294,1.648,305,1.478,310,2.439,314,3.854,461,2.439,519,5.211,544,1.823,549,2.047,563,1.784,651,2.258,671,2.122,700,6.062,725,2.258,752,1.778,772,2.208,1049,2.715,1057,3.854,1090,2.122,1098,4.225,1107,4.837,1108,2.607,1174,2.312,1375,5.111,1413,2.851,1415,5.876,1501,2.851,1505,3.033,1557,2.851,1583,3.033,1618,2.851,1788,2.715,1791,2.312,1792,3.033,1793,2.851,1794,3.308,1795,3.308,1796,5.402,1797,3.033,1798,7.969,1799,3.308,1800,3.308,1801,3.308,1802,3.033,1803,3.308,1804,3.308,1805,3.308,1806,2.715,1807,3.308,1808,3.033,1809,5.893,1810,3.033,1811,3.308,1812,3.308,1813,3.308,1814,3.308,1815,3.308,1816,5.402,1817,3.308,1818,3.033]],["keywords/384",[]],["title/385",[35,388.407,239,543.818,335,592.448,1791,592.448]],["content/385",[11,4.186,23,1.088,30,1.531,35,3.238,37,1.613,52,3.095,60,2.495,63,4.235,66,5.802,70,4.414,91,2.842,103,2.09,108,1.848,114,2.476,125,1.896,140,3.387,147,2.66,152,2.161,158,2.4,185,4.716,186,4.656,202,3.462,239,2.609,294,2.026,301,2.476,335,8.863,367,2.517,519,2.66,541,2.843,662,2.609,672,2.09,673,2.137,711,3.095,725,2.776,748,3.205,771,3.205,772,2.716,775,2.609,791,3.729,817,2.776,865,2.776,953,3.205,1090,2.609,1152,3.205,1161,3.205,1232,3.339,1375,4.534,1633,3.506,1637,3,1766,3.729,1787,3.205,1791,4.94,1796,3.729,1797,3.729,1810,8.593,1819,4.068,1820,4.068,1821,3.339,1822,4.068,1823,2.068,1824,3.729,1825,6.48,1826,4.068,1827,4.068,1828,4.068,1829,3.729,1830,3.729,1831,4.068,1832,4.068,1833,4.068,1834,4.068,1835,4.068,1836,4.068,1837,3.729,1838,3.729,1839,4.068,1840,4.068,1841,4.068,1842,3.729,1843,4.068,1844,4.068,1845,4.068,1846,4.068]],["keywords/385",[]],["title/386",[12,473.126,35,388.407,239,543.818,1791,592.448]],["content/386",[11,5.002,12,6.871,17,7.14,30,2.221,35,2.704,38,3.94,60,1.571,65,2.727,70,1.743,74,3.592,75,2.294,91,3.893,133,4.352,141,4.231,151,3.383,152,5.145,194,3.337,196,5.145,203,2.615,210,3.173,228,2.751,301,3.592,367,5.993,563,1.787,725,6.608,772,8.22,912,7.948,1033,3.785,1486,5.086,1704,4.352,1802,8.877,1830,5.41,1837,5.41,1838,13.061,1847,5.902,1848,5.902,1849,5.902,1850,5.902,1851,5.902,1852,5.902,1853,5.902,1854,5.41,1855,5.902,1856,5.086,1857,5.902,1858,5.902,1859,5.902,1860,4.844,1861,5.902,1862,5.902,1863,5.902,1864,5.902]],["keywords/386",[]],["title/387",[1865,1250.059]],["content/387",[]],["keywords/387",[]],["title/388",[46,803.489,1865,987.814]],["content/388",[1,4.941,46,10.568,467,8.834,1056,12.992,1513,14.511,1555,12.992,1556,12.042,1865,12.992,1866,12.474]],["keywords/388",[]],["title/389",[46,664.158,1553,857.33,1867,911.968]],["content/389",[149,6.805,293,6.548,467,6.716,693,9.877,922,10.371,1074,6.716,1076,8.628,1553,14.34,1564,10.371,1784,9.877,1865,9.877,1867,17.484,1868,9.877,1869,12.035,1870,12.035,1871,9.877,1872,8.874,1873,11.032]],["keywords/389",[]],["title/390",[6,431.222,203,533.295]],["content/390",[]],["keywords/390",[]],["title/391",[196,450.481,1555,695.854,1556,644.965,1563,578.597]],["content/391",[1,4.114,12,4.867,85,3.929,161,3.182,196,7.003,236,3.774,563,3.99,567,9.081,738,6.256,774,6.095,1033,5.595,1038,5.398,1039,6.095,1098,6.253,1433,7.517,1516,11.358,1530,5.704,1555,10.817,1556,10.026,1563,8.995,1866,6.873,1874,8.723,1875,8.723,1876,8.723,1877,8.723,1878,8.723,1879,8.723]],["keywords/391",[]],["title/392",[1436,1039.415]],["content/392",[]],["keywords/392",[]],["title/393",[86,586.955,1436,678.93,1627,733.569]],["content/393",[1,2.843,5,2.933,6,0.757,7,4.514,11,1.917,16,4.905,18,2.389,20,1.476,21,1.607,25,2.062,56,1.052,65,2.532,79,1.442,86,4.037,113,1.515,135,1.476,136,3.057,140,1.012,150,2.674,151,2.246,152,2.082,153,2.428,159,4.488,160,2.815,161,1.999,169,4.069,186,0.775,202,1.447,208,1.78,211,0.533,217,1.286,250,2.809,301,2.385,302,1.41,333,1.821,397,1.736,447,1.179,448,2.911,450,1.821,457,1.063,461,4.04,473,1.645,478,1.211,495,2.425,507,1.246,516,1.665,544,1.164,563,2.072,575,1.022,608,4.318,617,1.286,622,2.738,625,1.042,649,2.738,670,1.665,681,1.123,689,1.074,699,1.442,731,1.15,737,5.205,752,1.136,766,1.097,803,1.286,813,4.168,814,1.476,818,2.809,861,1.286,862,1.821,874,2.889,1000,1.442,1052,2.013,1060,3.829,1065,1.665,1090,1.355,1100,2.889,1161,1.665,1191,1.734,1235,4.669,1286,1.442,1325,1.607,1371,1.665,1428,1.734,1434,1.558,1436,5.488,1456,1.937,1464,1.821,1499,4.168,1534,3.377,1563,2.674,1564,1.821,1617,1.937,1627,1.558,1669,1.937,1780,1.821,1787,1.665,1788,1.734,1793,1.821,1806,1.734,1868,1.734,1880,2.113,1881,1.937,1882,2.113,1883,3.919,1884,1.821,1885,2.113,1886,1.937,1887,6.272,1888,2.113,1889,3.919,1890,2.113,1891,2.113,1892,13.43,1893,1.821,1894,3.919,1895,1.558,1896,3.592,1897,2.113,1898,1.355,1899,2.113,1900,2.113,1901,1.937,1902,2.113,1903,2.113,1904,2.113,1905,2.113,1906,2.113,1907,2.113,1908,2.113,1909,6.272,1910,1.821,1911,3.216,1912,2.113,1913,1.937,1914,2.113,1915,2.113,1916,2.113,1917,2.113,1918,2.113,1919,2.113]],["keywords/393",[]],["title/394",[161,269.481,495,457.143,563,223.64,1286,504.101,1515,606.26]],["content/394",[1,3.12,5,1.426,6,2.725,7,1.831,16,3.174,18,3.316,19,1.744,25,1.666,65,3.514,86,2.612,103,2.275,104,2.503,105,2.955,106,2.25,147,2.895,153,1.961,159,2.47,160,3.907,161,4.873,169,1.978,180,2.955,186,1.625,194,2.503,196,2.352,199,3.093,203,1.961,219,6.412,220,3.174,234,3.815,334,3.021,386,3.815,465,4.138,495,8.267,549,2.74,563,4.416,624,6.986,628,3.488,648,3.633,711,3.367,738,2.101,794,3.021,865,5.19,918,3.488,1191,3.633,1192,3.093,1286,3.021,1325,3.367,1334,3.815,1436,8.096,1515,3.633,1563,3.021,1574,4.058,1609,3.174,1627,5.607,1785,3.815,1787,3.488,1860,3.633,1872,3.264,1887,4.058,1892,9.164,1893,3.815,1896,4.058,1909,4.058,1920,4.427,1921,4.427,1922,4.427,1923,6.971,1924,4.427,1925,4.058,1926,4.058,1927,4.427,1928,4.427,1929,4.427,1930,4.427,1931,4.427]],["keywords/394",[]],["title/395",[1349,816.52,1482,816.52,1873,911.968]],["content/395",[]],["keywords/395",[]],["title/396",[7,630.003]],["content/396",[]],["keywords/396",[]],["title/397",[23,181.605,35,177.985,75,151.011,82,306.144,125,181.117,568,163.075,588,229.22,748,306.144,1932,388.539,1933,356.145,1934,388.539]],["content/397",[7,5.452,11,2.443,29,3.865,52,6.635,62,5.089,65,6.091,78,4.14,94,2.78,132,6.772,140,4.179,179,4.867,186,3.202,228,6.144,329,7.159,332,4.746,345,4.932,541,6.095,630,6.635,708,5.225,738,4.14,844,6.253,1077,7.555,1098,6.253,1107,7.159,1211,4.434,1375,5.595,1933,7.996,1935,7.996,1936,7.996,1937,8.723,1938,11.358,1939,7.996,1940,7.159]],["keywords/397",[]],["title/398",[85,686.049]],["content/398",[]],["keywords/398",[]],["title/399",[50,268.088,70,157.372,125,248.405,161,194.394,624,372.345,625,262.734,630,405.351,1941,488.457]],["content/399",[11,3.18,29,5.031,50,5.712,125,5.293,161,4.142,180,7.58,194,6.42,202,5.901,305,5.072,307,11.455,332,6.178,458,9.318,475,7.934,530,6.508,624,7.934,625,5.598,752,6.104,780,7.748,861,6.91,1447,9.318,1926,10.408,1941,10.408]],["keywords/399",[]],["title/400",[25,200.522,132,273.794,147,348.476,305,238.038,672,273.794,1028,459.193,1821,437.334,1942,488.457]],["content/400",[6,2.451,11,1.916,23,1.829,40,6.27,62,5.256,65,3.161,119,9.087,125,3.189,132,6.994,185,3.441,186,2.511,194,6.17,210,3.677,218,5.326,233,4.566,301,4.163,305,4.874,332,5.937,345,6.17,458,5.614,461,5.044,572,2.85,575,3.308,672,5.607,738,5.179,797,4.098,805,4.668,861,6.641,1107,5.614,1132,4.904,1211,3.477,1898,4.387,1942,14.24,1943,6.841,1944,6.841,1945,6.27,1946,6.841,1947,6.27,1948,6.27,1949,6.841,1950,6.841]],["keywords/400",[]],["title/401",[6,356.445,7,411.508,239,638.12]],["content/401",[]],["keywords/401",[]],["title/402",[7,411.508,236,430.449,847,713.244]],["content/402",[]],["keywords/402",[]],["title/403",[1039,841.022,1951,987.814]],["content/403",[1,4.941,314,10.353,462,9.969,1039,11.062,1951,16.371,1952,13.642,1953,15.831,1954,11.062]],["keywords/403",[]],["title/404",[132,435.64,135,592.448,198,566.008,856,592.448]],["content/404",[1,1.167,6,3.146,11,1.047,25,1.407,62,2.536,63,2.24,65,1.728,70,5.515,132,7.799,136,1.671,140,1.791,144,6.021,155,3.428,157,4.065,186,1.373,198,7.051,211,2.215,212,2.399,299,2.276,326,4.843,332,2.035,335,2.613,361,3.428,408,2.115,467,2.087,655,9.257,661,2.845,669,4.482,717,5.175,730,2.681,856,4.589,920,3.223,1076,2.681,1332,2.757,1375,2.399,1413,3.223,1430,3.223,1503,2.947,1694,3.428,1730,2.947,1938,3.223,1940,7.208,1955,2.845,1956,3.74,1957,3.74,1958,3.428,1959,6.568,1960,10.563,1961,10.563,1962,6.568,1963,3.74,1964,3.74,1965,6.568,1966,3.74,1967,3.74,1968,3.74,1969,3.74,1970,3.74,1971,3.74,1972,3.74,1973,3.74,1974,6.568,1975,6.568,1976,3.74,1977,3.74,1978,3.223,1979,3.74,1980,8.783,1981,3.74,1982,3.74,1983,6.568,1984,3.74,1985,3.74,1986,3.74,1987,3.74,1988,3.74,1989,3.74]],["keywords/404",[]],["title/405",[1,310.527,7,411.508,198,664.158]],["content/405",[1,2.723,6,3.125,7,3.608,11,2.443,29,5.84,58,2.78,65,4.031,73,3.804,85,3.929,103,4.482,132,4.482,164,4.179,180,5.823,186,3.202,194,4.932,222,6.435,228,4.066,236,5.703,299,5.309,335,6.095,766,4.531,797,5.225,856,6.095,1060,6.095,1235,5.953,1281,12.082,1898,8.454,1948,7.996,1990,7.517,1991,8.723,1992,8.723,1993,12.082,1994,6.432,1995,8.723]],["keywords/405",[]],["title/406",[169,444.426,236,430.449,847,713.244]],["content/406",[1,5.334,6,3.535,18,4.302,25,3.713,94,3.144,132,7.422,135,6.894,159,8.061,160,7.422,169,6.453,285,6.106,303,5.435,462,6.213,486,7.275,507,5.821,568,4.141,575,4.771,1026,6.005,1039,10.094,1745,8.097,1951,11.855,1952,8.502,1954,6.894,1996,9.866]],["keywords/406",[]],["title/407",[94,317.056,101,562.552,625,490.535]],["content/407",[5,2.982,6,3.317,11,2.594,29,4.103,62,5.322,78,4.395,79,6.319,94,2.951,101,9.311,141,6.638,169,4.136,186,5.059,198,6.181,236,4.006,457,4.658,462,8.68,467,5.167,524,7.296,767,7.043,794,6.319,1039,9.632,1063,7.296,1272,7.979,1823,4.707,1997,9.259,1998,8.487,1999,9.259,2000,9.259,2001,9.259,2002,7.979]],["keywords/407",[]],["title/408",[101,861.244]],["content/408",[6,1.997,19,2.196,21,4.24,29,7.716,38,3.721,62,4.568,65,2.576,70,1.646,78,2.646,101,11.017,132,4.747,140,2.67,154,3.575,157,3.45,186,4.342,211,1.406,212,3.575,221,3.895,236,2.412,299,3.393,314,3.645,462,5.818,467,3.11,518,3.152,530,3.195,568,2.34,651,3.804,700,4.24,708,3.339,927,4.392,1026,9.284,1060,3.895,1063,4.392,1090,7.588,1235,3.804,1375,3.575,1433,4.803,1562,5.11,1563,3.804,1565,4.803,1954,3.895,1994,4.11,2003,5.574,2004,5.574,2005,8.999,2006,5.574,2007,5.11,2008,5.574,2009,5.574,2010,5.574]],["keywords/408",[]],["title/409",[67,340.894,101,479.417,184,607.84,293,461.341]],["content/409",[23,3.644,29,6.038,62,3.521,65,4.214,67,3.666,101,10.956,184,11.698,185,4.588,186,3.347,305,8.087,662,5.849,752,4.902,944,6.724,1026,8.295,1086,7.185,1090,8.741,1954,6.372,2005,6.937,2007,8.359,2011,9.119,2012,9.119,2013,12.492,2014,9.119]],["keywords/409",[]],["title/410",[568,417.58,1074,555.169,1415,733.569]],["content/410",[]],["keywords/410",[]],["title/411",[7,630.003]],["content/411",[7,3.364,22,8.28,78,3.861,94,3.983,101,8.605,120,6.675,136,5.582,158,4.799,161,2.967,169,3.633,236,5.407,507,4.799,563,4.607,578,5.217,624,5.683,692,4.799,766,4.225,769,5.683,794,5.551,1190,6.187,1286,5.551,1627,5.997,1898,5.217,1994,5.997,2015,8.134,2016,8.134,2017,8.134,2018,8.134,2019,8.134,2020,8.134,2021,8.134,2022,8.134,2023,8.134,2024,8.134,2025,8.134,2026,8.134]],["keywords/411",[]],["title/412",[136,537.66,169,537.66]],["content/412",[12,6.852,22,6.682,151,7.039,159,6.852,169,5.486,563,5.108,578,7.876,692,7.245,766,6.379,794,8.38,1052,6.31,1190,9.341,1898,7.876,1994,9.054,2027,12.28,2028,12.28,2029,12.28,2030,12.28,2031,12.28]],["keywords/412",[]],["title/413",[1542,987.814,2032,1203.639]],["content/413",[1,4.206,10,4.718,18,3.917,35,7.408,67,3.612,113,6.44,118,4.666,140,4.303,186,3.297,196,4.773,293,4.888,332,4.888,649,6.277,700,6.833,774,6.277,1038,5.559,1090,5.762,1098,6.44,1211,4.567,1542,7.372,1557,7.741,1784,7.372,1791,9.416,1860,7.372,2033,8.983,2034,8.983,2035,8.983,2036,8.983,2037,13.476,2038,8.983,2039,8.983,2040,8.983,2041,8.983]],["keywords/413",[]],["title/414",[726,987.814,1730,948.392]],["content/414",[]],["keywords/414",[]],["title/415",[5,320.422,236,430.449,324,911.968]],["content/415",[1,1.592,5,5.654,22,2.776,23,2.294,62,1.97,65,2.357,143,3.565,152,2.711,153,2.261,157,8.056,167,3.565,186,1.873,203,3.802,205,2.621,211,1.287,212,7.121,216,7.577,217,6.758,218,1.996,220,3.658,221,3.565,222,9.215,225,4.396,229,8.446,232,3.658,233,5.728,235,4.677,236,3.712,239,3.272,525,3.01,568,2.141,766,2.65,769,3.565,1036,10.99,1043,3.658,1274,4.677,1616,3.406,2002,4.396,2042,5.102,2043,13.017,2044,5.102,2045,4.396,2046,5.102,2047,5.102,2048,5.102,2049,5.102,2050,5.102,2051,5.102,2052,5.102,2053,5.102]],["keywords/415",[]],["title/416",[23,266.026,1077,570.286,1332,733.569]],["content/416",[5,4.971,10,3.553,23,4.127,25,2.545,65,3.125,85,3.046,140,3.24,152,3.594,153,2.997,157,4.186,167,4.726,185,3.403,203,2.997,205,6.942,218,2.646,220,4.849,221,4.726,222,8.241,310,4.987,314,4.423,332,5.884,444,5.329,479,4.987,512,4.726,578,4.338,649,4.726,671,4.338,766,3.513,769,7.556,771,5.329,1036,4.726,1060,4.726,1077,6.199,1083,4.726,1098,4.849,1100,4.987,1144,5.329,1730,5.329,2054,6.764,2055,6.764,2056,6.764,2057,10.814,2058,6.764,2059,6.2]],["keywords/416",[]],["title/417",[3,433.134,5,189.192,11,164.54,236,254.157,567,266.819,1077,336.724,1898,376.777]],["content/417",[1,1.27,4,3,5,1.31,6,1.457,10,2.137,23,2.507,70,5.095,73,1.774,74,2.476,78,1.931,94,3.57,104,2.3,132,5.755,143,2.843,148,2.241,157,2.517,179,2.27,185,2.047,186,1.493,199,2.843,212,2.609,219,2.609,220,2.916,236,6.019,507,2.4,568,1.707,577,3.205,703,2.517,752,2.187,766,4.87,799,2.609,823,2.365,1013,3.506,1044,2.66,1074,2.27,1415,3,1898,9.586,1938,3.506,1940,3.339,1947,3.729,1951,5.802,1952,3.506,2060,4.068,2061,4.068,2062,4.068,2063,9.375,2064,4.068,2065,4.068,2066,4.068,2067,4.068,2068,9.375,2069,9.375,2070,7.069,2071,4.068,2072,4.068,2073,4.068,2074,9.375,2075,11.201,2076,4.068,2077,4.068,2078,4.068,2079,9.375,2080,4.068,2081,4.068,2082,4.068,2083,4.068,2084,4.068,2085,4.068,2086,4.068,2087,4.068,2088,4.068,2089,7.069,2090,4.068]],["keywords/417",[]],["title/418",[5,273.07,148,467.108,212,543.818,766,440.412]],["content/418",[5,1.978,23,2.675,29,2.722,62,2.372,67,2.47,74,3.739,83,3.571,94,4.651,96,4.793,148,5.512,185,3.09,186,3.672,194,3.473,212,9.361,217,6.09,228,2.863,233,4.101,236,6.952,242,3.739,276,3.342,294,3.059,407,3.473,465,3.342,525,3.624,533,3.521,567,2.79,572,2.559,578,3.94,717,4.84,766,3.191,797,3.68,799,3.94,823,3.571,839,4.192,923,4.673,1030,4.529,1043,4.404,1044,4.017,1212,5.041,1386,4.192,1866,4.84,1871,5.041,1898,3.94,2091,6.143,2092,6.143,2093,5.293,2094,6.143,2095,5.293,2096,6.143,2097,6.143,2098,6.143,2099,5.293,2100,6.143,2101,5.293]],["keywords/418",[]],["title/419",[5,273.07,148,467.108,211,213.853,766,440.412]],["content/419",[5,1.503,23,3.687,29,4.608,56,2.324,62,1.802,67,1.876,74,2.841,83,4.626,94,4.394,96,2.236,109,1.974,132,6.313,148,5.73,186,2.92,194,2.639,199,3.261,203,2.068,205,4.088,211,2.007,217,2.841,221,3.261,233,3.116,236,5.316,242,2.841,276,2.539,407,2.639,445,2.939,465,2.539,479,3.441,497,4.278,525,2.753,533,2.675,549,2.888,567,2.12,572,3.315,578,2.993,599,3.052,625,2.301,752,2.509,766,2.424,771,3.677,797,2.796,799,2.993,823,7.143,923,3.55,1030,3.441,1043,3.346,1044,3.052,1212,3.83,1386,3.185,1442,7.293,1692,4.278,1823,2.373,1866,3.677,1871,3.83,1898,5.103,2093,4.022,2095,4.022,2099,4.022,2101,4.022,2102,4.667,2103,7.957,2104,7.957,2105,4.667,2106,4.667,2107,4.278,2108,4.667,2109,4.667,2110,4.667,2111,4.667]],["keywords/419",[]],["title/420",[5,273.07,148,467.108,157,524.7,766,440.412]],["content/420",[4,3.194,5,3.765,22,2.357,23,3.525,29,1.919,62,1.672,67,1.741,74,2.636,83,2.518,94,3.726,96,3.575,120,3.555,132,5.053,148,4.112,153,3.307,157,2.68,185,5.881,186,2.739,194,2.449,217,4.543,233,2.891,236,6.235,242,2.636,276,2.357,285,2.68,407,2.449,444,3.413,447,2.417,465,2.357,500,3.555,525,2.555,533,2.483,549,4.619,567,1.967,568,1.818,572,5.493,577,3.413,578,2.778,599,2.833,625,2.136,717,3.413,766,2.25,770,2.833,797,2.595,799,2.778,823,5.717,865,2.956,923,3.295,1030,3.194,1043,3.105,1044,4.881,1166,3.027,1212,3.555,1386,2.956,1729,3.413,1866,3.413,1871,3.555,1898,2.778,1940,3.555,2093,3.732,2095,3.732,2099,3.732,2101,3.732,2107,3.97,2112,4.331,2113,4.331,2114,4.331,2115,4.331,2116,4.331,2117,4.331,2118,4.331,2119,4.331,2120,4.331,2121,7.464,2122,4.331,2123,4.331]],["keywords/420",[]],["title/421",[5,320.422,132,511.183,567,451.893]],["content/421",[5,6.71,132,10.704,186,5.258,211,3.613,239,9.188,567,6.506,797,8.581,2124,14.325,2125,14.325]],["keywords/421",[]],["title/422",[1,310.527,94,317.056,314,650.618]],["content/422",[]],["keywords/422",[]],["title/423",[0,1396.187]],["content/423",[1,3.03,5,4.597,11,4.742,12,5.417,56,7.108,94,3.093,99,11.247,136,4.336,141,6.959,152,5.157,153,4.301,185,4.884,236,4.2,239,6.226,300,7.384,332,5.282,407,5.489,567,4.409,758,13.084,1052,4.987,1132,6.959,1190,7.384,1416,7.967,1978,8.365,2126,14.274,2127,7.967]],["keywords/423",[]],["title/424",[39,561.923,85,332.723,132,379.549,218,289.028,1083,516.168]],["content/424",[1,2.723,5,4.245,6,3.125,11,2.443,28,5.704,29,3.865,62,3.368,65,4.031,85,8.562,132,9.097,140,4.179,186,3.202,218,6.216,301,5.309,549,5.398,567,3.962,672,6.772,1026,5.309,1027,7.996,1028,11.358,1029,11.358,1030,6.432,1031,7.996,1527,7.996,2128,8.723,2129,8.723,2130,8.723]],["keywords/424",[]],["title/425",[67,297.002,94,235.412,329,606.26,567,335.527,1083,516.168]],["content/425",[5,1.958,6,2.179,23,1.626,29,5.57,36,2.694,49,4.625,62,5.601,67,3.99,94,3.162,132,3.124,140,2.913,186,3.642,211,3.659,218,3.883,299,3.701,302,4.059,434,6.772,478,3.486,495,3.763,567,4.507,568,2.552,628,4.791,708,3.643,811,4.15,847,4.359,1036,8.784,1063,4.791,1144,4.791,1167,5.24,1211,3.091,1257,4.791,1371,4.791,1375,3.9,1449,5.574,1466,5.574,1640,4.99,1786,5.574,1860,4.99,1923,5.574,1954,4.249,2131,6.081,2132,6.081,2133,9.096,2134,5.574,2135,6.081,2136,6.081,2137,6.081,2138,6.081,2139,6.081,2140,6.081,2141,6.081,2142,6.081,2143,5.574]],["keywords/425",[]],["title/426",[12,365.189,13,457.29,14,515.67,118,339.939,905,563.95,1083,457.29]],["content/426",[1,1.678,5,3.713,11,1.506,23,1.437,36,2.382,65,2.484,70,2.647,73,3.908,78,2.551,111,4.927,133,3.963,161,4.206,166,2.856,186,3.29,202,4.257,205,2.762,215,3.588,301,3.272,307,3.853,332,2.925,447,2.999,563,1.627,624,6.263,625,4.419,780,7.867,847,6.426,861,3.272,1052,2.762,1144,4.235,1191,4.411,1318,6.818,1447,4.411,1503,7.063,1616,3.588,1643,4.632,1644,4.632,1675,4.632,2144,5.375,2145,5.375,2146,5.375,2147,5.375,2148,5.375,2149,5.375,2150,5.375,2151,5.375,2152,5.375,2153,5.375,2154,5.375,2155,5.375,2156,5.375,2157,5.375,2158,5.375,2159,4.927,2160,5.375,2161,5.375,2162,5.375,2163,4.927,2164,7.724,2165,5.375,2166,5.375,2167,5.375,2168,5.375,2169,5.375,2170,5.375,2171,5.375,2172,5.375]],["keywords/426",[]],["title/427",[5,273.07,29,375.673,717,668.083,1083,592.448]],["content/427",[5,6.716,11,3.065,29,8.744,62,6.01,179,6.106,205,5.622,210,5.882,218,6.09,232,7.844,299,6.659,519,10.179,654,6.89,708,6.554,1607,8.98,1925,10.029,2173,10.942]],["keywords/427",[]],["title/428",[5,237.911,70,218.158,236,319.605,719,636.561,1083,516.168]],["content/428",[3,6.526,5,2.851,10,7,11,2.479,23,2.367,25,3.331,28,5.788,62,6.887,140,6.384,186,3.249,198,5.909,203,3.922,210,4.758,218,3.463,222,8.708,236,5.766,568,3.715,656,6.185,692,7.862,708,5.302,778,5.788,1043,6.345,1046,7.627,1047,8.113,1063,6.974,1077,5.073,1910,7.627,2174,8.851,2175,8.851]],["keywords/428",[]],["title/429",[944,887.461,2176,1203.639]],["content/429",[1,4.206,5,4.34,7,5.574,11,2.516,12,5.013,94,2.863,167,6.277,185,4.519,186,3.297,194,5.079,203,3.98,236,3.887,332,4.888,465,4.888,563,2.72,567,4.08,708,5.381,711,6.833,726,7.372,861,5.467,944,6.623,1052,6.924,1416,7.372,1806,7.372,1808,8.234,1823,4.567,2177,8.983,2178,8.983,2179,8.983,2180,8.983,2181,8.983,2182,8.983,2183,8.983,2184,8.983]],["keywords/429",[]],["title/430",[11,278.67,136,444.426,1052,511.183]],["content/430",[]],["keywords/430",[]],["title/431",[2185,1064.296]],["content/431",[1,4.858,6,3.92,29,4.848,70,4.597,94,3.487,164,5.242,179,6.106,218,7.089,236,6.734,567,4.97,1033,7.018,1036,10.876,1039,7.645,1954,7.645,2185,13.79,2186,15.566]],["keywords/431",[]],["title/432",[11,278.67,136,444.426,1052,511.183]],["content/432",[1,5.839,109,6.057,136,6.399,167,10.009,186,5.258,239,9.188,1033,9.188,1052,7.36,2127,11.756,2185,10.009,2187,12.344,2188,14.325]],["keywords/432",[]],["title/433",[575,582.05,1074,671.636]],["content/433",[1,2.264,11,3.962,62,2.8,63,4.344,65,5.281,67,4.595,94,2.311,136,3.24,218,2.838,314,4.743,567,8.428,568,3.044,662,4.652,663,5.067,856,5.067,1029,6.249,1033,7.331,1036,9.884,1041,6.249,1052,5.873,1074,8.958,1257,9.006,1427,6.249,1640,5.952,1823,3.687,1895,5.347,1954,5.067,1978,6.249,2127,5.952,2185,9.884,2189,7.252,2190,9.849,2191,7.252,2192,6.249]],["keywords/433",[]],["title/434",[1,310.527,73,433.832,1074,555.169]],["content/434",[1,3.531,5,1.686,7,2.165,11,1.466,13,3.658,23,2.344,36,2.32,58,1.668,65,4.051,70,4.351,73,2.283,78,2.485,94,2.794,109,3.707,119,3.495,186,1.921,203,2.32,205,4.505,220,3.753,236,3.793,301,3.186,302,3.495,311,4.511,312,4.296,314,3.423,457,2.634,521,4.511,568,6.183,576,3.658,630,3.982,651,3.572,766,2.719,797,3.136,799,3.358,823,8.565,1033,3.358,1052,5.812,1074,2.921,1102,4.511,1598,4.799,1599,4.511,1618,4.511,1621,4.296,1622,4.799,1729,4.125,1806,4.296,1823,4.457,1884,4.511,1895,6.464,2185,6.126,2190,4.511,2193,8.768,2194,5.235,2195,5.235,2196,5.235,2197,7.555,2198,4.799,2199,5.235,2200,5.235]],["keywords/434",[]],["title/435",[73,433.832,85,448.117,218,389.267]],["content/435",[1,4.446,5,4.104,11,1.382,23,1.319,29,5.646,36,2.186,58,3.453,62,1.905,70,5.11,73,4.725,85,4.881,94,2.659,136,2.204,148,2.719,169,4.841,186,3.977,218,1.931,236,4.689,286,3.538,303,4.596,314,3.227,567,2.241,571,4.922,599,3.227,642,3.368,651,3.368,692,4.922,725,3.368,778,3.227,874,3.639,920,4.252,1026,5.077,1033,3.165,1038,5.163,1052,2.535,1077,2.829,1083,3.448,1101,4.523,1419,4.05,1420,4.523,1422,4.523,1482,4.05,1745,6.847,1823,2.509,1954,5.829,2185,8.903,2190,4.252,2192,4.252,2197,4.252,2198,4.523,2201,4.935,2202,4.935,2203,4.935]],["keywords/435",[]],["title/436",[161,309.305,563,256.689,575,410.018,2204,730.633]],["content/436",[1,2.814,5,2.563,6,1.386,7,0.862,11,1.083,12,1.163,13,3.783,23,2.128,25,0.784,29,3.526,36,0.923,52,1.585,56,3.369,62,1.494,64,1.178,65,1.787,70,5.317,72,0.637,78,0.989,94,3.447,103,1.071,125,1.803,127,1.059,132,1.987,136,2.418,140,0.998,161,0.76,166,1.107,169,3.022,186,1.987,202,2.939,211,0.976,218,1.513,236,0.901,302,1.391,305,1.728,307,3.881,334,1.422,447,3.021,457,2.724,462,1.312,479,1.536,518,3.826,530,1.194,556,3.54,563,1.639,568,2.84,575,2.618,576,2.703,588,2.282,647,5.331,661,1.585,663,1.456,669,4.617,671,1.336,672,1.071,673,1.094,689,2.752,703,1.289,780,2.64,799,1.336,805,1.422,817,1.422,856,2.703,944,1.536,949,1.795,971,2.773,1026,2.354,1052,1.071,1077,1.194,1083,2.703,1086,4.266,1152,3.048,1173,1.585,1174,1.456,1241,3.546,1360,1.795,1375,1.336,1643,1.795,1644,1.795,1780,3.333,1818,1.91,1823,1.966,1884,4.665,1898,1.336,1954,3.783,1990,1.795,2159,1.91,2163,1.91,2164,1.795,2185,6.962,2192,3.333,2204,3.333,2205,2.084,2206,1.71,2207,2.084,2208,2.084,2209,2.084,2210,2.084,2211,2.084,2212,10.085,2213,2.084,2214,2.084,2215,5.414,2216,2.084,2217,2.084,2218,2.084,2219,2.084,2220,2.084,2221,2.084,2222,1.91,2223,2.084,2224,2.084,2225,3.868,2226,3.868,2227,2.084,2228,2.084,2229,2.084,2230,2.084,2231,2.084,2232,2.084,2233,2.084,2234,2.084,2235,2.084]],["keywords/436",[]],["title/437",[73,369.72,654,533.929,689,431.026,2236,668.083]],["content/437",[1,3.068,5,1.936,6,4.84,11,0.947,13,4.2,23,2.169,29,4.355,35,1.55,58,2.585,62,3.132,70,5.183,73,2.621,85,2.707,94,1.078,101,1.913,136,2.685,164,5.974,167,2.364,169,1.511,179,1.888,186,2.977,196,3.194,205,1.738,218,3.174,219,2.17,236,1.464,293,1.841,301,2.059,305,1.511,310,2.494,457,1.702,462,3.785,467,3.354,473,1.42,519,2.212,625,1.668,654,2.13,671,2.17,689,1.72,708,3.601,731,1.841,738,1.606,752,1.818,778,2.212,861,2.059,944,2.494,1000,2.308,1026,2.059,1052,5.051,1056,2.776,1074,1.888,1090,2.17,1419,4.933,1430,2.915,1511,3.101,1653,2.665,1722,5.51,1823,1.72,1886,3.101,1895,5.981,2185,2.364,2187,2.915,2197,6.99,2236,4.736,2237,3.383,2238,2.915,2239,3.383,2240,3.101,2241,6.011,2242,6.011,2243,6.011,2244,6.011,2245,6.011,2246,3.383,2247,3.383,2248,3.383,2249,3.383,2250,6.011,2251,3.383,2252,3.383,2253,3.383,2254,3.383,2255,3.383,2256,3.383,2257,2.915]],["keywords/437",[]],["title/438",[1077,873.085]],["content/438",[5,3.4,11,4.25,22,8.256,35,4.837,62,5.859,94,3.365,148,5.817,170,7.205,186,3.875,218,4.131,222,5.155,236,4.568,314,6.904,625,5.206,692,6.229,708,6.325,824,7.048,861,6.426,1046,9.098,1074,5.891,1076,7.569,1731,9.678,2127,8.665,2185,7.377,2258,10.558]],["keywords/438",[]],["title/439",[78,571.283,653,803.489]],["content/439",[]],["keywords/439",[]],["title/440",[78,472.218,567,451.893,637,650.618]],["content/440",[1,1.898,5,3.196,11,3.521,18,2.652,23,1.626,37,2.411,58,1.938,60,3.346,61,3.535,65,2.81,70,4.284,74,6.04,75,2.363,78,7.586,91,3.99,96,4.754,106,3.091,112,4.791,140,2.913,152,3.231,165,4.359,166,3.231,186,2.232,242,3.701,285,3.763,294,3.028,303,3.35,332,6.84,367,3.763,541,4.249,558,3.587,637,6.489,639,4.99,737,4.625,769,4.249,797,3.643,1375,3.9,1427,5.24,1482,4.99,1751,5.574,1753,5.574,2259,6.081,2260,6.081,2261,6.081,2262,6.081,2263,5.24,2264,5.574,2265,6.081,2266,6.081,2267,5.574,2268,6.081,2269,6.081]],["keywords/440",[]],["title/441",[78,402.433,205,435.64,637,554.469,1724,625.161]],["content/441",[1,3.602,5,5.205,23,3.085,65,3.392,67,2.951,78,8.338,94,2.339,101,4.151,109,3.104,163,4.623,164,5.528,169,3.279,199,5.129,205,8.303,228,3.422,302,4.9,478,4.208,495,4.543,568,3.081,637,7.546,653,7.703,692,4.331,737,5.584,847,5.263,1035,6.729,1065,5.784,1235,5.009,1418,6.326,1529,4.708,1724,5.412,1784,6.025,1901,6.729,1936,6.729,1994,5.412,2187,6.326,2270,7.341,2271,7.341,2272,7.341]],["keywords/441",[]],["title/442",[35,388.407,78,402.433,94,270.201,118,440.412]],["content/442",[5,1.958,11,1.703,35,2.786,41,3.708,55,4.99,65,2.81,69,5.574,70,6.624,75,2.363,78,4.71,125,4.626,186,2.232,202,3.665,207,4.99,208,2.762,228,2.835,232,7.114,303,3.35,332,3.309,447,5.537,449,4.791,637,9.486,662,3.9,678,4.99,708,3.643,731,5.399,740,8.551,743,5.574,744,9.096,944,4.483,1086,4.791,1273,5.24,1609,7.114,2273,9.923,2274,9.923,2275,4.99,2276,6.081]],["keywords/442",[]],["title/443",[19,474.098,726,987.814]],["content/443",[]],["keywords/443",[]],["title/444",[19,474.098,865,821.36]],["content/444",[9,4.395,10,3.131,11,1.669,19,6.69,32,2.663,58,4.568,60,4.209,62,5.535,65,2.754,70,5.016,139,4.534,154,3.823,179,3.326,186,2.188,210,3.204,211,1.503,294,2.968,314,3.898,408,5.52,512,4.165,533,3.417,578,3.823,749,4.892,865,4.067,1389,4.534,1415,4.395,1824,5.463,1911,10.175,2264,5.463,2277,5.96,2278,8.948,2279,5.96,2280,5.96,2281,5.96,2282,5.96,2283,5.96,2284,5.96,2285,5.96,2286,5.96,2287,5.96,2288,5.96,2289,5.96,2290,5.96,2291,5.96,2292,5.96,2293,5.96,2294,5.96,2295,5.96]],["keywords/444",[]],["title/445",[19,391.886,196,528.598,689,505.769]],["content/445",[19,7.369,36,6.347,83,8.328,94,4.565,109,6.057,110,7.441,186,5.258,293,7.794,563,4.337,689,7.282,811,9.775,2296,14.325]],["keywords/445",[]],["title/446",[1,310.527,19,391.886,160,511.183]],["content/446",[1,3.766,7,2.371,11,2.649,18,2.5,19,6.101,25,4.541,57,3.382,67,2.305,70,2.792,74,5.755,75,2.228,79,6.453,86,3.382,104,3.242,105,3.827,106,2.915,159,6.734,160,7.194,161,2.092,164,2.747,179,3.199,186,4.429,286,4.11,294,2.855,345,3.242,448,5.024,465,3.12,495,3.548,509,3.61,512,4.006,575,4.573,578,3.677,622,6.607,708,5.664,731,3.12,1080,5.255,1503,4.518,1823,2.915,1881,5.255,1955,4.361,2297,5.255,2298,14.001,2299,5.255,2300,5.255,2301,5.733,2302,5.733,2303,5.733,2304,5.733,2305,5.733,2306,5.733]],["keywords/446",[]],["title/447",[19,333.973,94,270.201,127,431.026,448,450.481]],["content/447",[1,1.693,11,3.25,19,7.368,25,2.041,35,2.485,41,1.386,57,3.2,65,2.506,70,5.321,74,3.301,91,3.631,92,3.621,93,5.408,127,8.744,136,2.423,160,4.64,167,3.79,169,2.423,186,1.991,202,2.003,208,2.463,301,3.301,326,3.999,444,4.274,446,4.451,448,8.619,462,3.415,563,2.734,649,3.79,662,3.479,663,3.79,670,4.274,708,3.249,759,4.971,803,3.301,1049,4.451,1086,4.274,1415,3.999,1783,4.674,2240,4.971,2263,4.674,2307,5.424,2308,5.424,2309,9.031,2310,5.424,2311,5.424,2312,5.424,2313,4.971]],["keywords/447",[]],["title/448",[19,333.973,94,270.201,127,431.026,448,450.481]],["content/448",[1,4.501,5,1.939,19,3.877,25,5.426,30,2.265,35,2.758,50,6.281,57,3.552,58,1.918,60,3.323,70,3.687,75,2.34,94,1.918,96,2.884,127,7.33,154,3.861,159,3.359,160,3.093,161,5.26,164,2.884,186,2.21,208,2.734,242,3.664,408,3.404,447,3.359,448,6.633,462,3.791,495,3.725,528,4.941,563,1.822,622,4.206,667,5.188,766,3.127,917,5.518,1192,4.206,1631,5.518,1680,4.941,2263,5.188,2278,5.518,2314,6.02,2315,6.02,2316,6.02,2317,5.518,2318,6.02,2319,5.518,2320,6.02,2321,6.02,2322,6.02,2323,5.518,2324,6.02]],["keywords/448",[]],["title/449",[19,391.886,28,650.618,57,586.955]],["content/449",[1,1.496,11,0.736,19,4.177,20,1.837,25,2.484,28,1.72,34,1.627,35,2.195,45,2.266,50,2.411,51,1.755,57,2.827,67,1.057,70,6.578,91,2.654,93,3.793,127,3.356,133,3.533,141,1.885,158,1.551,159,2.674,160,2.462,164,3.898,169,1.175,179,1.467,186,0.965,194,1.487,199,1.837,202,0.971,208,1.194,300,2,345,1.487,367,4.085,408,1.487,445,1.656,448,2.546,507,1.551,541,1.837,669,5.553,670,2.072,671,1.686,679,2.158,752,1.414,757,2.41,1132,1.885,1168,14.436,1192,1.837,1298,1.939,1325,2,1609,1.885,1785,2.266,2319,2.41,2325,2.41,2326,2.629,2327,2.41,2328,2.629,2329,2.629,2330,2.629,2331,2.629,2332,6.601,2333,2.629,2334,4.792,2335,2.629,2336,4.792,2337,2.629,2338,2.41,2339,2.629,2340,2.629,2341,2.629,2342,2.629,2343,2.629,2344,3.932,2345,2.629,2346,2.629,2347,2.629,2348,4.792,2349,2.629,2350,2.629,2351,2.629,2352,2.629,2353,2.629,2354,2.629,2355,2.629,2356,2.629,2357,2.629,2358,2.629,2359,2.629,2360,2.629,2361,2.629,2362,2.629,2363,2.629,2364,4.792,2365,2.629,2366,2.629,2367,2.629,2368,2.629,2369,2.629,2370,2.629,2371,6.601,2372,2.629,2373,2.629,2374,2.629,2375,2.629,2376,2.629,2377,2.629,2378,2.629]],["keywords/449",[]],["title/450",[1,264.637,11,237.488,22,461.341,23,226.713]],["content/450",[1,5.18,5,1.829,11,3.358,15,4.32,17,4.188,19,4.722,23,1.519,24,4.475,25,6.245,35,2.602,70,2.771,73,2.476,83,3.302,94,1.81,109,3.967,110,2.95,118,2.95,127,4.769,160,2.918,186,2.085,192,4.32,242,3.457,285,3.515,292,2.887,294,2.828,465,5.105,507,5.535,509,5.908,544,3.129,563,2.84,651,3.876,663,3.968,708,5.62,774,3.968,805,3.876,862,4.894,874,4.188,1076,4.071,1325,4.32,1428,7.7,1627,6.918,1628,4.894,1630,5.206,1783,8.085,2297,5.206,2299,5.206,2300,5.206,2317,5.206,2379,8.6,2380,5.679,2381,5.679]],["keywords/450",[]],["title/451",[85,686.049]],["content/451",[]],["keywords/451",[]],["title/452",[2382,1250.059]],["content/452",[]],["keywords/452",[]],["title/453",[2383,1523.181]],["content/453",[]],["keywords/453",[]],["title/454",[2384,927.048]],["content/454",[6,5.672,23,4.233,136,7.072,457,7.964,575,7.656,738,7.514,1052,8.134,1056,12.992,1211,8.048]],["keywords/454",[]],["title/455",[2385,1523.181]],["content/455",[]],["keywords/455",[]],["title/456",[397,533.295,2386,915.574]],["content/456",[6,5.275,11,3.361,18,3.365,19,3.04,23,3.208,62,2.98,73,6.42,94,4.692,136,3.447,148,4.251,164,3.697,185,3.882,196,4.1,218,3.019,236,5.191,286,8.602,292,3.923,568,3.239,656,5.392,778,5.046,1000,5.266,1052,3.965,1081,6.333,1701,7.074,1703,9.455,1705,7.074,1708,7.074,1717,7.074,1823,3.923,2387,10.34,2388,7.074,2389,7.717,2390,7.717,2391,7.717,2392,7.717,2393,5.87,2394,7.717]],["keywords/456",[]],["title/457",[228,561.075,397,533.295]],["content/457",[7,4.015,11,2.719,62,5.512,85,6.429,127,4.935,132,4.987,136,4.336,169,4.336,207,7.967,218,5.585,222,4.739,228,9.695,407,8.071,465,5.282,478,5.564,559,7.384,692,5.727,730,10.233,1066,7.384,1823,7.256,1856,8.365,2395,9.707]],["keywords/457",[]],["title/458",[2384,927.048]],["content/458",[6,3.081,11,3.652,23,2.299,86,5.073,94,6.02,136,3.841,148,4.737,166,4.568,208,3.905,233,5.74,303,4.737,332,4.678,334,8.897,339,6.541,625,4.239,649,9.11,703,5.321,738,4.081,752,8.466,778,5.623,823,4.999,1033,5.515,1038,8.069,1039,6.008,1052,4.418,1074,4.798,2393,6.541,2396,8.598,2397,8.598,2398,8.598,2399,8.598]],["keywords/458",[]],["title/459",[2400,1523.181]],["content/459",[]],["keywords/459",[]],["title/460",[397,533.295,2386,915.574]],["content/460",[23,4.233,36,7.014,292,8.048,305,7.072,568,6.645,703,9.797,1043,11.349,1730,12.474,1732,14.511]],["keywords/460",[]],["title/461",[2401,1523.181]],["content/461",[]],["keywords/461",[]],["title/462",[2384,927.048]],["content/462",[11,2.906,23,2.774,58,4.775,86,6.121,94,3.307,139,7.893,149,5.867,183,8.941,196,5.513,218,4.06,228,4.837,236,7.61,567,4.713,571,6.121,649,7.25,655,7.25,738,4.925,1052,5.331,1595,8.176,1856,8.941,2387,8.941,2393,7.893,2402,9.511,2403,10.376,2404,10.376,2405,10.376]],["keywords/462",[]],["title/463",[2406,1523.181]],["content/463",[]],["keywords/463",[]],["title/464",[397,533.295,2407,915.574]],["content/464",[7,6.911,159,9.324,160,8.585,208,7.59,519,10.927,563,5.059,2408,15.316]],["keywords/464",[]],["title/465",[2384,927.048]],["content/465",[62,6.636,136,7.677,625,8.474,738,8.157,1052,8.83,1211,8.737]],["keywords/465",[]],["title/466",[2409,1523.181]],["content/466",[]],["keywords/466",[]],["title/467",[2384,927.048]],["content/467",[6,6.157,94,5.477,164,8.233,738,8.157,1211,8.737,2410,17.186]],["keywords/467",[]],["title/468",[2411,1523.181]],["content/468",[]],["keywords/468",[]],["title/469",[2384,927.048]],["content/469",[6,4.587,32,5.719,80,10.507,86,7.553,136,5.719,208,5.815,571,7.553,625,6.312,738,6.076,771,10.087,775,8.211,1052,6.578,1211,8.825,1402,9.439,2257,11.032,2412,12.802,2413,12.802]],["keywords/469",[]],["title/470",[2414,1523.181]],["content/470",[]],["keywords/470",[]],["title/471",[6,264.658,136,329.983,208,335.527,397,327.304,1052,379.549]],["content/471",[6,3.498,11,3.473,18,2.599,29,4.325,56,2.968,58,1.899,62,6.558,67,2.396,73,2.599,85,2.685,86,3.516,94,4.568,109,2.52,136,2.663,147,3.898,148,3.284,163,3.753,164,4.677,179,3.326,205,3.062,218,4.851,236,2.579,293,3.243,303,3.284,486,4.395,533,3.417,567,2.707,568,2.502,572,4.067,625,6.113,649,4.165,703,3.689,766,5.071,772,3.979,794,4.067,1033,3.823,1052,8.126,1074,5.447,1721,5.463,1821,4.892,2257,5.136,2393,7.426,2415,5.96,2416,5.96,2417,5.96,2418,5.96,2419,5.96]],["keywords/471",[]],["title/472",[2420,1523.181]],["content/472",[]],["keywords/472",[]],["title/473",[303,663.093,397,533.295]],["content/473",[1,2.846,7,6.749,58,2.906,73,3.976,78,4.328,85,4.107,205,7.002,218,3.568,228,4.251,303,8.99,421,8.359,563,2.761,642,6.223,692,8.04,702,6.223,730,12.979,738,4.328,770,5.963,775,5.849,794,6.223,918,7.185,1038,5.643,1066,6.937,2421,9.119,2422,8.359,2423,9.119,2424,9.119,2425,9.119]],["keywords/473",[]],["title/474",[2426,1523.181]],["content/474",[]],["keywords/474",[]],["title/475",[397,533.295,2427,1203.639]],["content/475",[5,4.306,23,4.78,136,5.973,148,7.366,169,5.973,302,8.926,303,7.366,459,9.859,473,5.612,778,8.744,1637,13.18,1704,13.18,2428,13.371]],["keywords/475",[]],["title/476",[2429,1523.181]],["content/476",[]],["keywords/476",[]],["title/477",[2384,927.048]],["content/477",[139,12.042,227,14.511,228,7.38,475,11.062,628,12.474,654,9.969,738,7.514,1211,8.048,2236,12.474]],["keywords/477",[]],["title/478",[2430,1523.181]],["content/478",[]],["keywords/478",[]],["title/479",[397,533.295,2386,915.574]],["content/479",[1,4.815,7,6.38,23,4.125,94,4.916,571,9.1,599,10.087,725,10.526,778,10.087,1077,8.842,2431,14.14]],["keywords/479",[]],["title/480",[2432,1523.181]],["content/480",[]],["keywords/480",[]],["title/481",[2384,927.048]],["content/481",[11,3.664,62,5.051,133,9.644,136,5.843,218,5.118,222,6.386,236,5.659,628,10.307,730,9.377,738,6.208,772,8.732,1211,6.649,1489,11.272,2433,13.08,2434,13.08,2435,13.08,2436,13.08]],["keywords/481",[]],["title/482",[2437,1523.181]],["content/482",[]],["keywords/482",[]],["title/483",[1529,976.936]],["content/483",[101,10.003,158,10.437,1075,11.569,1235,12.073,1499,13.457]],["keywords/483",[]],["title/484",[2438,1523.181]],["content/484",[]],["keywords/484",[]],["title/485",[67,340.894,101,479.417,1529,543.818,2005,644.965]],["content/485",[67,6.91,101,9.718,133,12.672,208,7.806,575,8.311,2005,13.073]],["keywords/485",[]],["title/486",[2384,927.048]],["content/486",[18,3.454,23,2.118,25,2.98,58,2.524,62,3.058,73,3.454,94,2.524,125,3.692,127,4.026,136,6.685,161,2.889,169,6.685,203,3.509,208,3.597,218,4.79,221,5.534,222,5.978,228,3.692,229,6.025,230,6.24,236,3.427,303,4.363,549,4.901,567,3.597,599,5.179,608,6.24,617,7.452,630,6.025,669,5.405,742,6.5,1074,4.419,1090,5.08,1470,7.26,2212,6.5,2387,6.825,2439,7.92,2440,7.92,2441,7.92,2442,7.92,2443,7.92]],["keywords/486",[]],["title/487",[2444,1523.181]],["content/487",[]],["keywords/487",[]],["title/488",[397,533.295,1075,787.108]],["content/488",[18,6.558,85,6.774,132,7.728,218,5.885,228,7.011,767,11.441,770,9.836,1075,9.836,1077,8.621,1868,12.344,2445,15.04]],["keywords/488",[]],["title/489",[397,533.295,2446,1203.639]],["content/489",[203,8.076,222,8.899,224,13.865,225,15.706]],["keywords/489",[]],["title/490",[2447,1523.181]],["content/490",[]],["keywords/490",[]],["title/491",[766,791.174]],["content/491",[228,7.38,236,6.849,303,8.722,305,7.072,472,12.992,512,11.062,702,10.803,2402,14.511,2448,15.831]],["keywords/491",[]],["title/492",[2384,927.048]],["content/492",[738,8.651,1075,11.919,1211,9.266,1872,13.439]],["keywords/492",[]],["title/493",[1529,976.936]],["content/493",[62,6.113,85,7.13,101,11.279,141,11.349,305,7.072,1898,10.154,1998,14.511,2005,12.042]],["keywords/493",[]],["title/494",[2449,1523.181]],["content/494",[]],["keywords/494",[]],["title/495",[766,791.174]],["content/495",[127,9.266,556,11.919,1530,11.919,1791,12.736]],["keywords/495",[]],["title/496",[397,533.295,2407,915.574]],["content/496",[1,4.58,29,6.502,33,12.645,58,4.676,62,5.666,106,7.46,129,10.52,407,8.297,1298,10.819,1680,12.043,2450,14.674,2451,13.451]],["keywords/496",[]],["title/497",[2452,1523.181]],["content/497",[]],["keywords/497",[]],["title/498",[397,533.295,2407,915.574]],["content/498",[136,7.072,169,7.072,211,3.993,572,6.596,654,9.969,738,7.514,1211,8.048,2236,12.474,2453,13.642]],["keywords/498",[]],["title/499",[2454,1523.181]],["content/499",[]],["keywords/499",[]],["title/500",[2455,1200.171]],["content/500",[29,7.404,34,10.34,151,9.578,218,6.538,473,7.013,738,7.931,1211,8.494]],["keywords/500",[]],["title/501",[2456,1523.181]],["content/501",[]],["keywords/501",[]],["title/502",[397,533.295,2407,915.574]],["content/502",[11,4.213,94,4.793,149,8.504,305,6.719,654,9.471,1052,7.728,1090,9.647,2236,11.851,2453,12.96,2457,15.04,2458,15.04]],["keywords/502",[]],["title/503",[2459,1523.181]],["content/503",[]],["keywords/503",[]],["title/504",[397,533.295,2460,1203.639]],["content/504",[18,5.355,36,5.441,37,4.87,218,4.805,294,6.115,303,6.765,334,8.38,507,7.245,558,7.245,567,5.578,780,8.38,1033,10.823,1036,8.581,1038,7.599,1041,10.582,1042,10.078,2461,16.874,2462,12.28]],["keywords/504",[]],["title/505",[397,533.295,2407,915.574]],["content/505",[1,3.03,7,5.904,18,4.233,25,5.371,29,7.501,58,4.549,64,5.489,85,4.372,129,6.959,210,5.218,218,5.585,285,6.007,294,4.834,305,4.336,448,5.157,510,7.157,544,5.348,575,4.694,789,8.365,1100,7.157,1132,6.959,2451,8.898,2463,8.898,2464,9.707,2465,9.707,2466,14.274]],["keywords/505",[]],["title/506",[1530,787.108,2455,948.392]],["content/506",[29,6.664,125,7.011,127,7.646,218,5.885,303,8.286,738,7.139,953,11.851,1211,7.646,2467,15.04,2468,15.04,2469,15.04]],["keywords/506",[]],["title/507",[2470,1523.181]],["content/507",[]],["keywords/507",[]],["title/508",[23,266.026,397,440.817,520,615.687]],["content/508",[18,6.558,23,4.022,653,10.04,654,12.159,725,10.264,1703,11.851,2471,15.04,2472,15.04,2473,15.04,2474,15.04]],["keywords/508",[]],["title/509",[397,533.295,2386,915.574]],["content/509",[67,6.047,91,6.047,94,4.793,148,8.286,305,6.719,599,12.627,617,11.752,656,10.509,770,9.836]],["keywords/509",[]],["title/510",[2475,1523.181]],["content/510",[]],["keywords/510",[]],["title/511",[397,533.295,2386,915.574]],["content/511",[25,6.657,58,5.638,140,8.475,148,9.746,2476,17.691]],["keywords/511",[]],["title/512",[2455,1200.171]],["content/512",[125,8.247,159,9.872,556,11.569,738,8.397,1211,8.993]],["keywords/512",[]],["title/513",[2477,1523.181]],["content/513",[]],["keywords/513",[]],["title/514",[397,533.295,2386,915.574]],["content/514",[19,6.77,94,5.477,599,11.239,769,12.009,2478,17.186,2479,15.754]],["keywords/514",[]],["title/515",[397,533.295,2407,915.574]],["content/515",[11,4.814,94,5.477,159,9.59,160,8.83,653,11.473,654,10.823]],["keywords/515",[]],["title/516",[2480,1523.181]],["content/516",[]],["keywords/516",[]],["title/517",[303,663.093,397,533.295]],["content/517",[11,5.105,83,10.596,228,8.496,2481,18.227]],["keywords/517",[]],["title/518",[218,470.93,228,561.075]],["content/518",[228,8.247,445,11.141,465,9.626,571,10.437,672,9.09]],["keywords/518",[]],["title/519",[136,537.66,169,537.66]],["content/519",[]],["keywords/519",[]],["title/520",[2382,1250.059]],["content/520",[]],["keywords/520",[]],["title/521",[2482,1396.187]],["content/521",[]],["keywords/521",[]],["title/522",[518,680.567,563,364.389]],["content/522",[202,6.347,208,7.806,1004,14.81,1007,14.81,1012,14.81,1057,11.239]],["keywords/522",[]],["title/523",[2483,1396.187]],["content/523",[]],["keywords/523",[]],["title/524",[518,680.567,563,364.389]],["content/524",[58,5.325,202,6.171,558,9.858,600,14.399,871,12.32,979,14.399,981,14.399]],["keywords/524",[]],["title/525",[2384,927.048]],["content/525",[58,5.181,64,9.193,85,7.323,393,13.343,1530,10.632,2484,13.343,2485,16.259,2486,16.259]],["keywords/525",[]],["title/526",[2487,1523.181]],["content/526",[]],["keywords/526",[]],["title/527",[1026,927.048]],["content/527",[738,8.397,1026,10.767,1077,10.141,1211,8.993,2212,14.519]],["keywords/527",[]],["title/528",[2488,1396.187]],["content/528",[]],["keywords/528",[]],["title/529",[243,757.951,563,364.389]],["content/529",[7,6.911,67,6.718,202,6.171,241,14.399,252,14.399,284,14.399,805,11.403]],["keywords/529",[]],["title/530",[1704,1123.064]],["content/530",[67,6.047,367,11.949,568,6.313,630,11.441,1074,8.393,1530,9.836,1637,14.236,1955,11.441,2489,15.04]],["keywords/530",[]],["title/531",[2490,1523.181]],["content/531",[]],["keywords/531",[]],["title/532",[1704,1123.064]],["content/532",[35,5.992,75,5.084,125,6.097,198,8.732,211,3.299,367,8.095,407,7.396,459,9.644,672,6.721,738,6.208,1211,6.649,1402,9.644,1704,9.644,1823,6.649,1842,11.99,2491,13.08,2492,13.08]],["keywords/532",[]],["title/533",[2493,1396.187]],["content/533",[]],["keywords/533",[]],["title/534",[94,383.57,563,364.389]],["content/534",[202,6.533,1057,11.569,2494,16.216,2495,16.216,2496,16.216]],["keywords/534",[]],["title/535",[518,680.567,563,364.389]],["content/535",[7,6.221,170,10.264,194,8.504,202,5.554,208,6.831,465,8.184,692,8.873,1108,11.851,1895,11.09,2408,13.786,2497,15.04]],["keywords/535",[]],["title/536",[2498,1523.181]],["content/536",[]],["keywords/536",[]],["title/537",[211,303.58,563,364.389]],["content/537",[58,5.325,305,7.464,1264,15.316,1637,12.32,1704,12.32,2484,13.713,2499,16.71]],["keywords/537",[]],["title/538",[2500,1523.181]],["content/538",[]],["keywords/538",[]],["title/539",[2501,1091.948]],["content/539",[7,5.41,55,10.735,94,4.168,202,4.831,445,8.237,563,3.96,572,5.45,578,8.39,738,6.208,1050,11.99,1175,9.95,1176,9.644,1451,11.99,1530,8.554,1816,11.99,2275,10.735,2502,13.08]],["keywords/539",[]],["title/540",[2503,1523.181]],["content/540",[]],["keywords/540",[]],["title/541",[211,303.58,563,364.389]],["content/541",[11,5.007,24,10.535,64,7.56,85,6.022,202,4.938,211,5.079,490,9.585,544,7.366,699,12.198,725,9.124,2484,10.973,2504,13.371]],["keywords/541",[]],["title/542",[2505,1523.181]],["content/542",[]],["keywords/542",[]],["title/543",[211,303.58,563,364.389]],["content/543",[202,6.941,805,12.826,1160,16.196]],["keywords/543",[]],["title/544",[2506,1523.181]],["content/544",[]],["keywords/544",[]],["title/545",[23,266.026,520,615.687,563,301.201]],["content/545",[202,6.731,604,15.706,606,16.707,805,12.438]],["keywords/545",[]],["title/546",[1529,976.936]],["content/546",[519,11.569,1026,10.767,1099,14.519,1108,13.94,2382,14.519]],["keywords/546",[]],["title/547",[2507,1523.181]],["content/547",[]],["keywords/547",[]],["title/548",[203,533.295,2508,1203.639]],["content/548",[18,6.399,136,8.489,169,8.489,203,6.502,305,6.555,1026,8.931,1994,10.819,2509,14.674,2510,14.674,2511,14.674]],["keywords/548",[]],["title/549",[2512,1523.181]],["content/549",[]],["keywords/549",[]],["title/550",[23,197.523,50,371.64,106,375.53,292,375.53,563,223.64]],["content/550",[23,4.347,50,8.179,106,8.265,158,9.592,202,6.004,292,8.265,1057,10.632,1895,11.988]],["keywords/550",[]],["title/551",[2513,1523.181]],["content/551",[]],["keywords/551",[]],["title/552",[518,417.69,563,223.64,617,449.605,1060,516.168,1616,493.132]],["content/552",[7,5.925,58,4.565,67,5.759,202,6.909,353,9.368,437,11.287,582,12.344,583,13.131,763,11.756,1057,9.368,1318,10.897,2514,14.325]],["keywords/552",[]],["title/553",[2515,1523.181]],["content/553",[]],["keywords/553",[]],["title/554",[153,375.673,345,479.417,563,390.545]],["content/554",[67,6.047,153,6.664,202,5.554,345,8.504,355,12.344,364,13.786,376,13.786,383,13.786,406,13.786,563,4.553,1057,9.836]],["keywords/554",[]],["title/555",[563,364.389,1616,803.489]],["content/555",[23,5.334,36,7.014,58,5.045,109,6.694,305,7.072,572,6.596,1324,9.969,1335,11.673]],["keywords/555",[]],["title/556",[2516,1523.181]],["content/556",[]],["keywords/556",[]],["title/557",[518,680.567,563,364.389]],["content/557",[12,9.324,202,6.171,596,14.399,1057,10.927,2517,15.316,2518,15.316,2519,15.316]],["keywords/557",[]],["title/558",[563,364.389,1616,803.489]],["content/558",[25,6.118,67,6.537,202,6.004,305,7.263,509,10.238,2520,16.259,2521,16.259,2522,16.259]],["keywords/558",[]],["title/559",[2523,1523.181]],["content/559",[]],["keywords/559",[]],["title/560",[1529,976.936]],["content/560",[6,5.388,109,6.36,203,6.664,236,8.354,303,8.286,305,6.719,702,14.553,1068,12.96]],["keywords/560",[]],["title/561",[397,440.817,672,511.183,673,522.583]],["content/561",[136,7.464,169,7.464,305,7.464,692,9.858,693,13.713,695,15.316,2206,13.713]],["keywords/561",[]],["title/562",[2524,1523.181]],["content/562",[]],["keywords/562",[]],["title/563",[211,303.58,563,364.389]],["content/563",[56,8.81,211,4.462,305,7.903,1149,13.457,1226,15.245]],["keywords/563",[]],["title/564",[518,680.567,563,364.389]],["content/564",[23,4.45,125,7.757,166,8.841,202,4.444,222,5.876,244,7.719,305,5.376,564,13.112,585,10.371,586,9.877,885,12.658,2525,11.032,2526,13.657,2527,10.371,2528,11.032]],["keywords/564",[]],["title/565",[2529,1523.181]],["content/565",[]],["keywords/565",[]],["title/566",[563,364.389,647,948.392]],["content/566",[13,7.787,18,4.859,94,3.551,113,7.989,127,5.665,154,7.148,161,4.065,169,4.978,232,7.989,250,7.989,334,7.605,447,6.218,478,9.039,563,3.374,588,6.575,622,7.787,818,7.989,1000,7.605,1595,8.781,1609,7.989,2344,12.942,2530,10.215,2531,11.144]],["keywords/566",[]],["title/567",[211,303.58,563,364.389]],["content/567",[305,8.396,1222,17.229,2532,18.796]],["keywords/567",[]],["title/568",[2533,1523.181]],["content/568",[]],["keywords/568",[]],["title/569",[243,757.951,563,364.389]],["content/569",[202,6.731,280,16.707,293,9.917,2534,18.227]],["keywords/569",[]],["title/570",[2535,1523.181]],["content/570",[]],["keywords/570",[]],["title/571",[19,474.098,397,533.295]],["content/571",[19,8.5,92,10.297,127,7.842,202,5.697,446,12.66,448,8.196,506,12.154,563,4.67]],["keywords/571",[]],["title/572",[397,533.295,647,948.392]],["content/572",[70,4.23,93,6.678,94,4.565,208,6.506,218,5.605,473,6.012,571,8.451,653,9.563,654,11.781,655,10.009,787,13.131,2013,13.131]],["keywords/572",[]],["title/573",[563,364.389,2484,987.814]],["content/573",[25,6.859,72,5.574,345,10.306,1270,15.706]],["keywords/573",[]],["title/574",[563,364.389,2536,1203.639]],["content/574",[66,14.519,780,12.073,1173,13.457,1174,12.362,2338,16.216]],["keywords/574",[]],["title/575",[563,364.389,2537,1203.639]],["content/575",[50,8.179,527,11.095,571,9.592,1081,13.343,1174,11.36,1175,12.367,1176,11.988,1272,14.01]],["keywords/575",[]],["title/576",[78,571.283,563,364.389]],["content/576",[78,8.921,202,6.941,563,5.69]],["keywords/576",[]],["title/577",[1530,996.069]],["content/577",[37,6.278,72,4.841,93,7.38,140,7.584,202,5.846,307,11.349,769,11.062,2479,14.511,2538,15.831]],["keywords/577",[]],["title/578",[151,570.286,397,440.817,2539,994.919]],["content/578",[33,12.645,164,9.104,332,7.984,338,8.931,544,8.084,571,11.211,2238,12.645,2540,14.674,2541,14.674,2542,14.674]],["keywords/578",[]],["title/579",[93,710.029]],["content/579",[6,4.686,93,6.097,135,9.14,161,4.772,169,5.843,447,7.299,506,10.307,544,7.206,549,8.095,563,3.96,571,7.717,651,8.926,1454,10.735,1458,11.272,2543,13.08,2544,13.08,2545,13.08]],["keywords/579",[]],["title/580",[7,630.003]],["content/580",[]],["keywords/580",[]],["title/581",[2382,1250.059]],["content/581",[]],["keywords/581",[]],["title/582",[2482,1396.187]],["content/582",[]],["keywords/582",[]],["title/583",[73,369.72,211,325.371,849,625.161]],["content/583",[1,3.184,7,4.219,10,5.358,46,6.809,58,3.251,62,3.939,63,6.11,73,4.448,161,3.721,203,4.519,211,5.338,228,4.755,286,7.313,293,5.55,467,8.259,473,4.281,829,7.759,849,12.843,1286,6.961,1667,9.35,1675,8.79,1676,8.79]],["keywords/583",[]],["title/584",[563,364.389,1616,803.489]],["content/584",[202,6.004,203,7.204,305,7.263,533,9.319,568,6.824,1408,14.903,1872,11.988,2546,16.259]],["keywords/584",[]],["title/585",[518,680.567,563,364.389]],["content/585",[6,3.85,19,4.233,60,2.86,202,5.675,208,6.98,305,4.8,525,6.34,572,8.975,783,11.016,799,6.893,824,7.174,923,8.175,1004,9.26,1007,9.26,1012,9.26,1013,9.26,1402,7.924,2547,10.746,2548,10.746]],["keywords/585",[]],["title/586",[2501,1091.948]],["content/586",[91,5.498,104,7.732,211,4.576,228,6.374,407,7.732,518,7.732,617,8.323,738,8.612,766,7.103,1211,6.951,2549,11.783,2550,13.674,2551,13.674]],["keywords/586",[]],["title/587",[2483,1396.187]],["content/587",[]],["keywords/587",[]],["title/588",[7,350.695,73,369.72,575,410.018,2552,847.889]],["content/588",[1,3.783,6,4.342,7,6.916,11,2.19,23,3.241,36,3.464,50,3.933,70,3.579,73,5.285,94,2.491,109,3.306,150,8.271,163,4.923,164,3.745,186,2.869,211,1.972,286,5.604,457,6.097,549,7.5,567,3.551,689,3.974,703,4.838,731,4.253,813,5.946,1235,5.334,1244,9.219,1387,7.165,1823,6.161,1945,11.109,2134,7.165,2553,7.817,2554,7.817,2555,7.817,2556,7.817]],["keywords/588",[]],["title/589",[73,664.179]],["content/589",[64,8.1,67,5.759,85,6.452,161,5.226,165,10.269,293,7.794,544,7.892,563,4.337,689,7.282,797,8.581,817,9.775,818,10.269,2557,14.325]],["keywords/589",[]],["title/590",[94,169.818,163,335.567,164,255.275,165,382.019,397,236.105,817,363.64,818,382.019,1605,459.193]],["content/590",[1,2.042,6,2.344,11,2.95,23,4.05,58,2.085,73,2.853,94,4.826,96,3.134,109,2.767,110,3.399,136,2.923,143,4.572,163,6.631,164,5.045,165,7.549,185,3.292,208,2.972,393,5.37,448,3.476,462,6.631,467,3.651,544,3.605,568,4.42,572,2.726,694,5.998,731,3.56,803,3.982,817,4.465,818,4.691,874,4.824,1052,3.362,1192,4.572,1500,5.37,1532,5.998,1563,4.465,1604,5.998,1605,9.074,1607,10.845,1653,5.156,1823,3.326,2206,5.37,2558,5.37,2559,10.531,2560,5.998,2561,6.543,2562,10.531]],["keywords/590",[]],["title/591",[211,303.58,563,364.389]],["content/591",[52,9.95,202,6.505,211,5.023,467,7.299,651,12.02,1042,10.735,1131,11.99,1503,10.307,1530,8.554,1823,6.649,2563,13.08,2564,11.99,2565,13.08]],["keywords/591",[]],["title/592",[2501,1091.948]],["content/592",[23,4.233,58,5.045,153,7.014,211,3.993,572,6.596,738,7.514,1211,8.048,1324,9.969,1335,11.673]],["keywords/592",[]],["title/593",[2488,1396.187]],["content/593",[]],["keywords/593",[]],["title/594",[73,433.832,211,250.937,849,733.569]],["content/594",[1,3.423,6,3.031,11,4.028,13,3.506,14,8.643,36,2.223,46,3.349,58,1.599,62,1.937,63,3.005,94,2.696,108,2.279,140,2.403,143,5.911,152,2.666,153,2.223,158,4.991,196,2.666,202,1.853,211,4.396,275,4.323,292,5.576,418,9.452,433,4.117,467,4.721,473,4.604,544,2.764,563,1.519,567,2.279,656,3.506,775,3.218,812,3.349,814,5.911,829,3.816,849,11.497,1076,3.597,1175,3.816,1176,3.699,1190,3.816,1434,3.699,1435,7.29,1500,4.117,1609,3.597,1673,4.599,1674,10.054,1791,3.506,1823,2.55,2133,4.599,2558,4.117,2566,5.017,2567,5.017,2568,5.017,2569,5.017,2570,5.017,2571,5.017,2572,5.017]],["keywords/594",[]],["title/595",[243,757.951,563,364.389]],["content/595",[37,3.978,72,3.067,91,5.878,149,5.672,153,6.478,158,5.918,202,7.002,208,4.556,210,5.392,241,8.643,242,6.105,243,10.864,244,6.433,245,9.977,246,8.232,252,8.643,284,8.643,332,5.458,1111,9.194,2573,10.031,2574,10.031,2575,10.031,2576,9.194]],["keywords/595",[]],["title/596",[2493,1396.187]],["content/596",[]],["keywords/596",[]],["title/597",[103,379.549,104,417.69,106,375.53,118,383.707,563,223.64]],["content/597",[60,4.197,63,9.446,91,6.34,103,8.102,104,8.916,105,7.439,106,8.016,119,7.439,125,5.195,158,6.575,192,8.477,202,4.116,448,5.921,817,7.605,2494,10.215,2495,10.215,2496,10.215,2577,11.144,2578,11.144]],["keywords/597",[]],["title/598",[518,680.567,563,364.389]],["content/598",[36,5.554,58,5.454,75,4.872,467,6.995,568,5.261,600,10.802,602,11.491,689,6.373,854,10.802,871,14.367,967,11.491,1872,9.243,2527,10.802,2579,12.536,2580,12.536,2581,12.536]],["keywords/598",[]],["title/599",[563,364.389,1616,803.489]],["content/599",[202,6.347,473,7.213,558,10.139,812,11.473,1298,12.672,2582,14.81]],["keywords/599",[]],["title/600",[397,533.295,1436,821.36]],["content/600",[1,3.022,7,4.005,18,2.574,19,4.85,21,4.49,25,4.634,29,2.615,79,4.028,86,3.482,94,3.924,103,3.032,104,3.337,105,3.94,140,2.827,151,3.383,159,5.404,160,8.083,164,2.827,169,5.501,190,4.352,199,4.124,211,1.489,294,2.939,310,4.352,332,3.211,334,4.028,448,3.136,473,2.477,495,3.652,622,8.604,681,3.136,708,3.535,731,3.211,752,3.173,780,4.028,918,4.65,1038,3.652,1192,4.124,1211,3,1235,4.028,1375,3.785,1436,6.608,1534,8.345,1651,5.41,1823,4.923,1893,5.086,2344,4.844,2583,5.902,2584,5.902,2585,5.902,2586,5.902,2587,5.41,2588,5.902]],["keywords/600",[]],["title/601",[672,618.422,673,632.214]],["content/601",[37,6.278,72,6.1,285,9.797,355,12.992,672,8.134,673,8.315,676,14.511,1823,8.048]],["keywords/601",[]],["title/602",[2589,1523.181]],["content/602",[7,4.609,18,4.859,19,4.39,60,2.966,62,4.303,63,6.676,64,6.301,74,6.783,86,6.575,408,6.301,448,5.921,459,8.217,571,6.575,622,7.787,1192,7.787,1298,8.217,1823,5.665,2590,11.144,2591,11.144,2592,11.144,2593,11.144,2594,11.144,2595,16.776]],["keywords/602",[]],["title/603",[2596,1523.181]],["content/603",[]],["keywords/603",[]],["title/604",[60,196.623,73,322.117,292,375.53,478,423.433,858,582.065]],["content/604",[1,2.16,6,3.945,8,5.678,11,1.938,15,10.434,18,3.017,22,3.765,35,3.17,36,3.066,58,2.205,60,4.162,62,2.672,63,4.145,70,4.618,73,4.802,76,5.962,94,2.205,164,3.315,169,4.919,185,3.481,186,2.54,211,1.745,286,4.96,292,3.517,478,8.963,662,4.438,708,4.145,858,12.321,1454,9.037,1599,5.962,1823,3.517,2597,6.919,2598,6.919,2599,6.919,2600,6.919,2601,6.919,2602,6.919,2603,6.919,2604,6.919,2605,6.919]],["keywords/604",[]],["title/605",[23,226.713,73,562.517,292,431.026]],["content/605",[1,2.472,5,2.551,6,5.362,7,3.276,11,4.192,23,2.118,30,2.98,62,3.058,63,4.744,65,3.66,73,6.526,76,6.825,79,5.405,83,7.118,94,3.902,166,4.208,185,3.984,186,2.907,215,5.287,292,6.224,457,6.159,524,6.24,525,4.672,544,4.363,576,5.534,662,5.08,703,4.901,767,6.025,775,5.08,776,7.26,777,7.26,781,6.5,1036,5.534,1823,4.026,1955,6.025,2002,6.825,2606,7.92]],["keywords/605",[]],["title/606",[2607,1523.181]],["content/606",[]],["keywords/606",[]],["title/607",[1529,976.936]],["content/607",[7,5.295,11,3.586,18,5.582,164,6.133,198,8.546,203,5.672,211,3.229,212,11.135,228,5.968,692,7.553,839,8.736,1514,11.735,2608,12.802,2609,12.802,2610,12.802,2611,12.802,2612,12.802]],["keywords/607",[]],["title/608",[2613,1523.181]],["content/608",[]],["keywords/608",[]],["title/609",[518,680.567,563,364.389]],["content/609",[23,2.596,91,3.903,103,4.987,119,6.48,149,8.071,158,5.727,202,6.252,203,4.301,222,4.739,294,4.834,338,10.304,467,5.417,511,8.365,515,8.898,520,8.833,530,5.564,567,4.409,572,4.044,604,8.365,672,4.987,916,8.898,933,8.898,934,8.898,962,8.898,1081,7.967,2614,9.707,2615,9.707]],["keywords/609",[]],["title/610",[563,364.389,1616,803.489]],["content/610",[18,6.701,25,4.044,30,4.044,56,7.653,58,4.897,60,2.86,75,4.177,109,4.544,202,3.969,203,4.761,210,8.261,305,4.8,317,9.85,558,6.34,568,6.45,873,8.82,1268,9.85,1284,9.26,1285,14.086,1499,8.175,1823,5.463]],["keywords/610",[]],["title/611",[2501,1091.948]],["content/611",[23,3.155,50,5.936,93,5.5,211,4.14,238,9.297,261,8.7,302,7.877,473,4.952,476,9.683,480,8.975,481,9.297,575,5.706,589,10.167,625,5.817,738,5.6,902,10.167,1211,5.998,2549,10.167,2616,11.799,2617,11.799,2618,11.799]],["keywords/611",[]],["title/612",[1529,976.936]],["content/612",[78,7.139,101,8.504,184,10.782,338,9.154,730,10.782,738,7.139,742,12.344,1038,9.307,1077,8.621,1633,12.96,2619,15.04]],["keywords/612",[]],["title/613",[2620,1523.181]],["content/613",[]],["keywords/613",[]],["title/614",[211,213.853,397,375.673,490,607.84,1610,695.854]],["content/614",[6,2.294,7,4.281,10,3.364,11,2.899,18,2.792,23,1.712,25,2.41,36,2.837,64,3.621,73,4.513,74,3.898,79,4.37,85,2.884,94,2.041,108,2.909,109,4.376,110,3.326,114,3.898,196,5.499,211,4.141,242,3.898,250,7.419,254,3.778,348,4.722,353,4.188,411,3.836,429,3.778,430,4.475,457,6.552,490,10.722,544,3.528,672,3.29,673,5.436,689,3.256,698,5.87,699,7.063,803,6.299,816,5.256,831,4.722,844,4.591,1149,4.871,1484,5.87,1823,3.256,1911,5.256,2621,6.404,2622,6.404,2623,6.404]],["keywords/614",[]],["title/615",[2501,1091.948]],["content/615",[35,6.264,51,9.128,80,11.222,93,6.374,211,5.136,738,6.49,775,8.771,814,9.555,1211,9.224,1402,10.082,1791,9.555,2393,10.402]],["keywords/615",[]],["title/616",[2624,1523.181]],["content/616",[]],["keywords/616",[]],["title/617",[211,303.58,563,364.389]],["content/617",[5,5.535,211,4.335,305,7.677,846,14.105,1160,14.81,2625,17.186]],["keywords/617",[]],["title/618",[73,524.844,397,533.295]],["content/618",[18,6.616,83,10.326,84,4.966,108,4.795,109,4.464,211,5.401,429,8.952,575,5.106,1154,9.678,1664,9.678,1665,9.678,1666,9.678,1911,12.453,2626,10.558,2627,10.558,2628,10.558,2629,10.558,2630,10.558]],["keywords/618",[]],["title/619",[397,533.295,814,841.022]],["content/619",[6,5.013,23,3.741,94,5.871,136,6.25,163,8.811,211,3.529,302,9.34,549,8.659,1077,8.02,2143,12.826,2267,12.826,2431,12.826,2631,13.992]],["keywords/619",[]],["title/620",[2501,1091.948]],["content/620",[1,5.364,203,7.615,211,4.335,293,9.351,1389,13.073,2549,14.81]],["keywords/620",[]],["title/621",[2632,1523.181]],["content/621",[]],["keywords/621",[]],["title/622",[23,266.026,520,615.687,563,301.201]],["content/622",[1,2.717,6,3.118,8,4.259,9,3.827,10,2.726,11,1.454,23,4.917,57,3.062,65,2.398,67,3.5,72,1.587,82,4.089,91,2.087,92,3.465,93,4.057,94,2.774,140,2.486,143,3.626,158,3.062,161,3.175,186,3.195,187,4.089,202,1.917,208,3.953,294,2.585,305,2.318,408,2.935,447,2.896,449,4.089,475,3.626,517,4.757,518,6.356,519,5.692,520,11.753,521,4.472,522,7.501,530,2.975,563,3.403,567,3.953,568,2.178,571,3.062,572,3.626,597,4.757,871,3.827,952,4.757,1789,4.757,2275,4.259,2453,4.472,2558,4.259,2560,4.757,2633,5.19,2634,5.19,2635,5.19,2636,5.19]],["keywords/622",[]],["title/623",[2501,1091.948]],["content/623",[23,3.284,91,4.937,153,5.441,208,5.578,211,4.862,222,5.996,490,8.804,575,5.938,738,5.829,1211,6.243,1432,11.256,1676,10.582,1829,11.256,2059,11.256,2564,11.256,2637,12.28,2638,12.28,2639,12.28]],["keywords/623",[]],["title/624",[231,1396.187]],["content/624",[]],["keywords/624",[]],["title/625",[1529,976.936]],["content/625",[212,9.412,222,7.164,229,11.162,233,9.796,339,11.162,766,7.622,1038,9.081,1489,12.645,2640,14.674,2641,14.674,2642,14.674,2643,13.451]],["keywords/625",[]],["title/626",[2501,1091.948]],["content/626",[22,7.794,35,6.562,74,8.719,153,6.347,198,9.563,212,9.188,229,10.897,305,6.399,703,8.865,738,6.799,1637,10.562,2644,14.325,2645,14.325]],["keywords/626",[]],["title/627",[203,533.295,2646,1203.639]],["content/627",[1,3.567,6,5.068,11,3.201,12,4.047,18,3.162,23,1.939,25,2.729,75,2.819,85,3.267,94,2.311,135,5.067,136,5.106,139,5.517,140,3.474,150,4.949,158,6.743,169,5.106,218,2.838,250,5.199,445,4.567,457,5.75,544,3.995,576,5.067,642,4.949,672,5.873,775,4.652,1026,4.414,1057,4.743,1076,5.199,1077,4.157,1090,4.652,1428,5.952,1745,5.952,1787,5.714,1823,3.687,1868,5.952,1898,4.652,1955,5.517,2164,6.249,2204,6.249,2647,7.252,2648,7.252,2649,7.252,2650,7.252,2651,7.252]],["keywords/627",[]],["title/628",[2652,1523.181]],["content/628",[]],["keywords/628",[]],["title/629",[50,500.531,292,505.769,563,301.201]],["content/629",[1,3.199,6,4.628,7,4.839,11,2.871,16,2.569,17,2.643,19,4.608,20,2.504,35,4.695,41,1.617,50,3.183,67,1.441,70,1.868,72,1.096,78,1.701,80,2.941,94,1.142,118,1.862,136,1.601,140,1.717,143,4.421,145,3.088,159,3.53,161,1.307,169,1.601,185,3.183,186,1.315,187,2.824,198,2.392,202,3.137,208,3.858,211,1.596,239,2.299,276,1.95,290,3.285,292,5.947,293,1.95,295,3.285,303,1.974,305,2.826,307,4.536,334,2.446,335,7.161,397,1.588,450,3.088,462,2.257,507,2.114,522,3.088,527,4.317,541,2.504,544,1.974,549,2.218,563,2.571,608,2.824,672,1.841,673,1.882,697,5.799,700,2.726,738,1.701,748,2.824,767,6.461,770,2.344,775,4.058,788,2.941,805,2.446,1033,2.299,1077,2.054,1161,2.824,1402,2.643,1500,2.941,1542,2.941,1588,3.285,1654,3.088,1910,3.088,1955,2.726,2379,3.285,2526,2.941,2653,3.584,2654,3.584,2655,3.584,2656,3.584,2657,3.584,2658,3.584,2659,3.285,2660,3.584,2661,3.584,2662,3.584,2663,3.584,2664,3.584,2665,3.584]],["keywords/629",[]],["title/630",[23,266.026,106,505.769,563,301.201]],["content/630",[1,1.296,6,1.488,8,3.408,23,5.067,41,1.061,56,2.068,72,1.27,75,1.614,91,1.669,93,5.295,94,1.323,103,4.893,106,6.531,109,1.756,141,2.977,143,5.028,159,2.317,161,1.515,166,3.823,185,2.089,186,2.641,187,3.272,202,3.517,203,1.84,208,4.325,210,5.119,238,3.272,258,3.408,345,2.348,408,2.348,437,3.272,447,2.317,449,3.272,457,2.089,461,3.062,475,2.901,486,3.062,507,2.45,511,3.578,512,2.901,513,3.408,514,6.201,563,3.439,567,1.886,582,3.578,588,2.45,589,3.578,738,3.416,775,2.663,927,3.272,1161,3.272,1270,3.578,1426,3.159,1499,3.159,1531,3.408,1582,3.806,1610,3.408,1634,3.806,1788,3.408,1854,3.806,2222,3.806,2275,3.408,2643,3.806,2659,3.806,2666,8.729,2667,3.408,2668,4.152,2669,4.152,2670,3.578,2671,4.152,2672,4.152,2673,4.152,2674,4.152,2675,4.152,2676,4.152,2677,4.152,2678,4.152,2679,3.806,2680,4.152]],["keywords/630",[]],["title/631",[2681,1523.181]],["content/631",[]],["keywords/631",[]],["title/632",[563,364.389,1318,915.574]],["content/632",[6,3.993,11,3.121,12,6.218,37,6.254,50,5.606,72,4.822,75,4.331,145,9.603,215,12.217,530,6.388,533,6.388,673,9.613,1318,11.995,1872,8.217,2526,9.146,2667,9.146,2682,11.144,2683,11.144]],["keywords/632",[]],["title/633",[518,680.567,563,364.389]],["content/633",[23,3.741,50,7.039,58,4.459,109,5.917,277,11.025,293,7.613,353,12.047,428,10.031,429,8.255,437,11.025,1448,12.826,2684,13.992,2685,13.992]],["keywords/633",[]],["title/634",[563,364.389,763,987.814]],["content/634",[1,3.996,6,4.587,65,5.916,118,6.65,202,6.411,276,6.966,293,6.966,301,7.792,518,7.239,533,9.951,563,3.876,617,10.566,763,10.507,1823,6.508,2667,10.507]],["keywords/634",[]],["title/635",[426,1103.286,563,364.389]],["content/635",[4,9.243,10,6.585,12,6.995,18,5.466,56,6.243,72,3.834,75,4.872,202,4.629,203,5.554,427,11.491,428,8.987,429,7.396,430,8.759,774,8.759,844,8.987,1197,11.491,2679,11.491,2686,12.536,2687,12.536]],["keywords/635",[]],["title/636",[2384,927.048]],["content/636",[22,7.44,35,6.264,37,5.423,60,3.64,72,4.182,125,6.374,335,12.678,789,11.783,1637,10.082,1825,12.534,2238,11.783,2576,12.534,2688,13.674,2689,13.674]],["keywords/636",[]],["title/637",[2690,1523.181]],["content/637",[]],["keywords/637",[]],["title/638",[153,375.673,345,479.417,563,390.545]],["content/638",[72,5.567,152,7.952,153,6.631,160,6.29,194,4.478,202,4.521,216,10.213,217,4.82,221,5.534,224,6.025,276,4.309,293,4.309,307,5.678,342,6.825,343,6.825,345,4.478,355,6.5,365,10.55,388,7.26,407,6.923,410,7.26,465,4.309,775,5.08,1060,5.534,1431,7.26,1823,4.026,2667,6.5,2691,7.92,2692,7.92,2693,7.92,2694,7.92,2695,7.92,2696,7.92]],["keywords/638",[]],["title/639",[563,301.201,1324,626.516,1616,664.158]],["content/639",[58,4.676,109,6.205,153,6.502,202,5.419,305,6.555,575,7.096,1324,9.24,1329,12.645,1335,10.819,2697,14.674,2698,14.674,2699,14.674]],["keywords/639",[]],["title/640",[1529,976.936]],["content/640",[7,5.656,29,6.059,101,7.732,211,3.449,222,6.676,338,11.044,339,10.402,738,6.49,766,7.103,1038,11.229,2005,10.402,2045,11.783,2700,13.674]],["keywords/640",[]],["title/641",[2384,927.048]],["content/641",[6,4.491,23,3.352,36,5.554,62,4.84,63,7.509,65,5.792,83,7.288,299,7.63,305,5.6,458,10.288,473,5.261,656,8.759,681,6.66,689,6.373,1135,10.288,1179,11.491,1994,12.618,2701,12.536]],["keywords/641",[]],["title/642",[226,1396.187]],["content/642",[]],["keywords/642",[]],["title/643",[25,319.055,509,533.929,563,390.545]],["content/643",[6,2.016,18,2.453,25,6.58,28,3.679,29,4.125,51,3.756,60,1.498,67,2.262,72,2.847,91,3.743,93,2.623,104,5.264,105,7.949,106,2.86,129,4.033,143,3.931,152,2.989,153,2.493,186,2.065,202,2.078,203,2.493,338,7.248,349,4.617,394,5.157,408,3.181,445,3.543,448,4.946,509,9.655,510,4.148,563,2.818,651,3.839,660,4.433,1178,5.157,1192,3.931,1232,4.617,1244,4.28,1255,9.383,1284,4.848,1298,4.148,1434,4.148,1499,4.28,1609,4.033,1821,4.617,1872,4.148,2393,4.28,2582,4.848,2666,5.157,2702,5.626,2703,5.626,2704,5.626,2705,9.31,2706,5.626,2707,5.626,2708,5.626,2709,5.626]],["keywords/643",[]],["title/644",[93,561.075,397,533.295]],["content/644",[25,5.54,28,5.046,34,4.776,35,3.535,70,3.544,75,2.999,91,7.657,92,5.152,104,9.39,119,11.086,125,5.593,186,2.832,338,7.303,348,5.69,408,4.363,486,5.69,508,6.65,509,4.86,510,5.69,519,5.046,578,9.443,768,6.65,927,6.081,1089,7.074,1255,6.081,2710,7.717,2711,7.717,2712,7.717,2713,7.717,2714,7.717,2715,7.717]],["keywords/644",[]],["title/645",[1529,976.936]],["content/645",[104,7.912,157,8.659,203,6.199,222,6.832,224,10.643,229,10.643,233,9.34,236,7.97,305,6.25,339,10.643,692,8.255,702,9.548,2045,12.057]],["keywords/645",[]],["title/646",[518,680.567,563,364.389]],["content/646",[12,9.072,18,7.089,202,6.004,596,14.01,1057,10.632,2517,14.903,2518,14.903,2519,14.903]],["keywords/646",[]],["title/647",[2384,927.048]],["content/647",[1,4.922,11,3.121,30,4.193,125,5.195,127,5.665,164,5.339,203,4.938,205,5.726,478,6.388,568,4.677,575,5.389,617,9.598,731,6.064,775,7.148,953,8.781,1135,9.146,1403,10.215,1531,9.146,1729,8.781,2716,11.144,2717,11.144,2718,11.144,2719,11.144]],["keywords/647",[]],["title/648",[1935,1396.187]],["content/648",[]],["keywords/648",[]],["title/649",[93,561.075,397,533.295]],["content/649",[93,8.247,161,6.454,293,9.626,485,16.216,488,16.216]],["keywords/649",[]],["title/650",[1529,976.936]],["content/650",[6,4.686,11,3.664,18,5.704,67,5.259,222,6.386,228,6.097,236,5.659,335,9.14,339,9.95,692,10.392,702,13.59,1066,9.95,1993,11.99,2720,13.08]],["keywords/650",[]],["title/651",[2384,927.048]],["content/651",[1,2.409,3,5.69,6,4.299,10,4.053,11,2.161,23,2.063,63,4.623,65,5.544,94,3.824,118,4.008,125,3.597,136,5.36,157,4.776,179,4.306,202,4.431,203,3.419,211,3.026,222,3.768,230,6.081,457,3.882,549,4.776,574,7.074,575,3.732,579,10.999,580,7.074,586,6.333,648,6.333,1211,3.923,1609,5.532,2422,7.074,2463,7.074,2587,7.074,2670,6.65,2721,7.717,2722,7.717,2723,7.717,2724,7.717,2725,7.717,2726,7.717,2727,7.717,2728,7.717,2729,7.717]],["keywords/651",[]],["title/652",[397,440.817,672,511.183,673,522.583]],["content/652",[35,6.722,305,6.555,593,12.043,690,13.451,692,8.657,693,12.043,701,12.645,702,10.013,774,10.253,1895,10.819,2206,12.043,2730,14.674]],["keywords/652",[]],["title/653",[2731,1523.181]],["content/653",[]],["keywords/653",[]],["title/654",[211,303.58,563,364.389]],["content/654",[56,8.81,211,4.462,305,7.903,1149,13.457,1226,15.245]],["keywords/654",[]],["title/655",[518,680.567,563,364.389]],["content/655",[23,4.45,125,7.757,166,8.841,202,4.444,222,5.876,244,7.719,305,5.376,564,13.112,585,10.371,586,9.877,885,12.658,2525,11.032,2526,13.657,2527,10.371,2528,11.032]],["keywords/655",[]],["title/656",[135,1064.296]],["content/656",[11,4.213,772,10.04,1077,8.621,1393,13.786,1939,17.699,1958,13.786,2732,15.04,2733,19.308,2734,15.04]],["keywords/656",[]],["title/657",[2384,927.048]],["content/657",[50,7.039,96,6.703,125,6.522,161,5.104,202,5.167,203,6.199,211,3.529,447,7.808,550,12.826,623,12.826,2388,12.826,2670,12.057,2735,13.992,2736,13.992]],["keywords/657",[]],["title/658",[2737,1523.181]],["content/658",[]],["keywords/658",[]],["title/659",[397,533.295,806,948.392]],["content/659",[1,4.558,5,2.454,13,5.324,18,3.322,37,3.022,38,5.086,49,5.796,57,4.495,73,3.322,94,3.786,109,5.024,113,8.517,125,3.552,127,3.873,151,4.367,164,5.691,169,6.523,293,4.146,407,4.308,478,4.367,558,4.495,575,3.685,588,4.495,622,5.324,806,6.004,1000,8.107,1057,7.769,1100,5.618,1436,5.199,1530,4.983,1608,6.984,1610,6.253,1613,10.89,1680,6.253,2344,11.985,2530,6.984,2738,7.619]],["keywords/659",[]],["title/660",[211,303.58,563,364.389]],["content/660",[293,10.227,2739,18.796,2740,18.796]],["keywords/660",[]],["title/661",[397,440.817,672,511.183,673,522.583]],["content/661",[11,3.919,19,7.256,25,5.265,72,4.279,79,9.548,110,7.268,293,7.613,332,7.613,575,6.766,688,12.826,689,7.113,803,8.516,1913,12.826]],["keywords/661",[]],["title/662",[2455,1200.171]],["content/662",[5,4.968,23,4.125,34,9.546,480,11.734,738,7.321,823,8.968,1211,7.842,1324,9.714,1990,13.292,2741,15.426]],["keywords/662",[]],["title/663",[2742,1523.181]],["content/663",[]],["keywords/663",[]],["title/664",[243,757.951,563,364.389]],["content/664",[10,8.102,103,7.926,118,8.012,153,6.835,203,6.835,243,12.357,244,9.894,305,6.891,563,4.67]],["keywords/664",[]],["title/665",[73,524.844,397,533.295]],["content/665",[18,4.771,19,4.31,58,3.487,59,8.98,85,4.928,160,5.622,218,4.281,254,6.455,292,5.562,411,6.554,544,6.028,558,6.455,655,7.645,681,10.486,689,5.562,734,9.429,794,7.467,1458,9.429,1650,10.029,1653,8.621,2743,10.942,2744,10.942,2745,10.942]],["keywords/665",[]],["title/666",[563,301.201,672,511.183,673,522.583]],["content/666",[5,4.506,22,7.613,72,5.634,112,11.025,148,7.708,205,9.465,293,7.613,457,7.039,465,7.613,568,5.873,687,12.826,769,9.777]],["keywords/666",[]],["title/667",[2455,1200.171]],["content/667",[85,6.022,91,5.376,151,7.664,203,5.924,218,5.231,473,5.612,478,7.664,524,10.535,572,5.571,681,7.104,738,8.484,1211,6.797,2746,13.371,2747,13.371,2748,12.256]],["keywords/667",[]],["title/668",[2749,1523.181]],["content/668",[]],["keywords/668",[]],["title/669",[211,303.58,563,364.389]],["content/669",[56,8.559,72,5.256,161,6.27,211,4.335,821,10.823,1113,15.754]],["keywords/669",[]],["title/670",[563,364.389,1616,803.489]],["content/670",[60,4.214,72,4.841,215,10.568,571,9.34,673,8.315,865,10.803,1257,12.474,1318,12.042,2750,15.831]],["keywords/670",[]],["title/671",[397,440.817,473,417.58,681,528.598]],["content/671",[1,4.941,18,6.903,29,7.014,94,6.357,473,6.645,681,10.598,1823,8.048]],["keywords/671",[]],["title/672",[73,524.844,397,533.295]],["content/672",[59,12.043,83,8.531,254,8.657,293,7.984,411,8.79,473,7.976,486,10.819,681,10.097,2751,14.674,2752,14.674]],["keywords/672",[]],["title/673",[2753,1523.181]],["content/673",[]],["keywords/673",[]],["title/674",[563,364.389,2582,1037.186]],["content/674",[31,13.131,37,5.681,58,5.962,129,10.269,192,10.897,510,10.562,987,13.131,1255,11.287,1298,10.562,2754,14.325,2755,14.325,2756,14.325]],["keywords/674",[]],["title/675",[19,391.886,397,440.817,563,301.201]],["content/675",[6,2.423,10,3.553,19,7.733,23,1.809,25,5.809,37,2.682,45,5.828,57,3.99,59,5.551,62,2.612,65,3.125,67,2.719,83,6.287,85,3.046,86,3.99,109,2.86,147,4.423,203,2.997,208,3.072,276,3.68,408,6.115,447,3.774,448,3.594,509,4.259,558,3.99,672,5.556,684,5.828,719,5.828,752,5.813,1386,4.616,1486,5.828,1635,6.2,2325,6.2,2327,6.2,2595,12.385,2757,6.764,2758,6.764,2759,6.764,2760,6.764,2761,6.764,2762,10.814,2763,6.764,2764,6.764]],["keywords/675",[]],["title/676",[163,626.516,164,476.607,397,440.817]],["content/676",[18,5.963,83,7.95,94,4.358,109,5.782,203,6.059,549,8.462,651,9.331,731,7.44,797,8.191,799,8.771,874,10.082,1244,10.402,1621,11.222,1823,6.951,2765,13.674]],["keywords/676",[]],["title/677",[25,319.055,397,375.673,507,500.214,2766,847.889]],["content/677",[1,4.563,6,3.594,11,4.095,16,7.191,17,7.396,18,4.374,19,3.951,21,7.63,24,7.903,25,5.502,65,4.635,118,5.21,159,5.597,465,7.955,495,6.207,507,5.918,509,6.316,575,4.851,806,7.903,1019,9.194,1190,7.63,1516,8.643,1626,9.194,1628,8.643,1823,5.099,2767,10.031,2768,10.031]],["keywords/677",[]],["title/678",[563,364.389,2323,1103.286]],["content/678",[6,5.986,19,6.582,50,8.406,93,7.789,94,5.325,169,7.464,448,8.878]],["keywords/678",[]],["title/679",[563,364.389,2769,1203.639]],["content/679",[11,4.321,19,6.076,93,9.147,94,4.916,169,6.891,448,8.196,766,8.012,768,13.292,2212,12.66]],["keywords/679",[]],["title/680",[19,474.098,563,364.389]],["content/680",[11,3.511,19,7.675,72,3.834,92,8.368,93,7.978,160,8.793,448,10.353,457,6.307,465,6.821,752,6.739,2748,11.491,2770,12.536,2771,12.536]],["keywords/680",[]],["title/681",[78,571.283,563,364.389]],["content/681",[56,6.81,74,8.323,78,8.612,132,7.026,208,6.211,303,7.533,448,7.265,637,8.942,642,9.331,731,7.44,1563,9.331,2772,13.674,2773,13.674,2774,13.674]],["keywords/681",[]],["title/682",[93,710.029]],["content/682",[11,2.719,19,5.623,51,6.48,57,5.727,67,5.739,93,4.525,94,3.093,158,8.421,160,4.987,169,4.336,179,5.417,447,5.417,464,8.898,475,9.974,498,8.898,499,8.898,501,8.898,502,8.898,503,8.898,666,8.365,927,7.649,1000,6.624,1244,7.384,1454,7.967,2313,8.898,2775,9.707,2776,9.707,2777,9.707,2778,9.707]],["keywords/682",[]],["title/683",[35,551.372,125,561.075]],["content/683",[19,4.018,74,6.208,78,9.07,125,4.755,132,5.241,444,8.037,563,3.088,564,15.988,609,8.371,634,9.35,635,9.35,637,9.679,639,8.371,640,13.567,642,6.961,644,12.754,2779,10.2,2780,10.2,2781,10.2,2782,10.2]],["keywords/683",[]],["title/684",[1211,611.873,1556,915.574]],["content/684",[6,3.85,23,2.873,39,11.689,46,7.174,58,4.897,83,6.248,86,9.066,109,6.498,114,6.541,461,7.924,473,6.45,556,7.028,567,4.881,679,8.82,738,7.294,752,5.777,1211,5.463,2558,12.612,2783,10.746,2784,10.746]],["keywords/684",[]],["title/685",[672,618.422,673,632.214]],["content/685",[23,4.595,37,6.816,83,9.992,228,8.011,533,9.851,678,14.105]],["keywords/685",[]]],"invertedIndex":[["",{"_index":70,"title":{"399":{"position":[[100,2]]},"428":{"position":[[34,1]]}},"content":{"7":{"position":[[198,1],[212,3]]},"9":{"position":[[276,1],[329,1],[331,2]]},"13":{"position":[[202,1]]},"16":{"position":[[93,3],[106,1]]},"24":{"position":[[56,1]]},"28":{"position":[[381,1]]},"30":{"position":[[59,1]]},"32":{"position":[[113,1]]},"35":{"position":[[63,1]]},"39":{"position":[[98,1],[137,2],[147,1],[183,1],[223,3],[227,2]]},"42":{"position":[[267,1]]},"44":{"position":[[29,1]]},"46":{"position":[[186,1]]},"48":{"position":[[199,1]]},"50":{"position":[[427,1]]},"53":{"position":[[322,1],[394,1],[418,1]]},"55":{"position":[[134,1]]},"62":{"position":[[199,1],[261,2]]},"66":{"position":[[264,1],[310,1]]},"72":{"position":[[275,2]]},"79":{"position":[[761,2],[770,1],[835,3]]},"82":{"position":[[116,1],[159,1],[351,1],[481,1],[547,1],[549,1]]},"88":{"position":[[27,1],[87,1]]},"89":{"position":[[197,1],[257,1],[326,2],[344,1],[382,1],[389,1],[441,1]]},"92":{"position":[[256,2]]},"95":{"position":[[46,1]]},"97":{"position":[[52,1],[109,2]]},"101":{"position":[[364,1]]},"146":{"position":[[150,1]]},"152":{"position":[[123,3]]},"154":{"position":[[102,1],[133,1],[167,1],[173,2],[188,3]]},"156":{"position":[[100,1],[131,1],[165,1],[171,2],[186,3]]},"159":{"position":[[25,1],[123,1],[178,1],[197,3]]},"162":{"position":[[56,1],[128,3],[141,1],[194,2]]},"165":{"position":[[37,1]]},"167":{"position":[[697,1],[765,1],[767,3],[818,1],[837,2],[848,1],[876,1],[899,2],[967,1],[969,1],[971,3],[975,2],[1085,2],[1192,2]]},"170":{"position":[[171,1]]},"173":{"position":[[41,1],[141,1],[156,2],[174,1],[201,1],[203,3]]},"176":{"position":[[41,1]]},"179":{"position":[[77,1],[151,1],[175,1]]},"184":{"position":[[94,1],[170,2]]},"192":{"position":[[229,1],[409,1]]},"195":{"position":[[26,1]]},"198":{"position":[[26,1],[111,1]]},"201":{"position":[[347,1]]},"208":{"position":[[369,1]]},"212":{"position":[[139,2],[166,1],[168,1],[244,1],[316,1],[343,3],[347,1],[349,1]]},"219":{"position":[[61,1],[118,1]]},"224":{"position":[[62,1]]},"228":{"position":[[64,1]]},"232":{"position":[[63,1]]},"235":{"position":[[158,2]]},"240":{"position":[[116,1]]},"242":{"position":[[14,1]]},"243":{"position":[[648,1],[691,3]]},"245":{"position":[[14,1]]},"247":{"position":[[668,3],[723,3]]},"249":{"position":[[377,1]]},"251":{"position":[[139,1]]},"255":{"position":[[357,1],[507,1],[529,3]]},"260":{"position":[[146,1],[298,1],[317,3]]},"263":{"position":[[190,1],[303,1],[320,2],[338,1],[366,1],[569,1],[571,1],[573,3]]},"265":{"position":[[390,1],[485,1],[502,2],[520,1],[548,1],[595,2],[760,1],[762,1],[764,3],[846,1]]},"267":{"position":[[293,1]]},"270":{"position":[[121,1],[177,1]]},"272":{"position":[[61,1]]},"276":{"position":[[44,1],[99,1],[146,1],[226,6],[233,1],[235,3]]},"280":{"position":[[31,1],[84,1],[124,1],[204,6],[211,1],[213,3]]},"284":{"position":[[29,1],[101,1],[138,3]]},"286":{"position":[[321,4]]},"289":{"position":[[84,1],[200,2],[210,1],[235,1]]},"291":{"position":[[574,1],[576,1],[628,1],[750,1],[752,2]]},"294":{"position":[[26,1]]},"298":{"position":[[221,3],[242,1],[244,3],[386,1]]},"315":{"position":[[184,1],[236,1],[258,1],[303,1],[305,1],[307,1]]},"320":{"position":[[283,1],[574,1]]},"322":{"position":[[165,1],[249,1],[430,1],[524,1],[590,1],[674,1]]},"323":{"position":[[111,1],[215,1]]},"326":{"position":[[109,1],[139,1],[249,1]]},"327":{"position":[[109,1],[139,1],[248,1]]},"331":{"position":[[170,1],[199,1],[251,1],[253,1]]},"362":{"position":[[164,1],[195,1],[228,1]]},"364":{"position":[[165,1],[197,1],[232,1]]},"368":{"position":[[185,1],[241,1],[249,1],[315,1],[382,1]]},"375":{"position":[[164,1],[216,1]]},"381":{"position":[[102,1],[447,1],[585,1],[637,1],[639,1]]},"385":{"position":[[293,1],[309,1],[345,2],[388,2],[917,1],[919,2],[937,1]]},"386":{"position":[[139,1]]},"404":{"position":[[213,1],[228,1],[251,1],[303,1],[324,1],[331,1],[352,1],[379,1],[394,1],[417,1],[441,1],[458,1],[498,1],[505,1]]},"408":{"position":[[524,1]]},"417":{"position":[[557,1],[585,1],[745,1],[764,1],[1109,2],[1129,1],[1274,2],[1296,1],[1662,1],[1664,1]]},"426":{"position":[[942,1],[1003,2]]},"431":{"position":[[65,1],[128,1]]},"434":{"position":[[780,1],[802,1],[804,2],[885,1],[887,1]]},"435":{"position":[[529,1],[531,2],[610,2],[676,2],[706,2],[713,1],[796,1],[979,2]]},"436":{"position":[[1048,2],[1114,1],[1121,1],[1273,2],[1284,2],[1711,1],[1769,2],[1920,1],[1932,1],[1967,2],[2005,1],[2018,1],[2070,1],[2072,2],[2152,1],[2203,1],[2244,1],[2263,2],[2266,2],[2269,3],[2280,1],[2353,2],[2356,1],[2543,2]]},"437":{"position":[[474,1],[668,1],[670,2],[720,1],[841,1],[843,1],[845,1],[1051,1],[1053,2],[1103,1],[1437,1],[1439,1],[1441,1]]},"440":{"position":[[175,1],[382,1],[384,1],[386,1]]},"442":{"position":[[75,1],[85,1],[166,1],[215,1],[228,1],[230,2],[247,1],[316,1],[326,1],[407,1],[476,2],[494,1],[571,1],[573,1],[586,1],[588,2],[605,1]]},"444":{"position":[[129,1],[131,1],[440,2],[443,1],[580,1],[582,1]]},"446":{"position":[[257,1],[410,1]]},"447":{"position":[[110,1],[181,2],[184,1],[287,1],[332,1],[361,1],[363,1],[380,2]]},"448":{"position":[[237,1],[397,2],[400,1]]},"449":{"position":[[275,1],[306,1],[337,1],[380,1],[393,1],[395,1],[426,1],[446,2],[528,1],[600,1],[638,1],[678,1],[724,1],[767,1],[859,2],[877,1],[879,2],[957,1],[959,2],[1011,1],[1013,2],[1055,1],[1067,1],[1075,1],[1089,1],[1091,1],[1123,3],[1157,1],[1278,1],[1348,2],[1351,2],[1354,2],[1357,1],[1359,2],[1389,1],[1409,1],[1425,1],[1457,3],[1478,1],[1498,1],[1551,3],[1572,1],[1590,1],[1621,1]]},"450":{"position":[[676,1],[834,1]]},"572":{"position":[[43,1]]},"588":{"position":[[292,1],[368,1]]},"604":{"position":[[403,1],[405,2],[469,1],[562,2]]},"629":{"position":[[938,1],[1170,1]]},"644":{"position":[[130,1],[209,1]]}},"keywords":{}}],["0",{"_index":39,"title":{"424":{"position":[[5,2]]}},"content":{"4":{"position":[[67,1]]},"9":{"position":[[249,1]]},"108":{"position":[[80,1]]},"316":{"position":[[47,2]]},"684":{"position":[[10,1],[69,1]]}},"keywords":{}}],["0.1",{"_index":2733,"title":{},"content":{"656":{"position":[[27,3],[56,3]]}},"keywords":{}}],["0.fix",{"_index":2783,"title":{},"content":{"684":{"position":[[118,5]]}},"keywords":{}}],["1",{"_index":329,"title":{"425":{"position":[[5,2]]}},"content":{"39":{"position":[[180,2]]},"82":{"position":[[373,2]]},"397":{"position":[[267,1]]}},"keywords":{}}],["10",{"_index":326,"title":{},"content":{"39":{"position":[[132,4]]},"159":{"position":[[194,2]]},"167":{"position":[[1080,4]]},"243":{"position":[[486,2]]},"265":{"position":[[598,2]]},"404":{"position":[[697,2],[1018,2]]},"447":{"position":[[376,3]]}},"keywords":{}}],["100",{"_index":724,"title":{},"content":{"82":{"position":[[543,3]]}},"keywords":{}}],["10th",{"_index":942,"title":{},"content":{"167":{"position":[[1009,4]]}},"keywords":{}}],["11",{"_index":2608,"title":{},"content":{"607":{"position":[[35,2]]}},"keywords":{}}],["127",{"_index":1932,"title":{"397":{"position":[[11,4]]}},"content":{},"keywords":{}}],["15",{"_index":1201,"title":{},"content":{"243":{"position":[[688,2]]}},"keywords":{}}],["17",{"_index":331,"title":{},"content":{"39":{"position":[[230,2]]}},"keywords":{}}],["2",{"_index":905,"title":{"426":{"position":[[5,2]]}},"content":{"159":{"position":[[185,2]]},"167":{"position":[[1094,1],[1188,3],[1259,2],[1326,3]]}},"keywords":{}}],["2.4.22",{"_index":1593,"title":{},"content":{"313":{"position":[[26,6]]}},"keywords":{}}],["20",{"_index":327,"title":{},"content":{"39":{"position":[[140,2]]}},"keywords":{}}],["200",{"_index":1218,"title":{},"content":{"247":{"position":[[633,4]]}},"keywords":{}}],["200x200",{"_index":1165,"title":{},"content":{"240":{"position":[[34,7]]}},"keywords":{}}],["2018",{"_index":178,"title":{},"content":{"19":{"position":[[695,6]]},"307":{"position":[[4,5]]}},"keywords":{}}],["2019",{"_index":1514,"title":{},"content":{"307":{"position":[[685,5]]},"607":{"position":[[13,4]]}},"keywords":{}}],["2020–2021",{"_index":1524,"title":{},"content":{"307":{"position":[[1004,10]]}},"keywords":{}}],["2022",{"_index":1537,"title":{},"content":{"307":{"position":[[1530,5]]},"308":{"position":[[4,5]]}},"keywords":{}}],["2042",{"_index":1772,"title":{},"content":{"381":{"position":[[468,5]]}},"keywords":{}}],["256",{"_index":932,"title":{},"content":{"167":{"position":[[552,3]]}},"keywords":{}}],["3",{"_index":717,"title":{"427":{"position":[[5,2]]}},"content":{"82":{"position":[[447,3]]},"404":{"position":[[222,1],[388,1]]},"418":{"position":[[347,1]]},"420":{"position":[[475,1]]}},"keywords":{}}],["3.5",{"_index":715,"title":{},"content":{"82":{"position":[[422,4]]}},"keywords":{}}],["3.x",{"_index":1992,"title":{},"content":{"405":{"position":[[146,4]]}},"keywords":{}}],["300",{"_index":1263,"title":{},"content":{"255":{"position":[[443,4]]}},"keywords":{}}],["32",{"_index":1059,"title":{},"content":{"207":{"position":[[1068,2]]}},"keywords":{}}],["32bit",{"_index":359,"title":{},"content":{"43":{"position":[[75,7]]}},"keywords":{}}],["37",{"_index":1962,"title":{},"content":{"404":{"position":[[248,2],[414,2]]}},"keywords":{}}],["4",{"_index":719,"title":{"428":{"position":[[5,2]]}},"content":{"82":{"position":[[454,2]]},"675":{"position":[[278,1]]}},"keywords":{}}],["4.0",{"_index":1961,"title":{},"content":{"404":{"position":[[244,3],[267,3],[410,3],[433,3]]}},"keywords":{}}],["400",{"_index":1159,"title":{},"content":{"237":{"position":[[145,5]]},"247":{"position":[[664,3]]}},"keywords":{}}],["404",{"_index":2561,"title":{},"content":{"590":{"position":[[448,3]]}},"keywords":{}}],["5",{"_index":718,"title":{},"content":{"82":{"position":[[451,2],[457,3]]},"265":{"position":[[848,6]]}},"keywords":{}}],["500",{"_index":1217,"title":{},"content":{"247":{"position":[[620,4]]},"255":{"position":[[430,4]]}},"keywords":{}}],["600",{"_index":1220,"title":{},"content":{"247":{"position":[[648,4]]}},"keywords":{}}],["64",{"_index":894,"title":{},"content":{"154":{"position":[[169,3]]},"156":{"position":[[167,3]]},"207":{"position":[[1096,2]]}},"keywords":{}}],["64bit/arm64",{"_index":357,"title":{},"content":{"43":{"position":[[51,13]]}},"keywords":{}}],["8",{"_index":2342,"title":{},"content":{"449":{"position":[[580,5]]}},"keywords":{}}],["8">",{"_index":2152,"title":{},"content":{"426":{"position":[[172,11]]}},"keywords":{}}],["__",{"_index":1840,"title":{},"content":{"385":{"position":[[791,2]]}},"keywords":{}}],["__neutralino_globals.j",{"_index":2649,"title":{},"content":{"627":{"position":[[349,23]]}},"keywords":{}}],["__registerallowlist",{"_index":1844,"title":{},"content":{"385":{"position":[[895,21]]}},"keywords":{}}],["a20x20",{"_index":1382,"title":{},"content":{"291":{"position":[[65,6]]}},"keywords":{}}],["abort_retry_ignor",{"_index":1369,"title":{},"content":{"288":{"position":[[207,19]]}},"keywords":{}}],["abov",{"_index":708,"title":{},"content":{"82":{"position":[[167,5]]},"321":{"position":[[195,5]]},"323":{"position":[[235,5]]},"397":{"position":[[292,5]]},"408":{"position":[[693,5]]},"425":{"position":[[76,5]]},"427":{"position":[[14,6]]},"428":{"position":[[204,5]]},"429":{"position":[[232,5]]},"437":{"position":[[853,5],[1530,5]]},"438":{"position":[[102,5]]},"442":{"position":[[625,5]]},"446":{"position":[[418,5],[762,5]]},"447":{"position":[[451,5]]},"450":{"position":[[5,5],[569,5]]},"600":{"position":[[623,5]]},"604":{"position":[[477,5]]}},"keywords":{}}],["absolut",{"_index":784,"title":{},"content":{"102":{"position":[[54,8]]},"193":{"position":[[13,8]]},"195":{"position":[[1,8]]},"321":{"position":[[118,8]]}},"keywords":{}}],["acc",{"_index":2738,"title":{},"content":{"659":{"position":[[424,5]]}},"keywords":{}}],["accept",{"_index":558,"title":{},"content":{"75":{"position":[[83,8]]},"103":{"position":[[29,8]]},"167":{"position":[[69,7]]},"207":{"position":[[1300,8]]},"265":{"position":[[83,7]]},"293":{"position":[[35,8]]},"309":{"position":[[252,7],[553,6]]},"314":{"position":[[26,8]]},"320":{"position":[[229,7]]},"321":{"position":[[92,7]]},"440":{"position":[[830,7]]},"504":{"position":[[109,7]]},"524":{"position":[[1,6]]},"599":{"position":[[1,6]]},"610":{"position":[[183,7]]},"659":{"position":[[79,8]]},"665":{"position":[[1,6]]},"675":{"position":[[398,7]]}},"keywords":{}}],["access",{"_index":495,"title":{"394":{"position":[[11,6]]}},"content":{"64":{"position":[[521,6]]},"77":{"position":[[1325,6]]},"82":{"position":[[211,8]]},"303":{"position":[[173,6],[301,6]]},"304":{"position":[[636,7]]},"320":{"position":[[302,6],[416,6],[593,6],[790,6]]},"393":{"position":[[1832,6],[2463,6]]},"394":{"position":[[57,6],[132,6],[178,6],[249,6],[285,6]]},"425":{"position":[[307,9]]},"441":{"position":[[105,6]]},"446":{"position":[[536,6]]},"448":{"position":[[507,6]]},"600":{"position":[[200,6]]},"677":{"position":[[251,6]]}},"keywords":{}}],["accesstoken",{"_index":2366,"title":{},"content":{"449":{"position":[[1249,12]]}},"keywords":{}}],["accident",{"_index":1196,"title":{},"content":{"243":{"position":[[415,10]]}},"keywords":{}}],["accord",{"_index":1784,"title":{},"content":{"382":{"position":[[668,9]]},"389":{"position":[[178,9]]},"413":{"position":[[215,9]]},"441":{"position":[[87,9]]}},"keywords":{}}],["accordingli",{"_index":2578,"title":{},"content":{"597":{"position":[[286,12]]}},"keywords":{}}],["account",{"_index":1573,"title":{},"content":{"309":{"position":[[343,9]]}},"keywords":{}}],["accpet",{"_index":1348,"title":{},"content":{"286":{"position":[[113,8]]},"288":{"position":[[130,8],[286,8]]}},"keywords":{}}],["achiev",{"_index":2205,"title":{},"content":{"436":{"position":[[321,7]]}},"keywords":{}}],["action",{"_index":338,"title":{"166":{"position":[[32,7]]},"264":{"position":[[28,7]]}},"content":{"39":{"position":[[407,7]]},"64":{"position":[[1182,6],[1287,6],[1366,6],[1536,6]]},"77":{"position":[[1036,7]]},"166":{"position":[[21,8]]},"167":{"position":[[53,6],[247,6],[504,7],[570,6],[669,6]]},"212":{"position":[[392,8]]},"264":{"position":[[47,6]]},"265":{"position":[[67,6],[318,7]]},"578":{"position":[[9,6]]},"609":{"position":[[147,7],[225,7],[255,6]]},"612":{"position":[[24,6]]},"640":{"position":[[38,7],[117,7]]},"643":{"position":[[544,7],[568,6],[629,8]]},"644":{"position":[[166,7],[223,8]]}},"keywords":{}}],["action((act",{"_index":1094,"title":{},"content":{"212":{"position":[[284,16]]}},"keywords":{}}],["actioni",{"_index":1302,"title":{},"content":{"265":{"position":[[360,8]]}},"keywords":{}}],["activ",{"_index":467,"title":{},"content":{"62":{"position":[[127,6]]},"171":{"position":[[107,6]]},"234":{"position":[[1,9]]},"235":{"position":[[66,9]]},"254":{"position":[[121,9],[174,9]]},"319":{"position":[[1,9]]},"343":{"position":[[102,10],[237,9],[568,10]]},"344":{"position":[[1,9]]},"346":{"position":[[1,9]]},"348":{"position":[[1,9]]},"388":{"position":[[9,8]]},"389":{"position":[[91,6]]},"404":{"position":[[680,8]]},"407":{"position":[[95,11]]},"408":{"position":[[48,9]]},"437":{"position":[[204,11],[623,10]]},"583":{"position":[[105,9],[323,10]]},"590":{"position":[[289,8]]},"591":{"position":[[137,9]]},"594":{"position":[[418,8],[710,9]]},"598":{"position":[[222,8]]},"609":{"position":[[386,6]]}},"keywords":{}}],["acustomev",{"_index":531,"title":{},"content":{"66":{"position":[[155,12]]}},"keywords":{}}],["ad",{"_index":293,"title":{"409":{"position":[[0,6]]}},"content":{"34":{"position":[[28,5]]},"104":{"position":[[317,6]]},"308":{"position":[[27,5]]},"384":{"position":[[187,6]]},"389":{"position":[[117,5]]},"413":{"position":[[316,6]]},"437":{"position":[[966,6]]},"445":{"position":[[65,6]]},"471":{"position":[[1,5]]},"569":{"position":[[54,6]]},"583":{"position":[[33,5]]},"589":{"position":[[28,6]]},"620":{"position":[[1,5]]},"629":{"position":[[1119,6]]},"633":{"position":[[1,5]]},"634":{"position":[[1,5]]},"638":{"position":[[120,5]]},"649":{"position":[[1,5]]},"659":{"position":[[1,5]]},"660":{"position":[[58,6]]},"661":{"position":[[1,5]]},"666":{"position":[[1,5]]},"672":{"position":[[47,5]]}},"keywords":{}}],["add",{"_index":305,"title":{"400":{"position":[[12,3]]}},"content":{"36":{"position":[[193,3]]},"38":{"position":[[23,4],[84,4]]},"39":{"position":[[245,3]]},"64":{"position":[[1543,5]]},"210":{"position":[[103,4]]},"211":{"position":[[58,3]]},"212":{"position":[[106,3]]},"213":{"position":[[127,3]]},"384":{"position":[[1185,3]]},"399":{"position":[[120,3]]},"400":{"position":[[317,3],[386,3]]},"409":{"position":[[4,3],[27,3],[103,3],[144,3]]},"436":{"position":[[1287,3],[1784,3]]},"437":{"position":[[566,3]]},"460":{"position":[[1,3]]},"491":{"position":[[1,3]]},"493":{"position":[[1,3]]},"502":{"position":[[1,3]]},"505":{"position":[[1,3]]},"509":{"position":[[1,3]]},"537":{"position":[[1,3]]},"548":{"position":[[1,3]]},"555":{"position":[[1,3]]},"558":{"position":[[1,3]]},"560":{"position":[[1,3]]},"561":{"position":[[1,3]]},"563":{"position":[[1,3]]},"564":{"position":[[1,3]]},"567":{"position":[[1,3]]},"584":{"position":[[1,3]]},"585":{"position":[[1,3]]},"610":{"position":[[1,3]]},"617":{"position":[[1,3]]},"622":{"position":[[789,4]]},"626":{"position":[[1,3]]},"629":{"position":[[836,3],[1248,4]]},"639":{"position":[[1,3]]},"641":{"position":[[80,3]]},"645":{"position":[[1,3]]},"652":{"position":[[1,3]]},"654":{"position":[[1,3]]},"655":{"position":[[1,3]]},"664":{"position":[[1,3]]}},"keywords":{}}],["added.window.gets",{"_index":2740,"title":{},"content":{"660":{"position":[[33,20]]}},"keywords":{}}],["addextraf",{"_index":318,"title":{},"content":{"38":{"position":[[1,12]]},"39":{"position":[[185,13]]}},"keywords":{}}],["addextraten",{"_index":330,"title":{},"content":{"39":{"position":[[205,12]]}},"keywords":{}}],["addit",{"_index":61,"title":{},"content":{"7":{"position":[[14,10]]},"11":{"position":[[61,10]]},"20":{"position":[[80,10]]},"39":{"position":[[56,9]]},"58":{"position":[[102,10]]},"60":{"position":[[61,10]]},"64":{"position":[[38,10]]},"66":{"position":[[190,10]]},"70":{"position":[[61,10]]},"72":{"position":[[61,10]]},"143":{"position":[[1,10]]},"167":{"position":[[480,10]]},"207":{"position":[[1142,10]]},"254":{"position":[[842,10]]},"265":{"position":[[294,10]]},"305":{"position":[[1148,10]]},"358":{"position":[[1,10]]},"376":{"position":[[11,10]]},"440":{"position":[[796,10]]}},"keywords":{}}],["addition",{"_index":223,"title":{},"content":{"21":{"position":[[76,13]]}},"keywords":{}}],["adher",{"_index":1794,"title":{},"content":{"384":{"position":[[40,7]]}},"keywords":{}}],["administr",{"_index":1449,"title":{},"content":{"304":{"position":[[622,13]]},"425":{"position":[[401,14]]}},"keywords":{}}],["adsens",{"_index":1568,"title":{},"content":{"309":{"position":[[171,7]]}},"keywords":{}}],["advisori",{"_index":2588,"title":{},"content":{"600":{"position":[[668,10]]}},"keywords":{}}],["affect",{"_index":2654,"title":{},"content":{"629":{"position":[[154,6]]}},"keywords":{}}],["again",{"_index":1901,"title":{},"content":{"393":{"position":[[1024,5]]},"441":{"position":[[487,5]]}},"keywords":{}}],["agent",{"_index":858,"title":{"139":{"position":[[21,5]]},"604":{"position":[[27,5]]}},"content":{"139":{"position":[[27,5]]},"354":{"position":[[43,5],[138,5]]},"604":{"position":[[35,5],[179,5],[300,5],[514,5]]}},"keywords":{}}],["aka",{"_index":920,"title":{},"content":{"166":{"position":[[142,4]]},"404":{"position":[[653,4]]},"435":{"position":[[107,4]]}},"keywords":{}}],["allow",{"_index":780,"title":{},"content":{"101":{"position":[[420,8]]},"304":{"position":[[494,8]]},"326":{"position":[[114,7]]},"327":{"position":[[40,7],[114,7]]},"399":{"position":[[170,5]]},"426":{"position":[[747,6],[828,6],[1082,6]]},"436":{"position":[[1516,5],[2477,5]]},"504":{"position":[[1,5]]},"574":{"position":[[1,5]]},"600":{"position":[[592,7]]}},"keywords":{}}],["allowlist",{"_index":1926,"title":{},"content":{"394":{"position":[[483,9]]},"399":{"position":[[267,11]]}},"keywords":{}}],["alon",{"_index":1519,"title":{},"content":{"307":{"position":[[832,5]]}},"keywords":{}}],["along",{"_index":1180,"title":{},"content":{"241":{"position":[[188,5]]},"308":{"position":[[125,5]]}},"keywords":{}}],["alpha",{"_index":2570,"title":{},"content":{"594":{"position":[[524,5]]}},"keywords":{}}],["alreadi",{"_index":1503,"title":{},"content":{"307":{"position":[[341,7]]},"404":{"position":[[111,8]]},"426":{"position":[[820,7],[1074,7]]},"446":{"position":[[8,7]]},"591":{"position":[[111,7]]}},"keywords":{}}],["altern",{"_index":145,"title":{},"content":{"19":{"position":[[204,11]]},"629":{"position":[[493,14]]},"632":{"position":[[87,11]]}},"keywords":{}}],["alway",{"_index":38,"title":{"120":{"position":[[9,6]]}},"content":{"4":{"position":[[60,6]]},"79":{"position":[[1036,7]]},"234":{"position":[[30,6]]},"243":{"position":[[67,6]]},"247":{"position":[[465,6]]},"255":{"position":[[78,6],[187,6]]},"320":{"position":[[606,7]]},"386":{"position":[[603,6]]},"408":{"position":[[403,6]]},"659":{"position":[[159,6]]}},"keywords":{}}],["alwayscaptur",{"_index":1185,"title":{},"content":{"243":{"position":[[1,13],[650,14]]}},"keywords":{}}],["amp",{"_index":1981,"title":{},"content":{"404":{"position":[[800,5]]}},"keywords":{}}],["amp;filenam",{"_index":1836,"title":{},"content":{"385":{"position":[[710,15]]}},"keywords":{}}],["anarraybuff",{"_index":888,"title":{},"content":{"154":{"position":[[75,14]]},"156":{"position":[[73,14]]},"162":{"position":[[31,14]]}},"keywords":{}}],["andgoogl",{"_index":1567,"title":{},"content":{"309":{"position":[[161,9]]}},"keywords":{}}],["androuter.cpp",{"_index":308,"title":{},"content":{"36":{"position":[[227,14]]}},"keywords":{}}],["andstandard",{"_index":1096,"title":{},"content":{"212":{"position":[[503,11]]}},"keywords":{}}],["anoth",{"_index":1595,"title":{},"content":{"315":{"position":[[133,7]]},"319":{"position":[[165,7]]},"320":{"position":[[378,7]]},"462":{"position":[[48,7]]},"566":{"position":[[187,7]]}},"keywords":{}}],["answer",{"_index":182,"title":{},"content":{"19":{"position":[[776,7]]}},"keywords":{}}],["anyon",{"_index":1103,"title":{},"content":{"213":{"position":[[71,6]]}},"keywords":{}}],["anyth",{"_index":2172,"title":{},"content":{"426":{"position":[[1032,8]]}},"keywords":{}}],["anytim",{"_index":2312,"title":{},"content":{"447":{"position":[[606,8]]}},"keywords":{}}],["anywher",{"_index":2234,"title":{},"content":{"436":{"position":[[2676,8]]}},"keywords":{}}],["api",{"_index":563,"title":{"77":{"position":[[7,3]]},"83":{"position":[[7,3]]},"84":{"position":[[7,3]]},"394":{"position":[[7,3]]},"436":{"position":[[20,3]]},"522":{"position":[[0,4]]},"524":{"position":[[0,4]]},"529":{"position":[[0,4]]},"534":{"position":[[0,4]]},"535":{"position":[[0,4]]},"537":{"position":[[0,4]]},"541":{"position":[[0,4]]},"543":{"position":[[0,4]]},"545":{"position":[[0,4]]},"550":{"position":[[0,4]]},"552":{"position":[[0,4]]},"554":{"position":[[0,4],[24,4]]},"555":{"position":[[0,4]]},"557":{"position":[[0,4]]},"558":{"position":[[0,4]]},"563":{"position":[[0,4]]},"564":{"position":[[0,4]]},"566":{"position":[[0,4]]},"567":{"position":[[0,4]]},"569":{"position":[[0,4]]},"573":{"position":[[0,4]]},"574":{"position":[[0,4]]},"575":{"position":[[0,4]]},"576":{"position":[[0,4]]},"584":{"position":[[0,4]]},"585":{"position":[[0,4]]},"591":{"position":[[0,4]]},"595":{"position":[[0,4]]},"597":{"position":[[0,4]]},"598":{"position":[[0,4]]},"599":{"position":[[0,4]]},"609":{"position":[[11,4]]},"610":{"position":[[3,4]]},"617":{"position":[[0,4]]},"622":{"position":[[0,4]]},"629":{"position":[[0,4]]},"630":{"position":[[0,4]]},"632":{"position":[[0,4]]},"633":{"position":[[0,4]]},"634":{"position":[[0,4]]},"635":{"position":[[0,4]]},"638":{"position":[[0,4],[24,4]]},"639":{"position":[[0,4]]},"643":{"position":[[0,4],[22,4]]},"646":{"position":[[0,4]]},"654":{"position":[[0,4]]},"655":{"position":[[0,4]]},"660":{"position":[[0,4]]},"664":{"position":[[0,4]]},"666":{"position":[[0,4]]},"669":{"position":[[0,4]]},"670":{"position":[[0,4]]},"674":{"position":[[0,4]]},"675":{"position":[[6,3]]},"678":{"position":[[0,4]]},"679":{"position":[[0,4]]},"680":{"position":[[0,4]]},"681":{"position":[[0,4]]}},"content":{"77":{"position":[[1461,4]]},"79":{"position":[[117,3],[479,3],[908,3]]},"113":{"position":[[94,3]]},"114":{"position":[[30,3]]},"207":{"position":[[805,3]]},"208":{"position":[[331,4]]},"252":{"position":[[327,4]]},"259":{"position":[[164,3]]},"307":{"position":[[1175,4]]},"317":{"position":[[94,3]]},"318":{"position":[[32,4],[67,3]]},"320":{"position":[[776,4],[913,5]]},"382":{"position":[[340,4],[536,3],[654,3],[826,3]]},"384":{"position":[[824,4],[972,3]]},"386":{"position":[[299,4]]},"391":{"position":[[265,4],[309,4]]},"393":{"position":[[1278,3],[1535,3],[2329,3],[2459,3]]},"394":{"position":[[53,3],[153,4],[328,3],[370,4],[440,3],[540,3]]},"411":{"position":[[47,4],[63,3],[115,3]]},"412":{"position":[[68,3],[128,3]]},"426":{"position":[[603,3]]},"429":{"position":[[202,3]]},"436":{"position":[[87,3],[1398,3],[1527,3]]},"445":{"position":[[16,3]]},"447":{"position":[[16,3],[216,3]]},"448":{"position":[[94,3]]},"450":{"position":[[53,3],[899,3]]},"464":{"position":[[59,5]]},"473":{"position":[[334,3]]},"539":{"position":[[51,3]]},"554":{"position":[[35,3]]},"566":{"position":[[52,3]]},"571":{"position":[[11,3]]},"576":{"position":[[9,3]]},"579":{"position":[[77,4]]},"589":{"position":[[72,3]]},"594":{"position":[[70,3]]},"622":{"position":[[117,3],[156,3],[294,3]]},"629":{"position":[[36,3],[847,4],[1030,3]]},"630":{"position":[[26,3],[334,3],[701,3],[770,3]]},"634":{"position":[[183,4]]},"643":{"position":[[238,3],[249,3]]},"664":{"position":[[15,3]]},"683":{"position":[[272,3]]}},"keywords":{}}],["api.add",{"_index":2397,"title":{},"content":{"458":{"position":[[202,7]]}},"keywords":{}}],["api.nlconnecttoken",{"_index":2304,"title":{},"content":{"446":{"position":[[567,19]]}},"keywords":{}}],["api.pid",{"_index":1288,"title":{},"content":{"263":{"position":[[114,7]]}},"keywords":{}}],["api/load",{"_index":2768,"title":{},"content":{"677":{"position":[[344,11]]}},"keywords":{}}],["api= - - + +

    Privacy Policy

    Privacy policy of the the Neutralinojs website and documentation

    Neutralinojs framework or CLI doesn't collect user information for analytical and statistical purposes. However, we use Google Analytics in our website and documentation to understand our developer audience. Therefore, Google Analytics may place cookies inside your browser via the Neutralinojs website. Also, we display a few ads via Google Adsense which may also place cookies inside your browser to improve their ad experience for users. If you wish not to allow those cookies, please kindly disable cookies for the Neutralinojs website.

    We use Google Analytics data to identify frequently visited pages. We often make tutorials based on those frequently visited page details. Please note that this privacy policy statement is valid only for the official website domain neutralino.js.org. Make sure that you are browsing the right official domain name which adheres to this privacy policy statement.

    Last updated date: 2022-01-01

    diff --git a/resources/index.html b/resources/index.html index 27cbe4da..2704962e 100644 --- a/resources/index.html +++ b/resources/index.html @@ -12,8 +12,8 @@ - - + +

    Neutralinojs app developer resources

    Templates

    neutralinojs-minimal

    The default template for a Neutralinojs app.

    neutralinojs-react

    A simple React.js template for building Neutralinojs apps

    diff --git a/search-doc-1727165743246.json b/search-doc-1727165743246.json deleted file mode 100644 index 31055e2d..00000000 --- a/search-doc-1727165743246.json +++ /dev/null @@ -1 +0,0 @@ -{"searchDocs":[{"title":"Introduction","type":0,"sectionRef":"#","url":"/docs/","content":"","keywords":"","version":"Next"},{"title":"What is Neutralinojs?​","type":1,"pageTitle":"Introduction","url":"/docs/#what-is-neutralinojs","content":" Neutralinojs is a lightweight and portable desktop application development framework. It lets you develop lightweight cross-platform desktop applications using JavaScript, HTML and CSS. You can extend Neutralinojs with any programming language (via extensions IPC) and use Neutralinojs as a part of any source file (via child processes IPC). ","version":"Next","tagName":"h2"},{"title":"Neutralino.app","type":0,"sectionRef":"#","url":"/docs/api/app","content":"","keywords":"","version":"Next"},{"title":"app.exit(exitCode)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appexitexitcode","content":" Terminates the running application. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters","content":" exitCode Number: Process's exit code. The default value is always 0 (success). await Neutralino.app.exit(130); await Neutralino.app.exit(); ","version":"Next","tagName":"h3"},{"title":"app.killProcess()​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appkillprocess","content":" Kills the application process. If the application becomes unresponsive, you can use this to terminate the process instantly. It is recommended to use the exit() method to close your application properly. await Neutralino.app.killProcess(); ","version":"Next","tagName":"h2"},{"title":"app.restartProcess(options)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#apprestartprocessoptions","content":" Restarts the current application instance. ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#options","content":" args String: Additional command-line arguments that need to be passed to the new application instance's process. await Neutralino.app.restartProcess(); await Neutralino.app.restartProcess({ args: '--restarted' }); ","version":"Next","tagName":"h3"},{"title":"app.getConfig()​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appgetconfig","content":" Returns the current application configuration as a JSON object. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#return-object-awaited","content":" The current application configuration. Sometimes, this configuration object is not identical to your configuration file because the framework updates the configuration during several situations such as config overriding via CLI arguments and using 0 as the port. let config = await Neutralino.app.getConfig(); console.log('URL = ', config.url); ","version":"Next","tagName":"h3"},{"title":"app.broadcast(eventName, data)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appbroadcasteventname-data","content":" Dispatches a new event to all app instances. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-1","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.app.broadcast('myTestEvent', 'Hello'); await Neutralino.app.broadcast('myTestEvent', {myData: 'Test data'}); await Neutralino.app.broadcast('myTestEvent'); ","version":"Next","tagName":"h3"},{"title":"app.readProcessInput(readAll)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appreadprocessinputreadall","content":" Reads string data from the standard input stream of the application process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-2","content":" readAll Boolean (optional): If this is set to true, the framework will read the entire standard stream. Otherwise, only one line will be returned. The default value for this option is false. let name = await Neutralino.app.readProcessInput(); console.log(`Hello ${name}`); ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#return-string-awaited","content":" Standard input stream data. ","version":"Next","tagName":"h3"},{"title":"app.writeProcessOutput(data)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appwriteprocessoutputdata","content":" Writes string data to the standard output stream of the application process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-3","content":" data String: Data to be written. await Neutralino.app.writeProcessOutput('Enter your name: '); let name = await Neutralino.app.readProcessInput(); await Neutralino.app.writeProcessOutput(`Hello ${name}\\n`); ","version":"Next","tagName":"h3"},{"title":"app.writeProcessError(data)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appwriteprocesserrordata","content":" Writes string data to the standard error stream of the application process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-4","content":" data String: Data to be written. await Neutralino.app.writeProcessError('This message goes to stderr'); ","version":"Next","tagName":"h3"},{"title":"Why Neutralinojs?​","type":1,"pageTitle":"Introduction","url":"/docs/#why-neutralinojs","content":" In Electron and NWjs, you have to install Node.js and hundreds of dependency libraries. Embedded Chromium and Node make simple apps bloaty. Neutralinojs offers a lightweight and portable SDK which is an alternative for Electron and NW.js. Neutralinojs doesn't bundle Chromium and uses the existing web browser library in the operating system (Eg: gtk-webkit2 on Linux). Neutralinojs implements a WebSocket connection for native operations and embeds a static web server to serve the web content. Also, it offers a built-inJavaScript client library for developers. See comparisons: Neutralinojs vs Electron vs NW.JS vs Tauri vs NodeGui vs Flutter vs .Net MAUINeutralinojs vs Electron vs NW.js (2018) When you start learning Neutralinojs, you will realize that Neutralinojs answers endless use cases. For example, you can use Neutralinojs for the following scenarios. Cross-platform desktop app development.Building web apps with native operations.Using as a cloud message broker.Connecting multiple processes by using as an IPC broker.and more... ","version":"Next","tagName":"h2"},{"title":"Highlighted features​","type":1,"pageTitle":"Introduction","url":"/docs/#highlighted-features","content":" Portable development kit.No compilation required for application developers.No additional dependencies required for users.Native functions support: Read files, run system commands, etc.Less resource intensive compared to chromium-node-based frameworks.Cross-platform: Neutralinojs apps work on Linux, Windows, macOS, and Web.Simple and flexible development environment. ","version":"Next","tagName":"h2"},{"title":"Supported platforms and CPU architectures​","type":1,"pageTitle":"Introduction","url":"/docs/#supported-platforms-and-cpu-architectures","content":" neu CLI provides you pre-built x64 binaries for Linux, macOS, and Windows. Additionally, it provides ARM (armhf/arm64) Linux binaries with the Neutralinojs framework v4.6.0 or newer versions and ARM (arm64) Darwin binaries with v4.10.0 or newer framework versions. We are trying to officially support all popular CPU architectures with the CLI soon! However, you can build Neutralinojs binaries from the source on almost all desktop operating systems and CPU architectures out there. If you need Neutralinojs binaries for non-x64 CPU, learn how to build Neutralinojs from source with this guide. ","version":"Next","tagName":"h2"},{"title":"Neutralino.clipboard","type":0,"sectionRef":"#","url":"/docs/api/clipboard","content":"","keywords":"","version":"Next"},{"title":"clipboard.getFormat()​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardgetformat","content":" Returns the current data format of the system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#return-string-awaited","content":" Clipboard format: text, image, or unknown. let format = await Neutralino.clipboard.getFormat(); console.log(`Format: ${format}`); ","version":"Next","tagName":"h3"},{"title":"clipboard.writeText(text)​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardwritetexttext","content":" Writes text into the system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#parameters","content":" text String: Text to store into the system clipboard. await Neutralino.clipboard.writeText('Test value'); ","version":"Next","tagName":"h3"},{"title":"clipboard.writeImage(image)​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardwriteimageimage","content":" Writes image into the system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Input Object: ClipboardImage​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#input-object-clipboardimage","content":" width: Number: Image width.height: Number: Image height.bpp: Number: Bits per pixel (BPP).bpr: Number: Bytes Per Row (BPR).redMask: Number: Red mask.greenMask: Number: Green mask.blueMask: Number: Blue mask.redShift: Number: Red shift.greeShift: Number: Green shift.blueShift: Number: Blue shift.data: ArrayBuffer: Raw RGBA binary data of the image in an array buffer. let image = prepareClipboardImage(); await Neutralino.clipboard.writeImage(image); ","version":"Next","tagName":"h3"},{"title":"clipboard.readText()​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardreadtext","content":" Reads and returns text from system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#return-string-awaited-1","content":" Stored text from the system clipboard. let clipboardText = await Neutralino.clipboard.readText(); console.log(`Text: ${clipboardText}`); ","version":"Next","tagName":"h3"},{"title":"clipboard.readImage()​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardreadimage","content":" Reads and returns an image from system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#return-object-awaited","content":" Returns ClipboardImage object that has the same properties as in the writeImage() function. let clipboardImage = await Neutralino.clipboard.readImage(); console.log(`Image: ${clipboardImage}`); ","version":"Next","tagName":"h3"},{"title":"Neutralino.custom","type":0,"sectionRef":"#","url":"/docs/api/custom","content":"","keywords":"","version":"Next"},{"title":"custom.getMethods()​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#customgetmethods","content":" Returns all custom methods added by the app developer. ","version":"Next","tagName":"h2"},{"title":"Return Array (awaited):​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#return-array-awaited","content":" A string array of all custom method identifiers. let methods = await Neutralino.custom.getMethods(); console.log(methods); ","version":"Next","tagName":"h3"},{"title":"custom.add(num1, num2, options)​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#customaddnum1-num2-options","content":" info This is a sample method and official Neutralinojs framework builds don't include this method by default. So, you have to download the Neutralinojs framework source code and uncomment the add method in thecustom namespace androuter.cpp. This method returns the sum of two numbers for demonstration purposes of custom methods. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#parameters","content":" num1 Number: The first number for the summation process.num2 Number: The second number for the summation process. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#options","content":" addExtraFive Boolean: Adds extra five to the numerical result.addExtraTen Boolean: Adds extra ten to the numerical result. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#return-number-awaited","content":" The sum of input numerical parameters with extra value additions based on options. let sum; sum = await Neutralino.custom.add(10, 10); // 20 sum = await Neutralino.custom.add(1, 1, { addExtraFive: true, addExtraTen: true }); // 17 Check the add method implementation and learn how to capture, validate, and process parameters in C++. For compiling your Neutralinojs fork, you can use the existingGitHub Actions workflows. ","version":"Next","tagName":"h3"},{"title":"Neutralino.computer","type":0,"sectionRef":"#","url":"/docs/api/computer","content":"","keywords":"","version":"Next"},{"title":"computer.getMemoryInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetmemoryinfo","content":" Returns system memory statistics in bytes. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited","content":" physical Object: Physical memory information. total Number: Total physical memory.available Number: Available physical memory. virtual Object: Virtual memory information. total Number: Total virtual memory.available Number: Available virtual memory. let memoryInfo = await Neutralino.computer.getMemoryInfo(); console.log(`RAM size: ${memoryInfo.physical.total}B`); ","version":"Next","tagName":"h3"},{"title":"computer.getArch()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetarch","content":" Returns the CPU architecture identifier: x64 (x86 64bit/arm64), ia32 (x86 32bit), arm, itanium, or unknown. ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-string-awaited","content":" CPU architecture. let arch = await Neutralino.computer.getArch(); console.log(arch); ","version":"Next","tagName":"h3"},{"title":"computer.getKernelInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetkernelinfo","content":" Returns operating system kernel information. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-1","content":" variant String: Kernel type: Linux, Darwin, Windows NT, or Unknown.version String: Version in the <major>.<minor>.<patch>-<build_number> format. let kernelInfo = await Neutralino.computer.getKernelInfo(); console.log(`Kernel: ${kernelInfo.variant}`); ","version":"Next","tagName":"h3"},{"title":"computer.getOSInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetosinfo","content":" Returns operating system information. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-2","content":" name String: Operating system name.description String: Operating system description.version String: Version in the <major>.<minor>.<patch>-<build_number> format. let osInfo = await Neutralino.computer.getOSInfo(); console.log(`OS: ${osInfo.name}`); ","version":"Next","tagName":"h3"},{"title":"computer.getCPUInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetcpuinfo","content":" Returns the CPU information. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-3","content":" vendor String: Vendor name.model String: Model name.frequency Number: The current CPU frequency in hertz (Hz).architecture String: CPU architecture name. Returns the same value as the getArch function.logicalThreads Number: Number of logical threads in the parallelism model.physicalCores Number: Number of physical cores in the CPU.physicalUnits Number: Number of physical CPU hardware units in the motherboard. let cpuInfo = await Neutralino.computer.getCPUInfo(); console.log(`CPU model: ${cpuInfo.model}`); ","version":"Next","tagName":"h3"},{"title":"computer.getDisplays()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetdisplays","content":" Returns information about all connected displays. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-4","content":" An array of Display objects. ","version":"Next","tagName":"h3"},{"title":"Display​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#display","content":" id Number: A virtual display identifier.resolution Object: Display resolution information. width Number: Display width.height Number: Display height. dpi Number: DPI (Dots Per Inch) value.bpp Number: BPP (Bits Per Pixel) value (also known as the color depth).refreshRate Number: Refresh rate in hertz (Hz). let displays = await Neutralino.computer.getDisplays(); for(let display of displays) { console.log(display); } ","version":"Next","tagName":"h3"},{"title":"computer.getMousePosition()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetmouseposition","content":" Returns the current mouse cursor position. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-5","content":" x Number: Distance from the left edge of the screen in pixels.y Number: Distance from the top edge of the screen in pixels. let pos = await Neutralino.computer.getMousePosition(); console.log(`Pos: ${pos.x}, ${pos.y}`); ","version":"Next","tagName":"h3"},{"title":"Neutralino.extensions","type":0,"sectionRef":"#","url":"/docs/api/extensions","content":"","keywords":"","version":"Next"},{"title":"extensions.dispatch(extensionId, eventName, data)​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#extensionsdispatchextensionid-eventname-data","content":" Dispatches a new event to an extension instance. If the targeted extension is not connected yet, Neutralino client library will queue the function call and send whenever the extension comes online. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#parameters","content":" extensionId String: Extension identifier.eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.extensions.dispatch('js.neutralino.sampleextension', 'myTestEvent', {myData: 'Test data'}); await Neutralino.extensions.dispatch('js.neutralino.sampleextension', 'myTestEvent'); ","version":"Next","tagName":"h3"},{"title":"extensions.broadcast(eventName, data)​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#extensionsbroadcasteventname-data","content":" Dispatches a new event to all connected extensions. If an extension is loaded but not connected yet, the particular extension won't get the new event. Use extensions.dispatchto send messages even if the extension is not connected to the main process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#parameters-1","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.extensions.broadcast('myTestEvent', 'Hello'); await Neutralino.extensions.broadcast('myTestEvent', {myData: 'Test data'}); await Neutralino.extensions.broadcast('myTestEvent'); ","version":"Next","tagName":"h3"},{"title":"extensions.getStats()​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#extensionsgetstats","content":" Returns details about connected and loaded extensions. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#return-object-awaited","content":" loaded String[]: An array of loaded extensions.connected String[]: An array of connected extensions. These extensions have an active WebSocket-based IPC connection with the main process. let stats = await Neutralino.extensions.getStats(); console.log('stats: ', stats); ","version":"Next","tagName":"h3"},{"title":"Neutralino.events","type":0,"sectionRef":"#","url":"/docs/api/events","content":"","keywords":"","version":"Next"},{"title":"Event types​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#event-types","content":" Event id\tDescription\tAvailable modes\tAdditional dataready\tOccurs when the client library connects with the Neutralino server.\tall\tnull trayMenuItemClicked\tOccurs when the user clicks on a tray menu item.\tall\tTrayMenuItem windowClose\tOccurs when the user closes the window.\twindow\tnull windowFocus\tOccurs when the window gets focused.\twindow\tnull windowBlur\tOccurs when the window focus state is gone.\twindow\tnull serverOffline\tOccurs when the Neutralino server is offline\tall\tnull clientConnect\tOccurs when a new client access the application.\tall\tTotal clients clientDisconnect\tOccurs when a connected client leaves the application.\tall\tTotal clients appClientConnect\tOccurs when a new application instance starts.\tall\tTotal app clients appClientDisconnect\tOccurs when an application instance ends.\tall\tTotal app clients extClientConnect\tOccurs when a new extension connects.\tall\tExtension identifier extClientDisconnect\tOccurs when an extension disconnects.\tall\tExtension identifer extensionReady\tOccurs when an extension is ready to communicate with the app.\tall\tExtension identifier spawnedProcess\tOccurs then there is an update in the spawned process.\tall\tSpawnedProcess with action (stdOut, stdErr, and exit) and data (STDOUT, STDERR or exit code) openedFile\tOccurs for each read action and whenever stream cursor reaches EOF.\tall\tFile stream identifier with action (data, dataBinary, and end) and data (stream block content) watchFile\tOccurs for each filesystem change events based on watchers.\tall\tFile watcher identifier with action (add, delete, modified, and moved), dir, and filename ","version":"Next","tagName":"h2"},{"title":"events.on(eventName, handler)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsoneventname-handler","content":" Registers a new event handler.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters","content":" eventName String: Name of the event.handler Function: A function that will be called when the given event occurs. Neutralinojs will call the handler with aCustomEvent instance by attaching additional data to the detail key. function onTrayMenuItemClicked(event) { console.log(`Event data: ${event.detail}`); } await Neutralino.events.on('trayMenuItemClicked', onTrayMenuItemClicked); ","version":"Next","tagName":"h3"},{"title":"events.off(eventName, handler)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsoffeventname-handler","content":" Unregisters an event handler.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters-1","content":" eventName String: Name of the event.handler Function: A function reference. await Neutralino.events.off('trayMenuItemClicked', onTrayMenuItemClicked); ","version":"Next","tagName":"h3"},{"title":"events.dispatch(eventName, data)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsdispatcheventname-data","content":" Dispatches a new event to the current app instance. Neutralinojs client uses this JavaScript function call internally to dispatch native events.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters-2","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.events.dispatch('myTestEvent', {myData: 'Test data'}); ","version":"Next","tagName":"h3"},{"title":"events.broadcast(eventName, data)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsbroadcasteventname-data","content":" Dispatches a new event to all clients (both app and extension clients). ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters-3","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.events.broadcast('myTestEvent', 'Hello'); await Neutralino.events.broadcast('myTestEvent', {myData: 'Test data'}); await Neutralino.events.broadcast('myTestEvent'); // without any data payload ","version":"Next","tagName":"h3"},{"title":"Neutralino.debug","type":0,"sectionRef":"#","url":"/docs/api/debug","content":"","keywords":"","version":"Next"},{"title":"debug.log(message, type)​","type":1,"pageTitle":"Neutralino.debug","url":"/docs/api/debug#debuglogmessage-type","content":" Writes messages to neutralinojs.log file or/and standard output streams.  tip If your application is running via neu run, you can see log messages on your terminal. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.debug","url":"/docs/api/debug#parameters","content":" message String: Content to be logged.type String (optional): Type of the message. Accepted values are INFO, WARNING, and ERROR. The default value is INFO. await Neutralino.debug.log('Hello Neutralinojs'); await Neutralino.debug.log('An error occured', 'ERROR'); await Neutralino.debug.log('A warning message', 'WARNING'); ","version":"Next","tagName":"h3"},{"title":"Error Codes","type":0,"sectionRef":"#","url":"/docs/api/error-codes","content":"","keywords":"","version":"Next"},{"title":"Native API error codes​","type":1,"pageTitle":"Error Codes","url":"/docs/api/error-codes#native-api-error-codes","content":" Error code\tMessage\tThrown byNE_FS_DIRCRER\tUnable to create directory.\tos.createDirectory NE_FS_REMVERR\tUnable to remove path.\tos.remove NE_OS_TRAYIER\tUnable to initialize the tray menu. This error is typically thrown when GNU/Linux systems don't contain an app indicator library.\tos.setTray NE_FS_FILRDER\tFile read error.\tfilesystem.readFile, filesystem.readBinaryFile NE_FS_FILWRER\tFile write error.\tfilesystem.writeFile, filesystem.writeBinaryFile NE_FS_FILOPER\tFile open error.\tfilesystem.openFile NE_FS_UNLTOUP\tUnable to update opened file id.\tfilesystem.updateOpenedFile NE_FS_UNLTFOP\tUnable to find opened file id.\tfilesystem.getOpenedFileInfo NE_FS_NOPATHE\tNo file or directory.\tfilesystem.getStats, filesystem.readDirectory NE_FS_COPYERR\tCopy error.\tfilesystem.copy NE_FS_MOVEERR\tMove error.\tfilesystem.move NE_FS_UNLCWAT\tUnable to create watcher.\tfilesystem.createWatcher NE_FS_NOWATID\tUnable to find watcher.\tfilesystem.removeWatcher NE_OS_UNLTOUP\tUnable to update the spawned process due to an invalid process identifier or action.\tos.updateSpawnedProcess NE_OS_INVMSGA\tInvalid message box arguments.\tos.showMessageBox NE_OS_INVKNPT\tInvalid platform path name.\tos.getPath NE_ST_INVSTKY\tInvalid storage key.\tstorage.getData, storage.setData NE_ST_STKEYWE\tStorage write error.\tstorage.setData NE_RT_INVTOKN\tInvalid access token.\tall NE_RT_NATPRME\tNo permission to execute the provided native method.\tall, NE_RT_APIPRME\tNo permission to use the native API.\tall NE_RT_NATRTER\tNative method runtime error. Mostly occured due to missing parameters.\tall NE_RT_NATNTIM\tNative method is not implemented.\tinternal NE_CL_NSEROFF\tNeutralino server is not reachable.\tall NE_EX_EXTNOTC\tExtension is not connected yet\textensions.dispatch NE_UP_CUPDMER\tInvalid update manifest or mismatching applicationId\tupdater.checkForUpdates NE_UP_CUPDERR\tUnable to fetch update manifest\tupdater.checkForUpdates NE_UP_UPDNOUF\tNo update manifest loaded\tupdater.install NE_UP_UPDINER\tUpdate installation error\tupdater.install ","version":"Next","tagName":"h2"},{"title":"Neutralino.init","type":0,"sectionRef":"#","url":"/docs/api/init","content":"","keywords":"","version":"Next"},{"title":"init()​","type":1,"pageTitle":"Neutralino.init","url":"/docs/api/init#init","content":" The application developer needs to call this method explicitly via a JavaScript source file before using any native API function. The init function does the following tasks when it's called. Starts a WebSocket connection with the Neutralinojs server asynchronously.Registers auto-reload event handler if the --neu-dev-auto-reload flag (the neu run command sets this flag) is provided.Defines NL_CVERSION with the client libary version in the window scope. You can call native API calls right after the init function call, as shown below. Neutralino.init(); Neutralino.os.showMessageBox('Welcome', 'Hello Neutralinojs'); Also, you can wrap immediate native calls with the ready event callback if you like. Neutralino.init(); Neutralino.events.on('ready', () => { Neutralino.os.showMessageBox('Welcome', 'Hello Neutralinojs'); }); info Neutralinojs client library typically queues and sends native API calls to the server when the WebSocket connection is established. Therefore, you don't need to use the ready event callback always. ","version":"Next","tagName":"h2"},{"title":"Global Variables","type":0,"sectionRef":"#","url":"/docs/api/global-variables","content":"","keywords":"","version":"Next"},{"title":"Predefined global variables​","type":1,"pageTitle":"Global Variables","url":"/docs/api/global-variables#predefined-global-variables","content":" Variable\tDescriptionNL_OS\tOperating system name: Linux, Windows, or Darwin NL_ARCH\tCPU architecture: x64, arm, itanium, ia32, or unknown NL_APPID\tApplication identifier NL_APPVERSION\tApplication version NL_PORT\tApplication port NL_MODE\tMode of the application: window, browser, cloud, or chrome NL_VERSION\tNeutralinojs framework version NL_CVERSION\tNeutralinojs client version NL_CWD\tCurrent working directory NL_PATH\tApplication path NL_ARGS\tCommand-line arguments NL_PID\tIdentifier of the current process NL_RESMODE\tSource of application resources: bundle or directory NL_EXTENABLED\tReturns true if extensions are enabled NL_COMMIT\tFramework binary's release commit hash NL_CCOMMIT\tClient librar's release commit hash NL_CMETHODS\tCustom method identifiers (Returns the same output that custom.getMethods returns). NL_WSAVSTLOADED\tReturns true if the initial window state was loaded from the saved configuration tip You can use NL_COMMIT and NL_CCOMMIT values to identify the codebase snapshot if you use nightly releases. ","version":"Next","tagName":"h2"},{"title":"Custom global variables​","type":1,"pageTitle":"Global Variables","url":"/docs/api/global-variables#custom-global-variables","content":" You can make custom global variables too via neutralino.config.json, as shown below. "globalVariables": { "TEST": "Test Value" } The above custom global variable's value can be accessed with NL_TEST. You can set any data type for custom global variables. Look at the following examples. "globalVariables": { "TEST_1": 1, "TEST_2": null, "TEST_3": 3.5, "TEST_4": [3, 5, 4, 5], "TEST_5": { "key": "value", "anotherKey": 100 } } Avoid overriding predefined global variables. ","version":"Next","tagName":"h2"},{"title":"Native API Overview","type":0,"sectionRef":"#","url":"/docs/api/overview","content":"","keywords":"","version":"Next"},{"title":"Native API namespaces​","type":1,"pageTitle":"Native API Overview","url":"/docs/api/overview#native-api-namespaces","content":" Neutralino.appNeutralino.clipboardNeutralino.computerNeutralino.customNeutralino.debugNeutralino.eventsNeutralino.extensionsNeutralino.filesystemNeutralino.initNeutralino.osNeutralino.storageNeutralino.updaterNeutralino.window ","version":"Next","tagName":"h2"},{"title":"Neutralino.updater","type":0,"sectionRef":"#","url":"/docs/api/updater","content":"","keywords":"","version":"Next"},{"title":"updater.checkForUpdates(url)​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#updatercheckforupdatesurl","content":" Checks latest updates from the given URL. The URL should return a valid Neutralinojs update manifest withContent-Type: application/json header. Throws NE_UP_CUPDMER for invalid manifests and NE_UP_CUPDERRfor network connectivity issues. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#parameters","content":" url String: URL to fetch update manifest. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#return-object-awaited","content":" Update manifest. let url = 'https://example.com/updates/manifest.json'; let manifest = await Neutralino.updater.checkForUpdates(url); ","version":"Next","tagName":"h3"},{"title":"updater.install()​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#updaterinstall","content":" Installs updates from the downloaded update manifest. Throws NE_UP_UPDNOUF if the manifest isn't loaded. If the update installation process fails, this function will throw NE_UP_UPDINER. let url = 'https://example.com/updates/manifest.json'; let manifest = await Neutralino.updater.checkForUpdates(url); if(manifest.version != NL_APPVERSION) { await Neutralino.updater.install(); } else { console.log('You are using the latest version!'); } ","version":"Next","tagName":"h2"},{"title":"Neutralino.storage","type":0,"sectionRef":"#","url":"/docs/api/storage","content":"","keywords":"","version":"Next"},{"title":"storage.setData(key, data)​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#storagesetdatakey-data","content":" Writes data into Neutralinojs shared storage.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#parameters","content":" key String: A unique identifier.data Object (optional): Data as a string. If this value is null or undefined, the specific data record will be erased from the disk. await Neutralino.storage.setData('userDetails', JSON.stringify({ username: 'TestValue'}) ); ","version":"Next","tagName":"h3"},{"title":"storage.getData(key)​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#storagegetdatakey","content":" Reads and returns data for a given Neutralinojs shared storage key.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#parameters-1","content":" key String: Storage data record identifier. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#return-string-awaited","content":" Data string of the storage record. let data = await Neutralino.storage.getData('userDetails'); console.log(`Data: ${data}`); ","version":"Next","tagName":"h3"},{"title":"storage.getKeys()​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#storagegetkeys","content":" Returns all storage keys. ","version":"Next","tagName":"h2"},{"title":"Return Array (awaited):​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#return-array-awaited","content":" A string array of existing storage keys. let keys = await Neutralino.storage.getKeys(); console.log('Keys: ', keys); ","version":"Next","tagName":"h3"},{"title":"Internal CLI Arguments","type":0,"sectionRef":"#","url":"/docs/cli/internal-cli-arguments","content":"","keywords":"","version":"Next"},{"title":"General​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#general","content":" ","version":"Next","tagName":"h2"},{"title":"--load-dir-res​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--load-dir-res","content":" Notifies Neutralinojs server to fetch files from the resources directory. If this flag is not provided, Neutralinojs server will load resources from the resources.neu file. tip If Neutralinojs fails to load resources resources.neu, this flag is automatically enabled internally to find resources from the app directory. Therefore, you can double click on the binary instead of neu run while developing apps. ","version":"Next","tagName":"h3"},{"title":"--config-file=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--config-filefilename","content":" Uses a custom configuration file instead of the default neutralino.config.json file for loading the app configuration JSON. This CLI option is helpful for setting a development-only configuration file (i.e., --config-file=neutralino-dev.config.json). info The neu build command won't typically include custom configuration files for the final application bundle — it only embeds the defaultneutralino.config.json file allowing you to store production app configuration. ","version":"Next","tagName":"h3"},{"title":"--path=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--pathpath","content":" Overrides the resources path with a relative path or absolute path. This will change the NL_PATH global variable. ","version":"Next","tagName":"h3"},{"title":"--mode=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--modemode","content":" Overrides the default mode. Accepted values are: window, browser, and cloud. ","version":"Next","tagName":"h3"},{"title":"--neu-dev-auto-reload​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--neu-dev-auto-reload","content":" Listens to the neuDev_reloadApp event. When this CLI argument is provided, each modification done to the resources will automatically reload the application. The neu run command executes Neutralinojs with this flag by default. --neu-dev- is a reserved CLI argument prefix for Neutralinojs process. Therefore, avoid adding custom arguments with --neu-dev- prefix. Feel free to use the --dev- prefix for your development-related CLI flags. ","version":"Next","tagName":"h3"},{"title":"--neu-dev-extension​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--neu-dev-extension","content":" Loads js.neutralino.devtools extension internally for development purposes. The neu CLI uses this CLI argument to establish an IPC with the application process. This option only works if application resources are loaded from a directory (won't work for end-users). ","version":"Next","tagName":"h3"},{"title":"--url=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--urlurl","content":" Overrides the URL on the application. ","version":"Next","tagName":"h3"},{"title":"--document-root=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--document-rooturl","content":" Overrides the document root of the static server. ","version":"Next","tagName":"h3"},{"title":"--port=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--portport","content":" Overrides the application port and will change the NL_PORT global variable. If 0 is given, Neutralino will use a random available port. ","version":"Next","tagName":"h3"},{"title":"--logging-enabled=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--logging-enabledtruefalse","content":" Overrides the logging feature status. ","version":"Next","tagName":"h3"},{"title":"--logging-write-to-log-file=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--logging-write-to-log-filetruefalse","content":" Overrides the log file feature status. ","version":"Next","tagName":"h3"},{"title":"--export-auth-info=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--export-auth-infotruefalse","content":" Overrides auth details export setting. ","version":"Next","tagName":"h3"},{"title":"--enable-extensions=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--enable-extensionstruefalse","content":" Overrides extensions feature's availability. ","version":"Next","tagName":"h3"},{"title":"--enable-server=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--enable-servertruefalse","content":" Enables or disables the background server (Disables static file servering feature and native API messaging). If you load a remote URL to the webview, you can set this option to true. ","version":"Next","tagName":"h3"},{"title":"--enable-native-api=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--enable-native-apitruefalse","content":" Overrides the primary native API execution permission. ","version":"Next","tagName":"h3"},{"title":"--single-page-serve=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--single-page-servetruefalse","content":" Overrides the single page serving option. ","version":"Next","tagName":"h3"},{"title":"Window mode​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#window-mode","content":" The following CLI arguments are used when the application runs with the window mode. ","version":"Next","tagName":"h2"},{"title":"--window-title=​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-titletitle","content":" Overrides the window title. ","version":"Next","tagName":"h3"},{"title":"--window-icon=<icon_path>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-iconicon_path","content":" Overrides the window icon. ","version":"Next","tagName":"h3"},{"title":"--window-full-screen=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-full-screentruefalse","content":" Overrides the window's initial full screen status. ","version":"Next","tagName":"h3"},{"title":"--window-always-on-top=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-always-on-toptruefalse","content":" Overrides the window's initial top-most mode. ","version":"Next","tagName":"h3"},{"title":"--window-borderless=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-borderlesstruefalse","content":" Overrides the window's borderless mode. ","version":"Next","tagName":"h3"},{"title":"--window-maximize=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-maximizetruefalse","content":" Overrides the window's initial maximize status. ","version":"Next","tagName":"h3"},{"title":"--window-hidden=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-hiddentruefalse","content":" Overrides the window's initial visibility status. ","version":"Next","tagName":"h3"},{"title":"--window-maximizable=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-maximizabletruefalse","content":" Overrides the window's initial maximizable status. ","version":"Next","tagName":"h3"},{"title":"--window-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-widthnumber","content":" Overrides the window width. ","version":"Next","tagName":"h3"},{"title":"--window-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-heightnumber","content":" Overrides the window height. ","version":"Next","tagName":"h3"},{"title":"--window-min-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-min-widthnumber","content":" Overrides the window's minimum width. ","version":"Next","tagName":"h3"},{"title":"--window-min-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-min-heightnumber","content":" Overrides the window's minimum height. ","version":"Next","tagName":"h3"},{"title":"--window-max-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-max-widthnumber","content":" Overrides the window's maximum width. ","version":"Next","tagName":"h3"},{"title":"--window-max-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-max-heightnumber","content":" Overrides the window's maximum height. ","version":"Next","tagName":"h3"},{"title":"--window-x=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-xnumber","content":" Overrides the window left (x) position. ","version":"Next","tagName":"h3"},{"title":"--window-y=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-ynumber","content":" Overrides the window top (y) position. ","version":"Next","tagName":"h3"},{"title":"--window-center=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-centertruefalse","content":" Overrides the window's initial center positioning setup. ","version":"Next","tagName":"h3"},{"title":"--window-transparent=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-transparenttruefalse","content":" Overrides the window transparency mode. ","version":"Next","tagName":"h3"},{"title":"--window-resizable=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-resizabletruefalse","content":" Overrides the window's initial resizability status. ","version":"Next","tagName":"h3"},{"title":"--window-exit-process-on-close=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-exit-process-on-closetruefalse","content":" Overrides the close button's behavior. ","version":"Next","tagName":"h3"},{"title":"--window-enable-inspector=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-enable-inspectortruefalse","content":" Automatically opens the developer tools window. ","version":"Next","tagName":"h3"},{"title":"--window-use-saved-state=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-use-saved-statetruefalse","content":" Overrides the saved window state feature setting. ","version":"Next","tagName":"h3"},{"title":"--window-extend-user-agent-with=<suffix>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-extend-user-agent-withsuffix","content":" Overrides the custom user agent setting. ","version":"Next","tagName":"h3"},{"title":"Chrome mode​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#chrome-mode","content":" The following CLI arguments are used when the application runs with the chrome mode. ","version":"Next","tagName":"h2"},{"title":"--chrome-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--chrome-widthnumber","content":" Chrome window's width. ","version":"Next","tagName":"h3"},{"title":"--chrome-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--chrome-heightnumber","content":" Chrome window's height. ","version":"Next","tagName":"h3"},{"title":"--chrome-args=<arg_list>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--chrome-argsarg_list","content":" Additional arguments for the Chrome process. Read more about chrome mode from here tip The right hand value is optional for the for boolean type CLI arguments. Therefore, you can use --window-full-screeninstead of --window-full-screen=true. However, if you define window.fullScreen as true and you need to override it asfalse you have to use --window-full-screen=false. ","version":"Next","tagName":"h3"},{"title":"Neutralino.filesystem","type":0,"sectionRef":"#","url":"/docs/api/filesystem","content":"","keywords":"","version":"Next"},{"title":"filesystem.createDirectory(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemcreatedirectorypath","content":" Creates a directory or multiple directories recursively. Throws NE_FS_DIRCRER if directory creation is not possible. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters","content":" path String: New directory path. await Neutralino.filesystem.createDirectory('./newDirectory'); await Neutralino.filesystem.createDirectory(NL_PATH + '/myFolder/api/fs'); ","version":"Next","tagName":"h3"},{"title":"filesystem.remove(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemremovepath","content":" Removes a directory or file. If the given path is a directory, this function recursively removes all contents of the specific directory. Throws NE_FS_REMVERR if the removal is not possible. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-1","content":" path String: Directory or file path. await Neutralino.filesystem.remove('./tmpDirectory'); await Neutralino.filesystem.remove('./tmpFile.txt'); ","version":"Next","tagName":"h3"},{"title":"filesystem.writeFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemwritefilefilename-data","content":" Writes a text file. Throws NE_FS_FILWRER for file write errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-2","content":" filename String: Filename.data String: Content of the file. await Neutralino.filesystem.writeFile('./myFile.txt', 'Sample content'); ","version":"Next","tagName":"h3"},{"title":"filesystem.appendFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemappendfilefilename-data","content":" Appends text content to file. Throws NE_FS_FILWRER for file write errors. If the provided file doesn't exist, this function creates a new file with data. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-3","content":" filename String: Filename.data String: Content to append. await Neutralino.filesystem.appendFile('./myFile.txt', 'Sample '); await Neutralino.filesystem.appendFile('./myFile.txt', 'content'); ","version":"Next","tagName":"h3"},{"title":"filesystem.writeBinaryFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemwritebinaryfilefilename-data","content":" Writes a binary file. Throws NE_FS_FILWRER for file write errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-4","content":" filename String: Filename.data ArrayBuffer: Content of the binary file as anArrayBuffer. let rawBin = new ArrayBuffer(1); let view = new Uint8Array(rawBin); view[0] = 64; // Saves ASCII '@' to the binary file await Neutralino.filesystem.writeBinaryFile('./myFile.bin', rawBin); ","version":"Next","tagName":"h3"},{"title":"filesystem.appendBinaryFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemappendbinaryfilefilename-data","content":" Appends binary data to a file. Throws NE_FS_FILWRER for file write errors. If the provided file doesn't exist, this function creates a new file with data. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-5","content":" filename String: Filename.data ArrayBuffer: Binary content to append as anArrayBuffer. let rawBin = new ArrayBuffer(1); let view = new Uint8Array(rawBin); view[0] = 64; // Saves ASCII '@' to the binary file await Neutralino.filesystem.appendBinaryFile('./myFile.bin', rawBin); await Neutralino.filesystem.appendBinaryFile('./myFile.bin', rawBin); ","version":"Next","tagName":"h3"},{"title":"filesystem.readFile(filename)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemreadfilefilename","content":" Reads a text file. Throws NE_FS_FILRDER for file read errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-6","content":" filename String: Filename.pos Number (optional): File cursor position in bytes.size Number (optional): File reader buffer size in bytes. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-string-awaited","content":" File content. let data = await Neutralino.filesystem.readFile('./myFile.txt'); console.log(`Content: ${data}`); let data = await Neutralino.filesystem.readFile('./myFile.txt', { pos: 2, size: 10 }); console.log(`Content: ${data}`); ","version":"Next","tagName":"h3"},{"title":"filesystem.readBinaryFile(filename)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemreadbinaryfilefilename","content":" Reads binary files. Throws NE_FS_FILRDER for file read errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-7","content":" filename String: Filename.pos Number (optional): File cursor position in bytes.size Number (optional): File reader buffer size in bytes. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited","content":" Content of the binary file as anArrayBuffer. let data = await Neutralino.filesystem.readBinaryFile({ fileName: './myFile.bin' }); let view = new Uint8Array(data); console.log('Binary content: ', view); ","version":"Next","tagName":"h3"},{"title":"filesystem.openFile(filename)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemopenfilefilename","content":" Creates a readable file stream. Throws NE_FS_FILOPER for file open errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-8","content":" filename String: Filename. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-number-awaited","content":" File stream identifier. let fileId = await Neutralino.filesystem.openFile('./myFile.txt'); console.log(`ID: ${fileId}`); ","version":"Next","tagName":"h3"},{"title":"filesystem.updateOpenedFile(id, action, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemupdateopenedfileid-action-data","content":" Invokes file stream actions. Throws NE_FS_UNLTOUP if the framework can't update the stream. Call this method to read and seek an opened file (aka a readable stream). ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-9","content":" id Number: File stream identifier.action String: An action to take. Accepts only the following values: read: Reads a bytes segment from the file stream.readBinary: Behaves the same as read but uses the binary read mode.readAll: Triggers the read action until file stream cursor position reachesEOF.readAllBinary: Behaves the same as readAll but uses the binary read mode.seek: Sets the file cursor position.close: Closes and frees file handler resources. data Object (optional): Additional data for the action. Send the buffer size in bytes (default: 256 bytes) if the action is read, readBinary, readAll, or readAllBinary. Send the file stream cursor position if the action is seek. let fileId = await Neutralino.filesystem.openFile('./myFile.txt'); let content = ''; Neutralino.events.on('openedFile', (evt) => { if(evt.detail.id == fileId) { switch(evt.detail.action) { case 'data': content += evt.detail.data; break; case 'end': console.log(content); break; } } }); // Sets the file stream cursor to 10th byte await Neutralino.filesystem.updateOpenedFile(fileId, 'seek', 10); // Reads 2 bytes from the cursor position await Neutralino.filesystem.updateOpenedFile(fileId, 'read', 2); // Reads the next bytes until the cursor reaches EOF (buffer size: 2) await Neutralino.filesystem.updateOpenedFile(fileId, 'readAll', 2); ","version":"Next","tagName":"h3"},{"title":"filesystem.getOpenedFileInfo(id)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetopenedfileinfoid","content":" Returns file stream details. Throws NE_FS_UNLTFOP if the file stream identifier is not valid. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-10","content":" id Number: File stream identifier. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-1","content":" id Number: File stream identifier.eof Boolean: Becomes true if the stream reached EOF.pos Number: File stream cursor position.lastRead Number: Last read bytes. let info = await Neutralino.filesystem.getOpenedFileInfo(0); console.log(info); ","version":"Next","tagName":"h3"},{"title":"filesystem.createWatcher(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemcreatewatcherpath","content":" Creates a filesystem watcher. Throws NE_FS_UNLCWAT for watcher creation failures. If there is an existing active watcher for the given path, this function returns the existing watcher identifier. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-11","content":" path String: Directory path. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-number-awaited-1","content":" File watcher identifier. let watcherId = await Neutralino.filesystem.createWatcher(NL_PATH); Neutralino.events.on('watchFile', (evt) => { if(watcherId == evt.detail.id) { console.log(evt.detail); } }); console.log(`ID: ${watcherId}`); ","version":"Next","tagName":"h3"},{"title":"filesystem.removeWatcher(watcherId)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemremovewatcherwatcherid","content":" Removes a filesystem watcher. Throws NE_FS_NOWATID for watcher removal failures. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-12","content":" watcherId Number: File watcher identifier. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-number-awaited-2","content":" File watcher identifier. let watcherId = await Neutralino.filesystem.createWatcher(NL_PATH); console.log(`ID: ${watcherId}`); await Neutralino.filesystem.removeWatcher(watcherId); ","version":"Next","tagName":"h3"},{"title":"filesystem.getWatchers()​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetwatchers","content":" Returns information about created file watchers. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-2","content":" An array of FileWatcher objects. ","version":"Next","tagName":"h3"},{"title":"FileWatcher​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filewatcher","content":" id Number: Watcher identifier.path String: File watcher path. let watchers = await Neutralino.filesystem.getWatchers(); for(let watcher of watchers) { console.log(watcher); } ","version":"Next","tagName":"h3"},{"title":"filesystem.readDirectory(path, options)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemreaddirectorypath-options","content":" Reads directory contents. Throws NE_FS_NOPATHE if the path doesn't exist. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-13","content":" path String: File/directory path. ","version":"Next","tagName":"h3"},{"title":"options​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#options","content":" recursive Boolean: Read sub-directories recursively. The default value is false. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-3","content":" An array of DirectoryEntry objects. ","version":"Next","tagName":"h3"},{"title":"DirectoryEntry​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#directoryentry","content":" entry String: file name.type String: The type of the entry (FILE or DIRECTORY). let entries = await Neutralino.filesystem.readDirectory(NL_PATH); console.log('Content: ', entries); ","version":"Next","tagName":"h3"},{"title":"filesystem.copy(source, destination)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemcopysource-destination","content":" Copies a file or directory to a new destination. Throws NE_FS_COPYERR if the system cannot copy the path. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-14","content":" source String: Source path.destination String: Destination path. ","version":"Next","tagName":"h3"},{"title":"options​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#options-1","content":" recursive Boolean: Copy sub-directories recursively. The default value is true.overwrite Boolean: Overwrite an existing file with the same name. The default value is true.skip Boolean: Skip an existing file with the same name. The default value is false. await Neutralino.filesystem.copy('./source.txt', './destination.txt'); await Neutralino.filesystem.copy('./myDir', './myDirCopy'); ","version":"Next","tagName":"h3"},{"title":"filesystem.move(source, destination)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemmovesource-destination","content":" Moves a file or directory to a new destination. Throws NE_FS_MOVEERR if the system cannot rename the path. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-15","content":" source String: Source path.destination String: Destination path. await Neutralino.filesystem.move('./source.txt', './destination.txt'); await Neutralino.filesystem.move('./myDir', './myFolder'); ","version":"Next","tagName":"h3"},{"title":"filesystem.getStats(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetstatspath","content":" Returns file statistics for the given path. If the given path doesn't exist or is inaccessible,NE_FS_NOPATHE is thrown. Therefore, you can use this method to check for the existance of a file or directory. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-16","content":" path String: File or directory path. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-4","content":" size Number: Size in bytes.isFile Boolean: true if the path represents a normal file.isDirectory Boolean: true if the path represents a directory.createdAt Number: On Windows, returns Unix milliseconds of the file creation time — On Unix or Unix-like platforms, returns Unix milliseconds of the last inode modification time.modifiedAt Number: Unix milliseconds of the last file modification time. let stats = await Neutralino.filesystem.getStats('./sampleVideo.mp4'); console.log('Stats:', stats); ","version":"Next","tagName":"h3"},{"title":"filesystem.getAbsolutePath(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetabsolutepathpath","content":" Returns the absolute path for a given path. This function works with paths that don't exist on the system. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-17","content":" path String: Path. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-string-awaited-1","content":" Absolute path. let path = await Neutralino.filesystem.getAbsolutePath('./myFolder'); console.log(path); ","version":"Next","tagName":"h3"},{"title":"filesystem.getRelativePath(path, base)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetrelativepathpath-base","content":" Returns the relative path for a given path and base. This function works with paths that don't exist on the system. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-18","content":" path String: Path.base String (optional): Base path that is used for calculating the relative path with the path parameter. NL_CWD is used by default if this parameter is not provided. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-string-awaited-2","content":" Relative path. let path = await Neutralino.filesystem.getRelativePath('./myFolder'); console.log(path); path = await Neutralino.filesystem.getRelativePath('./myFolder', '/home/user'); console.log(path); ","version":"Next","tagName":"h3"},{"title":"filesystem.getPathParts(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetpathpartspath","content":" Parses a given path and returns its parts. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-19","content":" path String: Path. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-5","content":" rootName String: Root path name.rootDirectory String: Root path directory.rootPath String: Root path.relativePath String: Path relative to the root path.parentPath String: Parent path or the directory path without filename.filename String: Filename.extension String: File extension.stem String: Filename segment without extension. let pathParts = await Neutralino.filesystem.getPathParts('./myFolder/myFile.txt'); console.log('Parts:', pathParts); ","version":"Next","tagName":"h3"},{"title":"neu CLI","type":0,"sectionRef":"#","url":"/docs/cli/neu-cli","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#installation","content":" Run the following command on your terminal to install the CLI globally. npm i -g @neutralinojs/neu You can also use neu CLI via npx if you don't want a global installation. npx @neutralinojs/neu <command> ","version":"Next","tagName":"h2"},{"title":"Commands​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#commands","content":" ","version":"Next","tagName":"h2"},{"title":"neu create <binaryName>​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-create-binaryname","content":" Creates a new Neutralinojs app based on a template. Parameters​ <binaryName>: The name of your application's binary file. For example, if you used myapp, the final application binaries will become myapp-<platform>_<arch>. Options​ --template: Sets the application template via GitHub repository identifier with the <account>/<repo> format. The default value is neutralinojs/neutralinojs-minimal ","version":"Next","tagName":"h3"},{"title":"neu build​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-build","content":" This command will create the dist folder. Thereafter, it will produce the binaries for all supported platforms and resources.neu resource file from your application resources. Options​ --release: Creates a portable ZIP file of the application bundle.--copy-storage: Copies the current snapshot of the Neutralinojs storage to the application bundle. ","version":"Next","tagName":"h3"},{"title":"neu run​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-run","content":" Executes the current application (This will execute specific binary depending on your operating system). This command will change execution permissions (using the chmod command) of the binary files on Linux and macOS. Also, it enables auto-reload for the current application. In other words, when a modification happens to application resources, the Neutralinojs application will be reloaded automatically. You can see Neutralinojs process and extensions output streams while the application is running. If you use the cli.frontendLibrarykey in app configuration, the CLI enables both frontend library's development environment and Neutralinojs's development evironment at the same time. This option patches the main HTML file with the Neutralinojs client library global variables to expose the native API to the frontend library's development server. Learn how to setup this feature from this guide. Options​ --disable-auto-reload: Disables the auto-reloading feature.--arch=<arch>: Explicitly set the CPU architecture. This option is helpful if you use a 32-bit Node.js process on a 64-bit computer.-- <process-args>: Sets additional CLI arguments for the Neutralinojs application process. For example you can enable the browser mode by entering neu run -- --mode=browser. See all accepted arguments from here. ","version":"Next","tagName":"h3"},{"title":"neu update​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-update","content":" This command will update the existing Neutralinojs binaries and client library from the internet. You can use the nightly tag for the cli.binaryVersion and cli.clientVersion in the neutralino.config.json file to use experimental daily pre-releases. Options​ --latest: Fetches the latest framework version details via the GitHub API, downloads from official releases , and update the app configuration with fetched version details. warning Nightly builds refers to automatically generated daily builds, so these builds can contain experimental or incomplete features. Therefore, avoid using nightly versions in your production apps. Use nightly versions to try out latest features, but use a stable version for production apps. ","version":"Next","tagName":"h3"},{"title":"neu version​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-version","content":" Prints all version information. If this command is executed from a Neutralinojs application directory, you will see project-specific version details. Otherwise, you will see global version details. ","version":"Next","tagName":"h3"},{"title":"neu plugins [plugin]​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-plugins-plugin","content":" Parameters​ plugin: Plugin identifier. This value is usually the npm package identifer. Options​ --add: Registers a new plugin to neu CLI. neu CLI downloads plugins to the CLI's node_modulesdirectory and loads during the bootstrap process. Plugins can introduce new commands to the CLI.--remove: Unregisters an existing plugin. ","version":"Next","tagName":"h3"},{"title":"Plugins​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#plugins","content":" Neutralinojs app developers are able to write plugins to add their own commands to the neu CLI. You can develop CLI plugins with the folllowing steps. ","version":"Next","tagName":"h2"},{"title":"Developing a plugin​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#developing-a-plugin","content":" neu CLI will register plugins using index.js as an interface. Create a new npm package with index.js and add the following code snippet. // index.js module.exports = { command: 'commandname <action>', register: (command, modules) => { command.option('--option1 --option2') .action((action, command) => { //your logic goes here.. }); } } command is the CLI command string with actions. The register function will be called when plugin is being registered. Also, it has the command object andstandard modules objectas parameters. Please check commander package documentation for more information about commands and callback parameters. ","version":"Next","tagName":"h3"},{"title":"Publishing your plugin​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#publishing-your-plugin","content":" Once you publish your plugin to the npm registry as a public package, anyone will be able to install it using: neu plugins --add <package-name> and it can be removed using: neu plugins --remove <package-name> See the Appify plugin source for further implementation details. ","version":"Next","tagName":"h3"},{"title":"Changelog​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#changelog","content":" Please check the changelog from GitHub. ","version":"Next","tagName":"h2"},{"title":"Neutralino.window","type":0,"sectionRef":"#","url":"/docs/api/window","content":"","keywords":"","version":"Next"},{"title":"window.setTitle(title)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsettitletitle","content":" Sets the title of the native window. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters","content":" title String (optional): Title of the window. Clears the title, if the function was called without the parameter. await Neutralino.window.setTitle('New title'); ","version":"Next","tagName":"h3"},{"title":"window.getTitle()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowgettitle","content":" Returns the title of the native window. ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-string-awaited","content":" The current title of the native window instance. let title = await Neutralino.window.getTitle(); console.log(`title = ${title}`); ","version":"Next","tagName":"h3"},{"title":"window.minimize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowminimize","content":" Minimizes the native window. await Neutralino.window.minimize(); ","version":"Next","tagName":"h2"},{"title":"window.maximize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowmaximize","content":" Maximizes the native window. await Neutralino.window.maximize(); ","version":"Next","tagName":"h2"},{"title":"window.unmaximize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowunmaximize","content":" Restores the native window. await Neutralino.window.unmaximize(); ","version":"Next","tagName":"h2"},{"title":"window.isMaximized()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowismaximized","content":" Returns true if the native window is maximized. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited","content":" true or false based on current maximized status. let status = await Neutralino.window.isMaximized(); ","version":"Next","tagName":"h3"},{"title":"window.setFullScreen()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetfullscreen","content":" Enables the full screen mode. await Neutralino.window.setFullScreen(); ","version":"Next","tagName":"h2"},{"title":"window.exitFullScreen()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowexitfullscreen","content":" Exits from the full screen mode. await Neutralino.window.exitFullScreen(); ","version":"Next","tagName":"h2"},{"title":"window.isFullScreen()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowisfullscreen","content":" Returns true if the native window is in the full screen mode. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-1","content":" true or false based on current full screen status. let status = await Neutralino.window.isFullScreen(); ","version":"Next","tagName":"h3"},{"title":"window.show()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowshow","content":" Shows the native window. await Neutralino.window.show(); ","version":"Next","tagName":"h2"},{"title":"window.hide()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowhide","content":" Hides the native window. await Neutralino.window.hide(); ","version":"Next","tagName":"h2"},{"title":"window.isVisible()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowisvisible","content":" Returns true if the native window is visible. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-2","content":" true or false based on current visibility status. let status = await Neutralino.window.isVisible(); ","version":"Next","tagName":"h3"},{"title":"window.focus()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowfocus","content":" Focuses the native window. await Neutralino.window.focus(); ","version":"Next","tagName":"h2"},{"title":"window.setAlwaysOnTop(onTop)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetalwaysontopontop","content":" Activates or deactivates the always on top mode.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-1","content":" onTop Boolean (optional): Says whether the on top mode should be activated or not. The default value is true. await Neutralino.window.setAlwaysOnTop(true); // or setAlwaysOnTop(); await Neutralino.window.setAlwaysOnTop(false); ","version":"Next","tagName":"h3"},{"title":"window.move(x, y)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowmovex-y","content":" Moves the native window into given coordinates. Neutralinojs's cross-platform coordinate system starts from top-left corner of the screen. In other words, x=0,y=0 point refers to the top-left corner of the device's main screen. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-2","content":" x Number: An integer value for the horizontal position.y Number: An integer value for the vertical position. await Neutralino.window.move(200, 400); ","version":"Next","tagName":"h3"},{"title":"window.center()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowcenter","content":" Centers the native app window within the current display. await Neutralino.window.center(); ","version":"Next","tagName":"h2"},{"title":"window.setIcon(icon)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowseticonicon","content":" Sets an icon for the native window or Dock.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-3","content":" icon String: Path of the icon. A 200x200 PNG image file works fine on all supported operating systems. const icon = '/resources/icons/appIcon.png'; await Neutralino.window.setIcon(icon); ","version":"Next","tagName":"h3"},{"title":"window.setDraggableRegion(domId, options)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetdraggableregiondomid-options","content":" Converts a given DOM element to a draggable region. The user will be able to drag the native window by dragging the given DOM element. This feature is suitable to make custom window bars along with the borderless mode. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-4","content":" domId String | HTMLElement: A DOM element identifier.options DraggableRegionOptions (optional): Customize the behavior of the draggable region. ","version":"Next","tagName":"h3"},{"title":"DraggableRegionOptions​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#draggableregionoptions","content":" alwaysCapture Boolean (optional): If set to true, the region will always capture the pointer, ensuring that dragging is not interrupted when moving the pointer quickly. Note that it prevents child elements from receiving any pointer events. Defaults to false.dragMinDistance Number (optional): The minimum distance between cursor's starting and current position after which dragging is started. This helps prevent accidental dragging while interacting with child elements. Defaults to 10 and is measured in CSS pixels. await Neutralino.window.setDraggableRegion('myCustomTitleBar'); await Neutralino.window.setDraggableRegion('myCustomTitleBar', { alwaysCapture: true, dragMinDistance: 15 }); ","version":"Next","tagName":"h3"},{"title":"window.unsetDraggableRegion(domId)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowunsetdraggableregiondomid","content":" Converts a draggable region to a normal DOM elements by removing drag event handlers. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-5","content":" domId String | HTMLElement: A DOM element identifier. await Neutralino.window.unsetDraggableRegion('myCustomTitleBar'); ","version":"Next","tagName":"h3"},{"title":"window.setSize(Options)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetsizeoptions","content":" This method sets the size of the window. ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#options","content":" width Number (optional): Window width in pixels.height Number (optional): Window height in pixels.minWidth Number (optional): Minimum width of the window in pixels.minHeight Number (optional): Minimum height of the window in pixels.maxWidth Number (optional): Maximum width of the window in pixels.maxHeight Number (optional): Maximum height of the window in pixels.resizable Boolean (optional): A boolean value to make the window resizable or fixed. This method always expects width and height couples. For example, if you are setting minWidth, you should set minHeight too. await Neutralino.window.setSize({ width: 500, height: 200, maxWidth: 600, maxHeight: 400 }); await Neutralino.window.setSize({ resizable: false }); ","version":"Next","tagName":"h3"},{"title":"window.getSize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowgetsize","content":" Returns window size information. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-3","content":" width Number: Window width in pixels.height Number: Window height in pixels.minWidth Number Minimum width of the window in pixels.minHeight Number: Minimum height of the window in pixels.maxWidth Number: Maximum width of the window in pixels.maxHeight Number: Maximum height of the window in pixels.resizable Boolean: Says whether the window resizable or fixed. let sizeInfo = await Neutralino.window.getSize(); console.log(sizeInfo); ","version":"Next","tagName":"h3"},{"title":"window.getPosition()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowgetposition","content":" Returns window position coordinates. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-4","content":" x Number: Horizontal coordinate of the left edge of the window.y Number: Vertical coordinate of the top edge of the window. let position = await Neutralino.window.getPosition(); console.log(position); ","version":"Next","tagName":"h3"},{"title":"window.create(url, WindowOptions)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowcreateurl-windowoptions","content":" Creates a native window. You can use this method to create new window for your multi-window Neutralinojs app. Neutralinojs spawns a new process for each native window. Therefore, the new window works as an isolated app once the window is created. However, you can build communication streams between windows with the storage API. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-6","content":" url String: URL to be loaded. Eg: /resources/aboutWindow.html. Supports loading both local and remote app resources. Local resource paths need to begin with /.options (optional): an instance of WindowOptions type. ","version":"Next","tagName":"h3"},{"title":"WindowOptions​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowoptions","content":" title String: Window title.icon String: Window icon path.fullScreen Boolean: Sets full screen mode.alwaysOnTop Boolean: Activates the top-most mode.enableInspector Boolean: Activates developer tools and opens the web inspector window.borderless Boolean: Makes the window borderless.maximize Boolean: Launches the window maximized.hidden Boolean: Hides the window.maximizable Boolean: Makes the window maximizable or not.exitProcessOnClose Boolean: Exits the application process when the user clicks the window's close button.width Number: Window width.height Number: Window height.x Number: Window x position.y Number: Window y position.minWidth Number: Minimum width of the window.minHeight Number: Minimum height of the window.maxWidth Number: Maximum width of the window.maxHeight Number: Maximum height of the window.processArgs String: Additional command-line arguments for the new window process. Check all supported internal command-line arguments from here. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-object-awaited","content":" pid Number: Process identifier.stdOut String: Standard output. This value is always empty since the new window process starts asynchronously.stdErr String: Standard error. This value is always empty since the new window process starts asynchronously.exitCode Number: Exit code of the process. await Neutralino.window.create('/resources/aboutWindow.html', { icon: '/resources/icons/aboutIcon.png', enableInspector: false, width: 500, height: 300, maximizable: false, exitProcessOnClose: true, processArgs: '--window-id=W_ABOUT' }); ","version":"Next","tagName":"h3"},{"title":"Neutralino.os","type":0,"sectionRef":"#","url":"/docs/api/os","content":"","keywords":"","version":"Next"},{"title":"os.execCommand(command, options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osexeccommandcommand-options","content":" Executes a command and returns the output. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters","content":" command String: The command that is to be executed. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options","content":" background Boolean: Executes the command in background and resolve the Promise immediately if this is set to true. This option makes the process detached from the API function call, so if you need to connect with the newly created process later, consider using os.spawnProcess.stdIn String: Standard input as a string.cwd String: Current working directory. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited","content":" pid Number: Process identifier.stdOut String: Standard output.stdErr String: Standard error.exitCode Number: Exit code of the process. let info = await Neutralino.os.execCommand('python --version'); console.log(`Your Python version: ${info.stdOut}`); await Neutralino.os.execCommand('npm start', { background: true }); ","version":"Next","tagName":"h3"},{"title":"os.spawnProcess(command, cwd)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osspawnprocesscommand-cwd","content":" Spawns a process based on a command in background and let developers control it. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-1","content":" command String: The command that is to be executed in a new process.cwd String (optional): Current working directory. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-1","content":" id Number: A Neutralino-scoped process identifier. This value is used for controlling the process via the native API.pid Number: Process identifier from the operating system. let pingProc = await Neutralino.os.spawnProcess('ping neutralino.js.org'); Neutralino.events.on('spawnedProcess', (evt) => { if(pingProc.id == evt.detail.id) { switch(evt.detail.action) { case 'stdOut': console.log(evt.detail.data); break; case 'stdErr': console.error(evt.detail.data); break; case 'exit': console.log(`Ping process terminated with exit code: ${evt.detail.data}`); break; } } }); ","version":"Next","tagName":"h3"},{"title":"os.updateSpawnedProcess(id, action, data)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osupdatespawnedprocessid-action-data","content":" Updates a spawned process based on a provided action and data. Throws NE_OS_UNLTOUP if the process cannot be updated. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-2","content":" id Number: Neutralino-scoped process identifier.action String: An action to take. Accepts only the following values: stdIn: Sends data to the process via the standard input stream.stdInEnd: Closes the standard input stream file descriptor.exit: Terminates the process. data Object (optional): Additional data for the action. Send stardard input string if the actionis stdIn. let nodeProc = await Neutralino.os.spawnProcess('node'); Neutralino.events.on('spawnedProcess', (evt) => { if(nodeProc.id == evt.detail.id) { switch(evt.detail.action) { case 'stdOut': console.log(evt.detail.data); // 10 break; case 'stdErr': console.error(evt.detail.data); break; case 'exit': console.log(`Node.js process terminated with exit code: ${evt.detail.data}`); break; } } }); await Neutralino.os.updateSpawnedProcess(nodeProc.id, 'stdIn', 'console.log(5 + 5);'); await Neutralino.os.updateSpawnedProcess(nodeProc.id, 'stdInEnd'); ","version":"Next","tagName":"h3"},{"title":"os.getSpawnedProcesses()​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetspawnedprocesses","content":" Returns all spawned processes. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-2","content":" An array of SpawnedProcess objects. SpawnedProcess​ id Number: A Neutralino-scoped process identifier..pid Number: Process identifier from the operating system. await Neutralino.os.spawnProcess('ping neutralino.js.org'); await Neutralino.os.spawnProcess('ping codezri.org'); let processes = await Neutralino.os.getSpawnedProcesses(); console.log(processes); ","version":"Next","tagName":"h3"},{"title":"os.getEnv(key)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetenvkey","content":" Provides the value of a given environment variable. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-3","content":" key String: The name of the environment variable. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited","content":" Value of the given environment variable. Returns an empty string if the environment variable is not defined. let value = await Neutralino.os.getEnv('USER'); console.log(`USER = ${value}`); ","version":"Next","tagName":"h3"},{"title":"os.getEnvs()​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetenvs","content":" Returns all environment variables and their values. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-3","content":" Environment variables details in key-value pairs. let envs = await Neutralino.os.getEnvs(); console.log(envs); ","version":"Next","tagName":"h3"},{"title":"os.showOpenDialog(title, options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowopendialogtitle-options","content":" Shows the file open dialog. You can use this function to obtain paths of existing files. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-4","content":" title String (optional): Title of the dialog. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-1","content":" filters Filter[] (optional): An array of Filter objects to filter the files list.multiSelections (optional): Enables multi selections.defaultPath String (optional): Initial path/filename displayed by the dialog. Filter​ name String: Filter name.extensions String: Array of file extensions. Eg: ['jpg', 'png'] ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-4","content":" An array of selected entries. let entries = await Neutralino.os.showOpenDialog('Open a diagram', { defaultPath: '/home/my/directory/', filters: [ {name: 'Images', extensions: ['jpg', 'png']}, {name: 'All files', extensions: ['*']} ] }); console.log('You have selected:', entries); ","version":"Next","tagName":"h3"},{"title":"os.showSaveDialog(title, options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowsavedialogtitle-options","content":" Shows the file save dialog. You can use this function to obtain a path to create a new file. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-5","content":" title String (optional): Title of the dialog. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-2","content":" filters Filter[] (optional): An array of Filter objects to filter the files list.forceOverwrite Boolean (optional): Skips file overwrite warning message.defaultPath String (optional): Initial path/filename displayed by the dialog. Filter​ name String: Filter name.extensions String[]: Array of file extensions. Eg: ['jpg', 'png'] ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-1","content":" Selected filename. let entry = await Neutralino.os.showSaveDialog('Save to file', { defaultPath: 'untitled.jpg', filters: [ {name: 'Images', extensions: ['jpg', 'png']}, {name: 'All files', extensions: ['*']} ] }); console.log('You have selected:', entry); ","version":"Next","tagName":"h3"},{"title":"os.showFolderDialog(title)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowfolderdialogtitle","content":" Shows the folder open dialog. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-6","content":" title String (optional): Title of the dialog. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-3","content":" defaultPath String (optional): Initial path displayed by the dialog. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-2","content":" Selected folder. let entry = await Neutralino.os.showFolderDialog('Select installation directory', { defaultPath: '/home/my/directory/' }); console.log('You have selected:', entry); ","version":"Next","tagName":"h3"},{"title":"os.showNotification(title, content, icon)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshownotificationtitle-content-icon","content":" Displays a notification message. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-7","content":" title String: Notification title.content String: Content of the notification.icon String (optional): Icon name. Accpeted values are: INFO, WARNING, ERROR, and QUESTION. The default value isINFO await Neutralino.os.showNotification('Hello world', 'It works! Have a nice day'); await Neutralino.os.showNotification('Oops :/', 'Something went wrong', 'ERROR'); ","version":"Next","tagName":"h3"},{"title":"os.showMessageBox(title, content, choice, icon)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowmessageboxtitle-content-choice-icon","content":" Displays a message box. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-8","content":" title String: Title of the message box.content String: Content of the message box.choice String (optional): Message box buttons. Accpeted values are: OK, OK_CANCEL, YES_NO, YES_NO_CANCEL, RETRY_CANCEL, and ABORT_RETRY_IGNORE. The default value is OK.icon String (optional): Icon name. Accpeted values are: INFO, WARNING, ERROR, and QUESTION. The default value is INFO. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-3","content":" User's choice. await Neutralino.os.showMessageBox('Hello', 'Welcome'); let button = await Neutralino.os .showMessageBox('Confirm', 'Are you sure you want to quit?', 'YES_NO', 'QUESTION'); if(button == 'YES') { Neutralino.app.exit(); } ","version":"Next","tagName":"h3"},{"title":"os.setTray(options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#ossettrayoptions","content":" Creates/updates the tray icon and menu. ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-4","content":" icon String: Tray icon path. Eg: /resources/icons/trayIcon.png. A20x20-sized PNG image file works fine on all supported operating systems.menuItems TrayMenuItem[]: An array of TrayMenuItem objects. TrayMenuItem​ id String (optional): A unique identifier for each menu item.text String: Label of the menu item. This field is a mandatory field. Use - (hyphen) character for a menu separator.isDisabled Boolean (optional): A boolean flag to disable/enable a specific menu item.isChecked Boolean (optional): A boolean flag to mark a specific menu item as selected. let tray = { icon: '/resources/icons/trayIcon.png', menuItems: [ {id: "about", text: "About"}, {text: "-"}, {id: "quit", text: "Quit"} ] }; await Neutralino.os.setTray(tray); ","version":"Next","tagName":"h3"},{"title":"os.getPath(name)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetpathname","content":" Returns known platform-specific folders such as Downloads, Music, Videos, etc. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-9","content":" title String: Name of the folder. Accepted values are: config, data, cache, documents, pictures, music, video,downloads, saveGames1, saveGames2, and temp. Throws NE_OS_INVKNPT for invalid folder names. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-4","content":" Path. let downloadsPath = await Neutralino.os.getPath('downloads'); console.log(`Downloads folder: ${downloadsPath}`); ","version":"Next","tagName":"h3"},{"title":"os.open(url)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osopenurl","content":" Opens a URL with the default web browser. tip If your application is running in the default web browser, this method will open a new tab. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-10","content":" url String: URL to be opened. Neutralino.os.open('https://neutralino.js.org'); ","version":"Next","tagName":"h3"},{"title":"Project Structure","type":0,"sectionRef":"#","url":"/docs/configuration/project-structure","content":"","keywords":"","version":"Next"},{"title":"Developing apps with vanilla JS​","type":1,"pageTitle":"Project Structure","url":"/docs/configuration/project-structure#developing-apps-with-vanilla-js","content":" If you like to develop Neutralinojs applications with vanilla JavaScript, you can place all application resources in one directory. After that, you can update the neutralino.config.json file with the following values. ... "cli": { ... "resourcesPath": "/<resourcesDir>/", "clientLibrary": "/<resourcesDir>/neutralino.js" } You can choose a name for <resourceDir>. But, by default neu CLI will use resources. ","version":"Next","tagName":"h2"},{"title":"Developing apps with frontend frameworks​","type":1,"pageTitle":"Project Structure","url":"/docs/configuration/project-structure#developing-apps-with-frontend-frameworks","content":" Any frontend framework can be used to make Neutralinojs applications. You can use any pattern as you wish to include both Neutralinojs app and frontend app in one repository. You can check our recommended approach from this guide. ","version":"Next","tagName":"h2"},{"title":"Examples​","type":1,"pageTitle":"Project Structure","url":"/docs/configuration/project-structure#examples","content":" Please browse sample apps section. ","version":"Next","tagName":"h3"},{"title":"Modes","type":0,"sectionRef":"#","url":"/docs/configuration/modes","content":"","keywords":"","version":"Next"},{"title":"window​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#window","content":" Neutralinojs application will run on a native window. The window will use the user's operating system's theme. This mode is a good selection for cross-platform application development. ","version":"Next","tagName":"h2"},{"title":"browser​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#browser","content":" Neutralinojs application will use the user's default browser to load the application. Therefore, you can build web applications with native operations. You can't typically access operating system-level features via web browsers. But, the Neutralinojs browser mode helps you to make web apps that can access the operating system layer with required security controls. ","version":"Next","tagName":"h2"},{"title":"cloud​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#cloud","content":" This mode will run the Neutralinojs process as a background server. You will be able to expose your application to a public network or the internet. tip Example scenario: You can make a web application to control your computer via mobile phones. Besides, you can run the Neutralinojs server on bare-metal servers, virtual machines, and application containers as a lightweight message broker. You may find endless use-cases for this framework mode. danger Make sure that you are blocking or allowing critical native operations vianativeBlockList, nativeAllowList respectively. Also, if you started the application with administrator access, your web application will have the same permission level. ","version":"Next","tagName":"h2"},{"title":"chrome​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#chrome","content":" Neutralinojs app will run as a Chrome application. The framework uses the following Chrome command-line arguments to make the web application look more like a native app. --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-breakpad --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-infobars --disable-extensions --disable-features=site-per-process --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-sync --disable-translate --disable-windows10-custom-titlebar --metrics-recording-only --no-first-run --no-default-browser-check --safebrowsing-disable-auto-update --password-store=basic --use-mock-keychain --user-data-dir=${NL_PATH}/.tmp/chromedata Neutralinojs chrome mode works on a computer that has a pre-installed version of Google Chrome, Chromium, or Microsoft Edge browser. If no installation was detected, Neutralinojs displays an error message by asking the user to install a Chromium-based browser. You can provide additional arguments (Eg: --disable-web-security) to the Chrome process via argsconfiguration attribute. Browse all supported Chromium command-line arguments here ","version":"Next","tagName":"h2"},{"title":"About Neutralinojs","type":0,"sectionRef":"#","url":"/docs/contributing/about-neutralinojs","content":"","keywords":"","version":"Next"},{"title":"History​","type":1,"pageTitle":"About Neutralinojs","url":"/docs/contributing/about-neutralinojs#history","content":" In 2018, three Uva Wellassa University students, Shalitha Suranga,Deepal Samarakoon, and Chathumadhuri Hettiarachchi published a research paper about a theoretical way to build cross-platform apps using inbuilt platform-specific browser libraries. They initially planned to use "Neutrino" as the research project name, but it was already taken. So, they decided to use "Neutralinojs" as the project name (Neutralino refers to a hypothetical lightweight particle). For the research paper, Shalitha Suranga wrote a small POC project for GNU/Linux and Windows to demonstrate the theoretical idea and published it to GitHub as an experimental open-source project. In 2019, the research paper authors started working with the software development industry. But, Shalitha Suranga decided to maintain the POC project alone as a hobby project due to the positive feedback received from the developer communities. Later, Kasun Vithanage ported the POC project to the macOS platform. During 2020–2021, Shalitha Suranga rewrote the Neutralinojs POC project with a new WebSockets-based architecture. His goal was to make the project production-ready with a stable API, well-organized codebase, DevOps improvements, and developer-friendly documentation. Since this rewrite was so different compared to the original research project idea, he planned to re-brand "Neutralinojs" as "Neu.js". However, he decided to use the same name due to the existing Neutralinojs-related content on the internet. In 2022, Neutralinojs passed remarkable development milestones and became a popular open-source framework for building lightweight cross-platform desktop apps with JavaScript. During this journey, the developer community supported Neutralinojs with ideas and code contributions. ","version":"Next","tagName":"h2"},{"title":"Current development​","type":1,"pageTitle":"About Neutralinojs","url":"/docs/contributing/about-neutralinojs#current-development","content":" In 2022, Shalitha Suranga added the Neutralinojs project under the CodeZri non-profit organization to maintain the project, along with his other personal open-source projects. Nowadays, he releases a new framework version every two months with support from very supportive contributors. The project uses a community-driven development methodology. Developer community members and maintainers collaboratively work by writing code, reporting bugs, improving documentation, and discussing features. ","version":"Next","tagName":"h2"},{"title":"Financial perspective​","type":1,"pageTitle":"About Neutralinojs","url":"/docs/contributing/about-neutralinojs#financial-perspective","content":" Shalitha Suranga often donates his time to Neutralinojs by writing code, reviewing pull requests, and planning future of Neutralinojs. He integrated EthicalAds andGoogle Adsense with the Neutralinojs website to generate revenue for his work. Also, he accepts donations from the developer community via his personalPatreon and GitHub Sponsors accounts. Moreover, you can donate Neutralinojs via OpenCollective. Neutralinojs has no plans to monetize the framework with paid licensing/subscriptions, paid support, or courses. Also, Neutralinojs doesn't accept payments to deliver new custom features or solve bugs in apps. Our goal is to keep improving Neutralinojs as a pure FOSS project under the donation-based financial model. tip Read this articleto learn how to build a community-friendly revenue stream around your open-source project. We motivate everyone to build a community-friendly revenue stream around open-source projects! ","version":"Next","tagName":"h2"},{"title":"neutralino.config.json","type":0,"sectionRef":"#","url":"/docs/configuration/neutralino.config.json","content":"","keywords":"","version":"Next"},{"title":"Primary​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#primary","content":" The following configuraion values cannot be overridden in different Neutralinojs modes. ","version":"Next","tagName":"h2"},{"title":"applicationId: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#applicationid-string","content":" Unique string to identify your application. Eg: js.neutralino.sample ","version":"Next","tagName":"h3"},{"title":"version: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#version-string","content":" Application version. Eg: 2.4.22 ","version":"Next","tagName":"h3"},{"title":"defaultMode: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#defaultmode-string","content":" Mode of the application. Accepted values are window, browser, cloud, and chrome. ","version":"Next","tagName":"h3"},{"title":"General​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#general","content":" You can override the following configuration values from different modes. For example, you can use a specific URL in root-level and another URL in window-mode-level, as shown below. { "url": "/" "modes": { "window": { "url": "/#window-mode" } } } ","version":"Next","tagName":"h2"},{"title":"port: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#port-number","content":" The port of your application. If the value is 0, Neutralinojs will use a random available port. ","version":"Next","tagName":"h3"},{"title":"enableServer: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#enableserver-boolean","content":" Enables or disables the background server (Disables static file servering feature and native API messaging). If you load a remote URL to the webview, you can set this option to false. Make sure to set this option to true if you load resources from local sources. The default value is false. ","version":"Next","tagName":"h3"},{"title":"enableNativeAPI: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#enablenativeapi-boolean","content":" Enables or disables the native API. If you want to use any native API functions, you can set this option to true. The default value is false. ","version":"Next","tagName":"h3"},{"title":"singlePageServe: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#singlepageserve-boolean","content":" Activates SPA (Single Page App) serving. When this option is enabled, the static server module serves the primaryindex.html file for sub-directory requests only if another index.html doesn't exist in a specific sub-directory. The default value for this option is false. ","version":"Next","tagName":"h3"},{"title":"tokenSecurity: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#tokensecurity-string","content":" Neutralinojs uses a client-server communication pattern with a local WebSocket to handle native calls. This local server is protected with an auto-generated token. This option defines the security implementation for the token. Accepts the following values: one-time (Recommended) : Server sends the access token only once, and the client persists it in thesessionStorage. If another client (Eg: browser) tries to access the app, NE_RT_INVTOKN error message will be shown instead of the application. Using this option is recommended since it reduces security issues. none : Server sends the access token always, so any new client can see the application. The default value becomes one-time if this setting is not specified by the developer. danger If you are using native APIs that can access your computer's internals such as os, filesystem, modules, never use none option since any new client can use those APIs. ","version":"Next","tagName":"h3"},{"title":"url: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#url-string","content":" The entry URL of the application. Neutralinojs will initially load this URL. This property accepts both relative and absolute URLs. See following examples. "url": "/" The above config loads http://localhost:<port>/ URL initially (internally /index.html is loaded). You can use remote urls too. "url": "http://example.com" ","version":"Next","tagName":"h3"},{"title":"documentRoot: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#documentroot-string","content":" Sets the document root for the static server. For example, if you need to use resources directory as the document root, you can use setup documentRoot as follows. { "documentRoot": "/resources/", "url": "/" } Make sure to configure url properly with the document root. The following configuration is wrong, it instructs the static server to fetch resources from ./resources/resources. { "documentRoot": "/resources/", "url": "/resources/" } However, you can use a sub-directory in URL, as shown below. { "documentRoot": "/", "url": "/resources/" } ","version":"Next","tagName":"h3"},{"title":"exportAuthInfo: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#exportauthinfo-boolean","content":" Exports authentication details to the ${NL_PATH}/.tmp/auth_info.json file with the following JSON structure. { "port": "<port>", "accessToken": "<access_token>" } You can use the above authentication details to connect with Neutralinojs from external processes by using WebSocket as an IPC mechanism. ","version":"Next","tagName":"h3"},{"title":"enableExtensions: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#enableextensions-boolean","content":" Enables/disables extensions. Learn more about this option here ","version":"Next","tagName":"h3"},{"title":"extensions: object[]​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#extensions-object","content":" An array of extension definitions. Learn more about this option here ","version":"Next","tagName":"h3"},{"title":"nativeBlockList: string[]​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#nativeblocklist-string","content":" An array of native methods needs to be blocked from the frontend of the application. The wildcard character * is allowed inside entries. { "nativeBlockList": ["os.execCommand"], "nativeBlockList": ["app.*"] } ","version":"Next","tagName":"h3"},{"title":"nativeAllowList: string[]​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#nativeallowlist-string","content":" An array of native methods needs to be allowed from the frontend of the application. The wildcard character * is allowed inside entries. { "nativeAllowList": ["os.getEnv"], "nativeAllowList": ["storage.*"] } ","version":"Next","tagName":"h3"},{"title":"globalVariables: object​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#globalvariables-object","content":" A key-value-based JavaScript object of custom global variables. ","version":"Next","tagName":"h3"},{"title":"logging.enabled: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#loggingenabled-boolean","content":" Enables or disables the logging feature. ","version":"Next","tagName":"h3"},{"title":"logging.writeToLogFile: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#loggingwritetologfile-boolean","content":" Enables or disables log file. If this setting is false, the framework won't write log to neutralinojs.log, and it will write logs to standard streams. ","version":"Next","tagName":"h3"},{"title":"serverHeaders: object​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#serverheaders-object","content":" Custom headers for the static server and Websocket handshake process. For example, the following configuration sends a custom header with every outgoing HTTP response. { "serverHeaders": { "Test-Header-Option": "Value" } } ","version":"Next","tagName":"h3"},{"title":"Window mode​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#window-mode","content":" The following configuration values are used when the application runs with the window mode. ","version":"Next","tagName":"h2"},{"title":"modes.window.title: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowtitle-string","content":" Title of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.width: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowwidth-number","content":" Width of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.height: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowheight-number","content":" Height of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.minWidth: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowminwidth-number","content":" Minimum width of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.minHeight: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowminheight-number","content":" Minimum height of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.maxWidth: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowmaxwidth-number","content":" Maximum width of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.maxHeight: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowmaxheight-number","content":" Maximum height of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.x: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowx-number","content":" Left position (x) of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.y: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowy-number","content":" Right position (y) of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.center: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowcenter-boolean","content":" Centers the native app window initially. ","version":"Next","tagName":"h3"},{"title":"modes.window.transparent: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowtransparent-boolean","content":" Enables the transparent native window mode for the application instance. If the transparency mode is activated, users can see through the webview if the webpage background uses transparent background colors. Partial transparency can be activated using the rgba() CSS color function. You can use this feature to create semi-transparent windows, windows with custom shadows, and custom-shaped window frames. The default value is false for this option. info Unlike in other platforms, Windows native window becomes borderless (window controls will be hidden) with the activation of the transparent mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.fullScreen: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowfullscreen-boolean","content":" Activates the full-screen mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.icon: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowicon-string","content":" Application icon's file name. You can directly point to an image file in the resources directory. We recommend you to choose a transparent PNG file. ","version":"Next","tagName":"h3"},{"title":"modes.window.alwaysOnTop: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowalwaysontop-boolean","content":" Activates the top-most mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.enableInspector: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowenableinspector-boolean","content":" Automatically opens the developer tools window. ","version":"Next","tagName":"h3"},{"title":"modes.window.borderless: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowborderless-boolean","content":" Activates the borderless mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.maximize: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowmaximize-boolean","content":" Launches the application maximized. ","version":"Next","tagName":"h3"},{"title":"modes.window.resizable: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowresizable-boolean","content":" Make the window resizable or not. The default value is true. ","version":"Next","tagName":"h3"},{"title":"modes.window.hidden: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowhidden-boolean","content":" Make the window invisible. This setting can be used to develop background services. ","version":"Next","tagName":"h3"},{"title":"modes.window.exitProcessOnClose: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowexitprocessonclose-boolean","content":" If this setting is true, the app process will exit when the user clicks on the close button. Otherwise, the framework will dispatch the windowClose event. ","version":"Next","tagName":"h3"},{"title":"modes.window.useSavedState: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowusesavedstate-boolean","content":" Save and load the primary window state (width, height, x, y, values and maximized status) automatically. The default value is true. ","version":"Next","tagName":"h3"},{"title":"modes.window.extendUserAgentWith: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowextenduseragentwith-string","content":" Extends the default webview-specific user agent string with a custom suffix. If this value is not set, the webview sets the default user agent from the platform-specific rendering engine (i.e., WebKit on GNU/Linux). ","version":"Next","tagName":"h3"},{"title":"Chrome mode​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#chrome-mode","content":" The following configuration values are used when the application starts with the chrome mode. ","version":"Next","tagName":"h2"},{"title":"modes.chrome.width: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeschromewidth-number","content":" Width of the chrome window. ","version":"Next","tagName":"h3"},{"title":"modes.chrome.height: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeschromeheight-number","content":" Height of the chrome window. ","version":"Next","tagName":"h3"},{"title":"modes.chrome.args: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeschromeargs-string","content":" Additional command-line arguments for the Chrome process. Read more about chrome mode from here ","version":"Next","tagName":"h3"},{"title":"CLI​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cli","content":" The following configuration values are used for the neu CLI. ","version":"Next","tagName":"h2"},{"title":"cli.binaryName: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clibinaryname-string","content":" Binary file name of your application. If it is myapp, all binaries will usemyapp-<platform>_<arch> format. ","version":"Next","tagName":"h3"},{"title":"cli.resourcesPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliresourcespath-string","content":" Path of your application resources. ","version":"Next","tagName":"h3"},{"title":"cli.resourcesExclude: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliresourcesexclude-string","content":" Regex pattern to exclude files from final app bundle. For example, the following configuration will exclude all the TypeScript source files from the final build: { "resourcesExclude" : ".*\\\\.ts$|.*\\\\.tsx$" } ","version":"Next","tagName":"h3"},{"title":"cli.extensionsPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliextensionspath-string","content":" Path of your application extensions. ","version":"Next","tagName":"h3"},{"title":"cli.extensionsExclude: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliextensionsexclude-string","content":" Regex pattern to exclude files from the extensions directory of the final app package. For example, the following configuration will exclude .log and .info files: { "extensionsExclude" : ".*\\\\.log$|.*\\\\.info$" } ","version":"Next","tagName":"h3"},{"title":"cli.clientLibrary: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliclientlibrary-string","content":" Filename of the Neutralinojs JavaScript library. ","version":"Next","tagName":"h3"},{"title":"cli.binaryVersion: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clibinaryversion-string","content":" Neutralinojs server version. Get nightly builds by using the nightly tag. ","version":"Next","tagName":"h3"},{"title":"cli.clientVersion: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliclientversion-string","content":" Neutralinojs client version. Get nightly builds by using the nightly tag. ","version":"Next","tagName":"h3"},{"title":"cli.autoReloadExclude: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliautoreloadexclude-string","content":" A JavaScript regular expression to exclude files from the auto-reload file watcher. For example, the following configuration will disable auto-reloading for SASS stylesheets (.scss). { "autoReloadExclude": ".*\\\\.scss$" } Use | character to set multiple regular expressions, as shown below. { "autoReloadExclude": ".*\\\\.scss$|.*\\\\.less$" } ","version":"Next","tagName":"h3"},{"title":"cli.frontendLibrary: object​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clifrontendlibrary-object","content":" Enables frontend development tools (HMR, etc) for the neu run command. Learn more about frontend framework integration from here ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.projectPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectprojectpath-string","content":" Sets the project path of the host project. This path will be used as the current directory while executing the host-project-related commands. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.initCommand: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectinitcommand-string","content":" A command that gets executed after downloading an host app template with the neu create command. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.devCommand: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectdevcommand-string","content":" This command will run with the neu run command to start the host project. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.buildCommand: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectbuildcommand-string","content":" The neu build command will execute this command before generating the app bundle, so you can generate bundled version of host project code. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.buildPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectbuildpath-string","content":" Location where the final read-to-distribute host project files will be stored after the execution of buildCommand. Files in this folder are copied into the app bundle path after the execution of neu build command. ","version":"Next","tagName":"h3"},{"title":"cli.distributionPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clidistributionpath-string","content":" Sets the build path for neu CLI. For example, if you need to get the built binaries in build folder instead of dist, you can set the distributionPath as follows: { "distributionPath": "/build", } The default value for distributionPath is /dist. ","version":"Next","tagName":"h3"},{"title":"Windows-specific options​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#windows-specific-options","content":" There are additional configuration options that define metadata and appearance of executables for Windows platform. These fields must be placed in the root of neutralino.config.json. Every field is optional. ","version":"Next","tagName":"h2"},{"title":"applicationName: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#applicationname-string","content":" The human-readable application name. Fills in the ProductName field of the executable. ","version":"Next","tagName":"h3"},{"title":"applicationIcon: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#applicationicon-string","content":" The location of the executable's icon relative to neutralino.config.json. The icon must be in PNG format. If it is not set, an icon from modes.window.icon will be chosen instead. If modes.window.icon does not point to a PNG file, too, a default Neutralino.js icon will be used. ","version":"Next","tagName":"h3"},{"title":"author: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#author-string","content":" The developer of the application. Fills in the CompanyName field of the executable. ","version":"Next","tagName":"h3"},{"title":"description: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#description-string","content":" A description of the executable file. This usually describes the purpose of your application. Fills in the FileDescription field of the executable. ","version":"Next","tagName":"h3"},{"title":"copyright: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#copyright-string","content":" Copyright information. Fills in the LegalCopyright field of the executable. Example configuration: { "applicationId": "cook.pancake.bakery", "version": "1.2.0", "applicationName": "Pancake Bakery", "author": "Sweet Pancakes LLC", "description": "Digital recipe book for pancakes from all over the world", "copyright": "Copyright © Sweet Pancakes LLC 2042. All rights reserved.", "applicationIcon": "buildAssets/appIcon.png", "cli": { "binaryName": "pancakebakery" } } ","version":"Next","tagName":"h3"},{"title":"Architecture","type":0,"sectionRef":"#","url":"/docs/contributing/architecture","content":"Architecture The Neutralinojs framework core follows a single-process, monolithic, and layered architectural pattern with two-interconnected components: the framework core (C++) and the client library (JavaScript). Look at the following high-level architectural diagram: The framework core has two key components: the router and the native API. The router component is responsible for processing HTTP and WebSocket messages. Neutralinojs typically serve all web resources via HTTP like a normal HTTP web server. The Neutralinojs native API communication protocol uses the WebSocket messaging protocol. The router serves web resources and executes native API functions according to the incoming requests from the web context. Your JavaScript application needs to use the Neutralinojs client library functions to execute native API operations. The platform-specific webview runs the JavaScript code of the client library and your application. The webview component isn't a core framework component, so you can run Neutralinojs applications on any modern web browser with browser, chrome, and cloud modes. Because of this flexibility, you can write extensions with any programming language and connect to the framework core with authentication details. Even though an extension-less application follows a monolithic pattern, extensions make Neutralinojs applications non-monolithic with the process-based microservices architecture.","keywords":"","version":"Next"},{"title":"Code Style Guide","type":0,"sectionRef":"#","url":"/docs/contributing/code-style-guide","content":"","keywords":"","version":"Next"},{"title":"Programming best practices​","type":1,"pageTitle":"Code Style Guide","url":"/docs/contributing/code-style-guide#programming-best-practices","content":" First, make sure that your code change adheres to the following language-independent best practices: Neutralinojs codebases use a procedural and functional mixed coding style, so avoid adding classes and OOP concepts. However, it's okay to use class-based libraries, but make sure not to expose those classes from Neutralinojs internal procedures. Keep the source code simple even though the development requirement is somewhat complex.This articleexplains more about programming principles that you need to know. We stabilized the Neutralinojs codebase structure and have no plans to extend it further with new modules. In other words, please try to implement your code changes without changing the existing code structure. Please discuss first if your code suggestion needs to extend the code structure. Try to make new APIs and features consistent with the existing implementation. We decided not to expose any operating system-specific feature from the Neutralinojs API for the framework consistency across all operating systems. Therefore, make sure that your new feature will work on all supported operating systems. Write tests for new features and update the changelog file. Add comments only if a further explanation is required. Use self-explanatory identifiers for every code element by following the existing naming convention in the codebase. Use four spaces for indentation instead of tabs or two spaces. Inspect an existing source file and use the same formatting with new source files. ","version":"Next","tagName":"h2"},{"title":"C++ code style guide​","type":1,"pageTitle":"Code Style Guide","url":"/docs/contributing/code-style-guide#c-code-style-guide","content":" We are still composing a complete C++ code style guide. Make sure to follow the following points for C++ code submissions for now.  We don't use C++ exceptions. Use booleans to identify failures. For example, we use the following struct for the file read operation: struct FileReaderResult { bool hasError = false; string error; string data; }; We prefer single-line comments (i.e., // comment) over multi-line comments. Use pass-by-reference for complex data types, but use pass-by-value for atomics. Also, make sure to use theconst keyword properly if the parameter doesn't change within the procedure. For example, look at the following function definition: fs::FileReaderResult readFile(const string &filename); Avoid mixing old C-style syntax with modern C++ syntax.Use the __ prefix (double underscore) to declare module-only functions as shown in the following example: void __registerAllowList() { // implementation } Use getter and setter functions instead of shared global variables (defined with extern). ","version":"Next","tagName":"h2"},{"title":"JavaScript code style guide​","type":1,"pageTitle":"Code Style Guide","url":"/docs/contributing/code-style-guide#javascript-code-style-guide","content":" Use ES6 JavaScript syntax by avoiding legacy language syntax. Use template literals for somewhat complex string construction, but use the + operator for simple concatenation. Use the async/await syntax instead of the then/catch syntax for asynchronous operations. Avoid using too recent JavaScript APIs and language features since we need to support older Node.js and browser versions. But, think twice about readability with somewhat old JavaScript features. Don't use more than three parameters for a function—use a JSON object instead for better readability. If you work with some TypeScript codes, always strive to use the meaningful data types instead any orunknown broad data types. ","version":"Next","tagName":"h2"},{"title":"Committers","type":0,"sectionRef":"#","url":"/docs/contributing/committers","content":"","keywords":"","version":"Next"},{"title":"Become a committer​","type":1,"pageTitle":"Committers","url":"/docs/contributing/committers#become-a-committer","content":" You can actively submit patches, bug-reports, and ideas to become a Neutralinojs committer! ","version":"Next","tagName":"h2"},{"title":"Become a PMC member​","type":1,"pageTitle":"Committers","url":"/docs/contributing/committers#become-a-pmc-member","content":" PMC (Project Management Committee) members usually take decisions about project's future. Active committers will be added to the PMC list frequently by the existing PMC members according to their commitment. ","version":"Next","tagName":"h2"},{"title":"Developer Support","type":0,"sectionRef":"#","url":"/docs/contributing/developer-support","content":"","keywords":"","version":"Next"},{"title":"Bug reports and feature requests​","type":1,"pageTitle":"Developer Support","url":"/docs/contributing/developer-support#bug-reports-and-feature-requests","content":" There are no perfect software. But we can build good software. Help us to improve Neutralinojs by reporting bugs and submitting feature requests. Please create an issue on appropriate GitHub repository for feature requests and bug reporting. Neutralinojs native API: Create an issueNeutralinojs JavaScript API: Create an issueneu CLI: Create an issueStarter template: Create an issueDocumentaion: Create an issue: ","version":"Next","tagName":"h2"},{"title":"Security","type":0,"sectionRef":"#","url":"/docs/contributing/security","content":"","keywords":"","version":"Next"},{"title":"Port security and authentication​","type":1,"pageTitle":"Security","url":"/docs/contributing/security#port-security-and-authentication","content":" Once you study the Neutralinojs architecture, you will notice that the framework frontend communicates with the framework core via a WebSocket-based network port. Developers who know the operating system internals will argue that the Neutralinojs framework is vulnerable due to the local port-based IPC. Let's understand it this way. The network is undoubtedly vulnerable, but network security strategies make networks secure for every computer user—that's how we trust the internet today. Similarly, Neutralinojs uses the One-Time-Token (OTT) strategy to prevent possible port scanning attacks. Here is how the Neutralinojs local port is secured: The Neutralinojs framework's authentication module generates the OTT during the initialization process and a part of the OTT is saved as Connection Token (CT) for WebSocket clients.When the user loads the client-library script, the framework sends the OTT only once.The client library stores the OTT in the local storage for future usage—the framework never sends the OTT again to the frontend. Depending on the current application mode, the client library stores the OTT in either webview or web browser.The client library uses CT to establish a WebSocket connection with the framework.The OTT is used to verify every native API function call that comes from WebSocket clients (including the client-library).The framework blocks WebSocket connections from remote URLs within window, browser, and Chrome modes. The following criteria need to be satisfied for executing an arbitrary API function via a malicious webpage (local) or program: The specific malicious component needs to capture the OTT before the original application obtains the OTT from the framework core. This attacking strategy is not practical because of the fast application startup and lack of faster ways to access operating system-level process status. Even though someone manages to detect the application startup, the original application requests OTT before the malicious program (The framework sends OTT only once). On the other hand, malicious programs don't need Neutralinojs to damage your computer system, so use programs you trust. Even the OTT request process is not possible with modern web browsers via remote pages due to CORS-like security strategies. Also, we don't even enable the native API for remote pages due to strict application security. If there is a way (there is no proven approach yet) to crack OTT, native API access controls protect the user's computer. ","version":"Next","tagName":"h2"},{"title":"Native API access control and authorization​","type":1,"pageTitle":"Security","url":"/docs/contributing/security#native-api-access-control-and-authorization","content":" The OTT strategy provides authentication for native API access by preventing invalid/vulnerable client connections. The OTT grants access to the native API, but it doesn't give access to everything. Most modern popular application runtimes provide access to everything without proper access control. In the Neutralinojs native API model, developers need to mention the APIs they need explicitly for better security. Developers can define API permission requirements via the native allowlist or blocklist features. The Neutralinojs native API permission system provides authorization support by validating incoming requests with the pre-defined permission matrices. Look at the following authentication/authorization diagram for more details: Moreover, Neutralinojs extensions also securely receive WebSocket authentication details (OTT, CT, and port) via standard input streams, so malicious programs can't obtain connectivity secrets by scanning your process list. Read our security policyto learn how to handle security-related framework issues. ","version":"Next","tagName":"h2"},{"title":"Frequently Asked Questions","type":0,"sectionRef":"#","url":"/docs/contributing/frequently-asked-questions","content":"","keywords":"","version":"Next"},{"title":"Framework​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#framework","content":" ","version":"Next","tagName":"h2"},{"title":"Error Code 127: libayatana-appindicator3.so.1 cannot open shared object file: No such file or directory​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#error-code-127-libayatana-appindicator3so1-cannot-open-shared-object-file-no-such-file-or-directory","content":" We fixed this issue in v4.5.0, so please upgrade your framework version. If you need to use a lower framework version, you need to install the missing package with the following commands to start the app properly: apt update apt install -y libayatana-appindicator3-1 Make sure to run the above commands with sudo. Check the package information for further reference. ","version":"Next","tagName":"h3"},{"title":"CLI​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#cli","content":" ","version":"Next","tagName":"h2"},{"title":"What should I do when I get Missing permission to execute the native method: <namespace.func> error ?​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#what-should-i-do-when-i-get-missing-permission-to-execute-the-native-method-namespacefunc-error-","content":" This error occurs when permissions are not given to execute a specific native method. To be able to run this function, add the namespace.func to the nativeAllowList. To allow all functions of the particular namespace, use namespace.*. Check here to learn more about allowlists. ","version":"Next","tagName":"h3"},{"title":"yarn global add @neutralinojs/neu doesn't complete the installation process.​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#yarn-global-add-neutralinojsneu-doesnt-complete-the-installation-process","content":" When yarn is used to install neu, the output shows success Installed "@neutralinojs/neu". But, neu commands don't work even after installation, which neu outputs nothing. Check here for further information about the particular issue. This error is more of an yarn issue. To fix it, the developer needs to add the yarn global bin command output to $PATH. For example, we can add the following command to the .bashrc file (or other Shell interpreter initialization scripts): export PATH="$(yarn global bin):$PATH" For more information, check the official documentation of yarn here. ","version":"Next","tagName":"h3"},{"title":"Framework Developer Guide","type":0,"sectionRef":"#","url":"/docs/contributing/framework-developer-guide","content":"","keywords":"","version":"Next"},{"title":"Setup and build the framework​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#setup-and-build-the-framework","content":" ","version":"Next","tagName":"h2"},{"title":"Cloning the repository​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#cloning-the-repository","content":" First, clone the main repository. git clone https://github.com/neutralinojs/neutralinojs.git cd neutralinojs ","version":"Next","tagName":"h3"},{"title":"Installing compilation tools and dependencies​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#installing-compilation-tools-and-dependencies","content":" Linux​ No need for separate compilers because Linux distributions usually have GNU C/C++ compilers installed already. Install GTK, WebKit, other libraries with the following command. Debian​ sudo apt install \\ libgtk-3-dev \\ libwebkit2gtk-4.0-37 \\ libwebkit2gtk-4.0-dev Fedora​ sudo dnf install \\ @development-tools \\ gtk3 \\ webkit2gtk3.x86_64 \\ webkit2gtk3-devel.x86_64 \\ libgtk-3-dev \\ libwebkit2gtk-4.0-37 \\ libwebkit2gtk-4.0-dev \\ libglib2.0-dev \\ libxrandr-dev Arch​ sudo pacman -S \\ gtk3 \\ webkit2gtk Windows​ Install the latest Visual Studio IDE with Windows SDK. The Neutralinojs compilation process will use the MSVC C++ compiler (aka cl.exe). info How to activate Windows 10 SDK: While installing it in the Visual Studio Installer, go to tab Workloads, section "Desktop & Mobile" and select "Desktop development with C++". On the right in "Installation details" > "Desktop development with C++" > "Optional", make sure "Windows 10 SDK" is checked. macOS​ Install Xcode Command Line Tools. ","version":"Next","tagName":"h3"},{"title":"Compile the Neutralinojs framework.​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#compile-the-neutralinojs-framework","content":" Run the following script in order to build the framework binaries. python scripts/bz.py info You need to have the Python interpreter (version 3.x) installed to run this script. Neutralinojs uses BuildZri C++ build automation tool to generate binaries on local development computers and CI/CD servers. Read the BuildZri documentation to learn more about CLI options and configuration. ","version":"Next","tagName":"h3"},{"title":"Setup and build the client​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#setup-and-build-the-client","content":" Neutralinojs apps communicate with the Neutralinojs process via a WebSocket connection. This WebSocket connection gets initiated by the Neutralinojs client. Clone the client repository to the same directory where you downloaded the main repository. git clone https://github.com/neutralinojs/neutralino.js.git cd neutralino.js Install developer dependencies. npm install ","version":"Next","tagName":"h2"},{"title":"Executing the test app​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#executing-the-test-app","content":" The main repository has a simple test application that you can use during development related activities. You can enter the following command from the main repository to build and update the test app's client. bash ./scripts/update_client.sh Now run the newly compiled test app with the following command. LinuxmacOSWindows ./bin/neutralino-linux_x64 --load-dir-res ","version":"Next","tagName":"h2"},{"title":"Testing​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#testing","content":" Testing is a crucial part in every development activity. Every pull request in the main codebase will trigger the following automated tests. Builds on Linux, macOS, and Windows with x64 machines.Integration test suite. However, you can run our integration test suite from your local computer too with the following command from the main codebase's directory. cd spec npm install npm run test It's always good to run the test suite for the module you've updated with the following command. npm run test <module> # Eg: npm run test filesystem info If you need to run tests for the extensions module, make sure to enter npm install from./bin/extensions/sampleextension first. The above command will run test only for the given module. ","version":"Next","tagName":"h2"},{"title":"Adding a new test case​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#adding-a-new-test-case","content":" To add a test case simply add it to the spec/<module>.spec.js file. For example, if you need to add a new test case to the debug module, add the test case to the spec/debug.spec.js file. Next, run the test suite for that specific module, as shown in the following command snippet: cd spec npm i npm run test debug ","version":"Next","tagName":"h3"},{"title":"Project directory structure​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#project-directory-structure","content":" ","version":"Next","tagName":"h2"},{"title":"Framework​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#framework","content":" Source: github.com/neutralinojs/neutralinojs api: The native API implementation and controllers. Written in REST API style.auth: Authentication and permissions-related logic.bin: Test app source code.lib: Third-party libraries source files.server: WebSocket/HTTP communication endpoints.spec: Integration/API test suite.scripts: Contains automation scripts to build the framework, generate release notes, update the client library, and build resources.neu for the test app. ","version":"Next","tagName":"h3"},{"title":"Client library​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#client-library","content":" Source: github.com/neutralinojs/neutralino.js src/api: JavaScript API frontend and implementaion.src/browser: Browser-related API implementation.src/ws: WebSocket client implementaion.scripts: Contains automation scripts to generate release notes. ","version":"Next","tagName":"h3"},{"title":"Contribution guidelines​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#contribution-guidelines","content":" Before, contributing to the codebase, please check the following things. Discuss the feature/improvement/bug-fix with the Neutralinojs team via GitHub discussions.Get familiar with the code style. Write your code according to theNeutralinojs code style guide.Become familiar with all modules in the codebase.Avoid adding new features to only one platform. Thanks for helping us to make Neutralinojs better! ","version":"Next","tagName":"h2"},{"title":"Distribution Overview","type":0,"sectionRef":"#","url":"/docs/distribution/overview","content":"","keywords":"","version":"Next"},{"title":"Application build results​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#application-build-results","content":" The neu build command generates the following files on any supported operating system into the dist directory. Filename\tOS\tCPU architecture\tTypemyapp-linux_x64\tLinux\tx86_64\tApplication binary myapp-linux_armhf\tLinux\tarmhf\tApplication binary myapp-linux_arm64\tLinux\tarm64\tApplication binary myapp-mac_x64\tmacOS\tx86_64\tApplication binary (Intel) myapp-mac_universal\tmacOS\tx86_64 and arm64\tApplication binary myapp-mac_arm64\tmacOS\tarm64\tApplication binary (M1/M2/M3) myapp-win_x64\tWindows\tx86_64\tApplication binary resources.neu\tall\tN/A\tApplication resource file Neutralinojs officially offers only pre-built x64 and armhf/arm64 Linux-only binaries. If you need binaries for other CPU architectures, consider building binaries from the source with this guide. We are trying to officially support all CPU architectures soon! ","version":"Next","tagName":"h2"},{"title":"Selecting files for packaging​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#selecting-files-for-packaging","content":" The neu CLI generates application binaries for all supported platforms at once. These binaries are pre-built binaries. Therefore, please check oursecurity policy before you continue with the distribution process. As the first step for packaging, you can pick two files for each targeted operating system: application binary and the resource file. For example, if you need to make an application package for x64 Linux computers, pick myapp-linux_x64and the resources.neu file. The resources.neu contains all application resources, so, double click on the binary and check whether the resource file is not corrupted. ","version":"Next","tagName":"h2"},{"title":"Creating portable application packages using build scripts​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#creating-portable-application-packages-using-build-scripts","content":" The hschneider/neutralino-build-scripts community project offers pre-developed build scripts for generating platform-specific application bundles. For example, it generates a standard app structure on GNU/Linux by generating .desktop file with app icon by also providing a shell script to install the app. Clone the scripts to your root directory of your app folder to get started with Neutralinojs build scripts: git clone https://github.com/hschneider/neutralino-build-scripts.git build-scripts Install jq, which is required for parsing JSON files: # On macOS: brew install jq # On Linux or Windows/WSL: sudo apt-get install jq Update neutralino.config.json file with build scripts configuration as follows: "buildScript": { "mac": { "architecture": ["x64", "arm64", "universal"], "minimumOS": "10.13.0", "appName": "myapp", "appBundleName": "myapp", "appIdentifier": "com.marketmix.ext.bun.demo", "appIcon": "resources/icons/icon.icns" }, "win": { "architecture": ["x64"], "appName": "myapp", "appIcon": "resources/icons/icon.ico" }, "linux": { "architecture": ["x64", "arm64", "armhf"], "appName": "myapp", "appIcon": "resources/icons/icon.png", "appPath": "/usr/share/myapp", "appIconPath": "/usr/share/myapp/icon.png", "appIconLocation": "/usr/share/myapp/icon.png" } } ","version":"Next","tagName":"h2"},{"title":"Generating an application bundle for macOS​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#generating-an-application-bundle-for-macos","content":" You can generate a new application bundle for macOS by running the following command: ./build-mac.sh The build is created in the ./dist folder. The buildScript/mac JSON segment in the config-file contains the following fields: Key\tDescriptionarchitecture\tThis is an array of the architectures, you want to build. In our example we build all 3 architectures. minimumOS\tThe minimum macOS version. appName\tThe app-name as displayed in the Finder. appBundleName\tThe macOS app-bundle name. appIdentifier\tThe macOS app-identifier. appIcon\tPath to the app-icon in .icns format. If only the filename is submitted, the file is expected in the project's root. Visit the build scripts official documentation for more details. ","version":"Next","tagName":"h3"},{"title":"Generating an application bundle for Windows​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#generating-an-application-bundle-for-windows","content":" You can generate a new application bundle for Windows by running the following command: ./build-win.sh The build is created in the ./dist folder. You can now run install install-icon.cmd to set the app icon as specifed in config file. This script required you to have Resource Hacker installed on your machine. The buildScript/win JSON segment in the config-file contains the following fields: Key\tDescriptionarchitecture\tThis is an array of the architectures, you want to build. Because Neutralino currently only support 'x64', you should leave this untouched. appName\tThe app-name as displayed in the File Explorer, with or without .exe-suffix. appIcon\tPath to the app-icon in .ico format. If only the filename is submitted, the file is expected in the project's root. The icon is copied from this path into the app-bundle. To apply the icon to the executable file, you'll have to run Resource Hacker from a Windows machine. To do so, just double-click install-icon.cmd in the app-bundle. Visit the build scripts official documentation for more details. ","version":"Next","tagName":"h3"},{"title":"Generating an application bundle for Linux​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#generating-an-application-bundle-for-linux","content":" You can generate a new application bundle for GNU/Linux by running the following command: ./build-linux.sh All build targets are created in the ./dist folder. Calling sudo ./install.sh from your build folder automatically installs the app to the locations you defined. The buildScript/linux JSON segment in the config-file contains the following fields: Key\tDescriptionarchitecture\tThis is an array of the architectures, you want to build. In our example we build all 3 architectures. appName\tThe app-name as displayed in the File Explorer. appIcon\tPath to the app-icon in .png or .svg format. If only the filename is submitted, the file is expected in the project's root. The icon is copied from this path into the app-bundle. Example: resources/icons/icon.png appPath\tThe path of application directory in system where the source files will live after installing without the executable name and without ending slash. Example: /usr/share/myapp appIconPath\tThis is path to application icon after the application has been installed in the Linux system. This path is written to the .desktop-file. Example: /usr/share/myapp/icon.png appIconLocation\tSame as appIconPath. Visit the build scripts official documentation for more details. ","version":"Next","tagName":"h3"},{"title":"Creating application installers​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#creating-application-installers","content":" The following guides are not documented yet. Creating an application installer for LinuxCreating an application installer for macOSCreating an application installer for Windows ","version":"Next","tagName":"h2"},{"title":"Your First Neutralinojs App","type":0,"sectionRef":"#","url":"/docs/getting-started/your-first-neutralinojs-app","content":"","keywords":"","version":"Next"},{"title":"Introduction​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#introduction","content":" We are going to create a simple application using Neutralinojs. This sample application will display Hello with the current username of your operating system. For example, if the current username is John, it will show, Hello John. note This tutorial uses Vanilla JavaScript for building the app. If you would like to use a frontend library, check this guide. ","version":"Next","tagName":"h2"},{"title":"Step 0: Installing neu CLI​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-0-installing-neu-cli","content":" You need to install neu CLI to create Neutralinojs applications. However, you can develop applications without CLI as well. But, the CLI will make some hard stuff easy. Run the following command on your terminal to install neu CLI globally. npm install -g @neutralinojs/neu If you don't want a global installation, use neu CLI with npx. npx @neutralinojs/neu <command> ","version":"Next","tagName":"h2"},{"title":"Step 1: Creating a new app​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-1-creating-a-new-app","content":" Enter the following command to scaffold a new app. neu create myapp The above command will create a new app inside myapp directory. To make sure whether everything is fine, run your application. cd myapp neu run info If you are on Windows, you might get a blank white screen. The reason for this is, accessing localhost from a UWP context is disabled by default. Run the following command with administrative privileges on the command prompt to fix this. CheckNetIsolation.exe LoopbackExempt -a -n="Microsoft.Win32WebViewHost_cw5n1h2txyewy" You may include this in your Windows setup files (with the user's consent) because users also may get an empty white screen on Windows. For better developer experience, we recommend you to install the WebView2 runtime on Windows. ","version":"Next","tagName":"h2"},{"title":"Step 2: Writing JavaScript, HTML, and CSS​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-2-writing-javascript-html-and-css","content":" Insert the following content into your application resource files. index.htmlstyles.cssmain.js <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>NeutralinoJs</title> <link rel="stylesheet" href="styles.css"> </head> <body> <div id="neutralinoapp"> <h1 id="name"></h1> </div> <script src="js/neutralino.js"></script> <script src="js/main.js"></script> </body> </html> Neutralinojs prevents arbitary native API function execution unlike Node.js environments. Here we used the os.getEnv native function, so check whether your application configuration allows the application frontend to execute it. The default configuration already allows the entire os namespace with the following nativeAllowList permission setup: "nativeAllowList": [ "app.*", "os.*", "debug.log" ], We don't need to update anything in the permission setup since it already allows os.getEnv native function calls. ","version":"Next","tagName":"h2"},{"title":"Step 3: Running your application​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-3-running-your-application","content":" As mentioned above, you can use the run command to start your application. neu run Congrats! your application works. info The neu run command will reload your application when there is a change in application resources. Try to change your index.html while the application is running. ","version":"Next","tagName":"h2"},{"title":"Step 4: Building your application ​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-4-building-your-application","content":" To make portable binaries for your application, we can use the build command. Enter the following command on your terminal to make final binaries for all supported platforms.  neu build --release The above command will produce binaries for all platforms into the dist directory and the --release flag will also package your binaries into a .zip file. This command will do the work blazing fast because there is no compilation process behind. ","version":"Next","tagName":"h2"},{"title":"What's next?​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#whats-next","content":" Now you know how to create Neutralinojs applications. We will suggest you to look into the following topics next. neutralino.config.jsonProject structureneu CLIGlobal variablesApplication modesNative API overview We've built the above example application with vanilla JavaScript. However, you can use your favorite frontend framework to build Neutralinojs apps. Check more details about frontend framework support here. ","version":"Next","tagName":"h2"},{"title":"Using Frontend Libraries","type":0,"sectionRef":"#","url":"/docs/getting-started/using-frontend-libraries","content":"","keywords":"","version":"Next"},{"title":"React​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#react","content":" neu create myapp --template codezri/neutralinojs-react cd myapp # Start the React development server with Neutralinojs neu run # Build the React and Neutralinojs app neu build Repository: codezri/neutralinojs-react ","version":"Next","tagName":"h2"},{"title":"Using any frontend library​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#using-any-frontend-library","content":" The following tutorial guides you to set up any frontend library with Neutralinojs by explaining how we built the Neutralinojs React template: ","version":"Next","tagName":"h2"},{"title":"Initializing projects​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#initializing-projects","content":" First, you need to create a new empty Neutralinojs project. Use theneutralinojs/neutralinojs-zero template to create an empty project, as shown below. neu create myapp --template neutralinojs/neutralinojs-zero Now, create a new project with your favourite frontend framework's command-line tools. In this tutorial, we are going to use React, but you can use any frontend library as you wish. You need to create this project inside the myapp directory. cd myapp npx create-react-app react-src ","version":"Next","tagName":"h3"},{"title":"Configuring Neutralinojs project​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#configuring-neutralinojs-project","content":" The neutralinojs-zero template has a pre-included HTML file and icon, so delete the www directory since we don't need those files now. rm -rf www You need to configure the Neutralinojs project to support the frontend framework. First, you can set the document root with your frontend framework's build directory. React typically generates build outputs tobuild directory, so we can update documentRoot as follows. "documentRoot": "/react-src/build/" Now, our Neutralinojs app knows the application resource location, but it's missing an icon, so set an icon for the app. You can load an icon from your frontend framework's default resources directory. For demonstration purposes, let's use the React icon from the public directory. "modes": { "window": { // --- other options "icon": "/react-src/public/logo192.png" } } ","version":"Next","tagName":"h3"},{"title":"Configuring neu CLI​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#configuring-neu-cli","content":" By default, the zero template configuration asks the Neutralinojs CLI to download the Neutralinojs client (aka neutralino.js) from GitHub releases. Then, the CLI creates your app package by copying the neutralino.js file. However, you can download the client library from the NPM registry and bundle with your app frontend. Remove the clientLibrary property from the Neutralinojs configuration to avoid fetching the client from GitHub releases: We can configure CLI for React by using the following options. "cli": { // --- other options "resourcesPath": "/react-src/build/", // --- "clientLibrary": "/www/neutralino.js", // <--- Remove this option // --- } Now, you can build and run the React application as a Neutralinojs application — it's possible with the following steps. First, build the React application with the following command. cd react-src npm run build Finally, run the Neutralinojs application. cd .. neu run ","version":"Next","tagName":"h3"},{"title":"Initializing native API with @neutralinojs/lib​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#initializing-native-api-with-neutralinojslib","content":" You could run the application with the neu run command, but you cannot use the native API yet because it has not been initialized. To do that you need to install the Neutralinojs client with following command: cd react-src npm install @neutralinojs/lib The next step is to load Neutralinojs global variables. You can achieve that by including JavaScript script in the root HTML file of a framework of your choice. React typically holds the main HTML file content in the ./public/index.html file, so we can put the following HTML snippet there to load the client library. <script src="%PUBLIC_URL%/__neutralino_globals.js"></script> Now make sure to initialize the client library from your frontend application entry point file. React's application entry-point is typically ./src/index.js. Therefore, we can do the initialization process from there by calling the init function from @neutralinojs/lib package. import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; // Import init function from "@neutralinojs/lib" import { init } from "@neutralinojs/lib" ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById('root') ); init(); // Add this function call Let's validate if the client library loaded properly. To do that let's use filesystem API in order to read the current directory of Neutralinojs app. Firstly you need to update neutralino.config.json to allow what API your application can call. You can enable the whole namespace filesystem.* or just single function from a given namespace like in the snippet below. "nativeAllowList": [ "app.*", "filesystem.readDirectory" ], Now let's add following snippet in ./src/App.js file which will log the current directory or error message when App component is mounted. import { useEffect } from 'react' import './App.css'; // Import filesystem namespace import { filesystem } from "@neutralinojs/lib" function App() { // Log current directory or error after component is mounted useEffect(() => { filesystem.readDirectory('./').then((data) => { console.log(data) }).catch((err) => { console.log(err) }) }, []) return ( <div className="App"> My Neutralinojs App </div> ); } export default App; The last step is to run your Neutralinojs app with --window-enable-inspector argument which will allow you to open developer tools. cd react-src npm run build cd .. neu run -- --window-enable-inspector The current directory should be logged to the console. To open developer tools right click anywhere in the Neutralinojs application and press inspect element. ","version":"Next","tagName":"h3"},{"title":"Enabling hot-reload and configuration​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#enabling-hot-reload-and-configuration","content":" Building every code change and testing your application is undoubtedly time-consuming. Therefore, you can use your frontend framework's HMR (Hot Module Replacement) features to speed up your development activities. But, we have a small issue here. There are now two HTTP servers: the Neutralinojs resource server and the frontend framework's development server. How can we load the Neutralinojs client library from the frontend framework's development server? Don't worry — neu CLI provides a built-in feature to enable HMR by patching the main HTML file. You can add the following section to your configuration file for activating hot-reloading. "cli": { // --- other options "frontendLibrary": { "patchFile": "/react-src/public/index.html", "devUrl": "http://localhost:3000" } } } The above options tell neu CLI about the main HTML file and development server URL. Next, configure your project by adding frontend-library-specific development commands as follows: "cli": { // --- other options "frontendLibrary": { "patchFile": "/react-src/public/index.html", "devUrl": "http://localhost:3000", "projectPath": "/react-src/", "initCommand": "npm install", "devCommand": "BROWSER=none npm start", "buildCommand": "npm run build" } } } Finally, run the Neutralinojs application with the following command. neu run The above command executes the devCommand, starts the React development server, and run the Neutralinojs app in development mode. ","version":"Next","tagName":"h3"},{"title":"Packaging​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#packaging","content":" To produce the app binaries, you can use the following command, as usual: neu build --release The above command executes the buildCommand first, so the application bundle will use the currect React project source. See the full source code of this tutorial here. ","version":"Next","tagName":"h3"},{"title":"Auto Updater","type":0,"sectionRef":"#","url":"/docs/how-to/auto-updater","content":"","keywords":"","version":"Next"},{"title":"Creating the update manifest​","type":1,"pageTitle":"Auto Updater","url":"/docs/how-to/auto-updater#creating-the-update-manifest","content":" When you ask Neutralinojs to check for updates, it will check the update manifest via the network. Update manifest refers to a JSON document which has the following format. { "applicationId": "js.neutralino.sample", "version": "0.0.2", "resourcesURL": "http://example.com/updater_test/update_res.neu", "data": { } } applicationId String: Application identifier. You need to use the same name you used in neutralinojs.config.json. Otherwise, the update check operation will not proceed.version String: Application version.resourcesURL String: A link to download resources.neu. You can use any file name as you wish, but make sure to serve data with the Content-Type: application/octet-stream header.data Object (optional): Additional data about the update. Accepts any JSON value. ","version":"Next","tagName":"h2"},{"title":"Hosting the update manifest and resources​","type":1,"pageTitle":"Auto Updater","url":"/docs/how-to/auto-updater#hosting-the-update-manifest-and-resources","content":" Host the application manifest and resources file on the internet or a private network according to your access requirements. You can test auto updater locally by setting up a static server or placing update manifest and the resource file into your application's resources directory. Also, you can setup a DevOps pipeline to automate your application updates if you need. If you release a new application version by upgrading Neutralinojs server, users have to download/install the app again since the auto updater only update application resources (including Neutralinojs client). ","version":"Next","tagName":"h2"},{"title":"Writing code to update your app​","type":1,"pageTitle":"Auto Updater","url":"/docs/how-to/auto-updater#writing-code-to-update-your-app","content":" Call the following function whenever you need to check for updates. try { let url = "http://example.com/updater_test/update_manifest.json"; let manifest = await Neutralino.updater.checkForUpdates(url); } catch(err) { // Handle errors } Next, you can use the manifest object to compare versions. try { let url = "http://example.com/updater_test/update_manifest.json"; let manifest = await Neutralino.updater.checkForUpdates(url); if(manifest.version != NL_APPVERSION) { await Neutralino.updater.install(); await Neutralino.app.restartProcess(); } } catch(err) { // Handle errors } As shown in the above code snippet, you can call Neutralino.updater.install to perform the update based on the downloaded manifest. Later, restart the application with the app.restartProcess function. ","version":"Next","tagName":"h2"},{"title":"Extensions Overview","type":0,"sectionRef":"#","url":"/docs/how-to/extensions-overview","content":"","keywords":"","version":"Next"},{"title":"Defining the extensions​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#defining-the-extensions","content":" First, you need to define extensions you use in neutralinojs.config.json with the following structure. "extensions": [ { "id": "js.neutralino.sampleextension", "commandLinux": "${NL_PATH}/extensions/binary/linux/ext_bin", "commandDarwin": "${NL_PATH}/extensions/binary/mac/ext_bin", "commandWindows": "${NL_PATH}/extensions/binary/win/ext_bin.exe" }, { "id": "js.neutralino.binaryextension", "command": "node ${NL_PATH}/extensions/binary/main.js", } ] id String: A unique key to identify each extension. This id cannot contain any characters except for letters, numbers, and periods.command String (optional): A cross-platform command to start the extension. Eg: node ${NL_PATH}/extensions/binary/main.jswill work on every platform.commandLinux String (optional): Extension startup command for Linux.commandDarwin String (optional): Extension startup command for macOS.commandWindows String (optional): Extension startup command for Windows. ","version":"Next","tagName":"h2"},{"title":"Enable the extensions feature​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#enable-the-extensions-feature","content":" The extensions API is disabled by default. Enable extensions by adding the following setting to your app config. "enableExtensions": true ","version":"Next","tagName":"h2"},{"title":"Connecting an extension with Neutralinojs​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#connecting-an-extension-with-neutralinojs","content":" As you already noticed, an extension is just a separate process. Neutralinojs starts spawning extension instances during the framework bootstrap process and initiates each extension process by sending the following JSON object via standard input streams: { "nlPort": "", "nlToken": "", "nlConnectToken": "", "nlExtensionId": "" } The above JSON properties contains connectivity information as follows: nlPort: port of the Neutralinojs server.nlToken: Access token to use the native API.nlConnectToken: A token that extension should send during WebSocket connection initialization.nlExtensionId: Extension identifier. Now, you can connect with the Neutralinojs server with the above details. Use the following WebSocket URL to initiate a new WebSocket connection. ws://localhost:{port}?extensionId={extensionId}&connectToken={connectToken} ","version":"Next","tagName":"h2"},{"title":"Sending a message from app to an extension​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#sending-a-message-from-app-to-an-extension","content":" The extensions API uses an event-based messaging protocol. Every message uses the following JSON structure. { "event": "<event_name>", "data": {} } Use the built-in extensions API to send a message to any extension, as shown below. let extension = 'js.neutralino.sampleextension'; let event = 'helloExtension'; let data = { testValue: 10, }; await Neutralino.extensions.dispatch(extension, event, data); The above code snippet sends a message to the js.neutralino.sampleextension extension instance. You can send messages to extensions with the dispatch function anytime. If you send a message before the extension connects with the main process, the Neutralinojs client library queues and sends it when the target extension's connection is established. In other words, you don't need to worry about extensions' status when you send messages to extensions. ","version":"Next","tagName":"h2"},{"title":"Sending a message from the extension to app​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#sending-a-message-from-the-extension-to-app","content":" When you connect your extensions with the Neutralinojs main process, you can call the native API by sending WebSocket messages to the Neutralinojs process directly. Neutralinojs server processes messages based on the following format. { "id": "<id>", "method": "<method>", "accessToken": "<token>", "data": {} } id String: A UUID v4 string.method String: Native method name. Eg: window.setTitle.accessToken String: Access token generated by the Neutralinojs server.data Object (optional): Parameters for the native method. You can invoke the app.broadcast native method to send messages to all app instances. Register a callback with the events.on in the application code to receive the message send by the extension process. ","version":"Next","tagName":"h2"},{"title":"Terminating an extension instance​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#terminating-an-extension-instance","content":" When Neutralino exits, it does not send kill signals to all extension instances. Therefore, it is necessary to stop the extension process when the WebSocket-based IPC (Inter-Process Communication) closes. The following Node.js extension code shows how to do this: const fs = require('fs'); const process = require('process'); const WS = require('websocket').w3cwebsocket; const { v4: uuidv4 } = require('uuid'); const chalk = require('chalk'); // Obtain required params to start a WS connection from stdIn. const processInput = JSON.parse(fs.readFileSync(process.stdin.fd, 'utf-8')); const NL_PORT = processInput.nlPort; const NL_TOKEN = processInput.nlToken; const NL_CTOKEN = processInput.nlConnectToken; const NL_EXTID = processInput.nlExtensionId; const client = new WS( `ws://localhost:${NL_PORT}?extensionId=${NL_EXTID}&connectToken=${NL_CTOKEN}` ); client.onerror = () => log("Connection error!", "ERROR"); client.onopen = () => log("Connected"); client.onclose = () => process.exit(); client.onmessage = (e) => { const { event, data } = JSON.parse(e.data); if (event === "eventToExtension") { log(data); client.send( JSON.stringify({ id: uuidv4(), method: "app.broadcast", accessToken: NL_TOKEN, data: { event: "eventFromExtension", data: "Hello app!" }, }) ); } }; function log(message, type = "INFO") { const logLine = `[${NL_EXTID}]: ${chalk[ type === "INFO" ? "green" : "red" ](type)} ${message}`; console[type === "INFO" ? "log" : "error"](logLine); } This code implements a simple Node.js extension for Neutralinojs, which establishes a WebSocket connection to the Neutralinojs server and handles incoming messages from the server. It also sends a message to the server using the client.send method when it receives a specific event from the server. For more information on how to terminate an extension instance, you can refer to the sample extension source.https://github.com/neutralinojs/neutralinojs/tree/main/bin/extensions/sampleextension ","version":"Next","tagName":"h2"},{"title":"Using Neutralinojs from your source files​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#using-neutralinojs-from-your-source-files","content":" The above approach helps you to extend Neutralinojs API with a custom backend code. Neutralinojs process can spawn multiple extensions as child processes and communicate with the internal messaging protocol. On the other hand, you can spawn Neutralinojs processes from your own processes and communicate with the same messaging protocol. Using this approach, it's possible to write Neutralinojs apps with any backend language. You can obtain authentication details for the Neutralinojs process by setting your config as below. "exportAuthInfo": true The above setting exports authentication details to ${NL_PATH}/.tmp/auth_info.json with the following format. { "nlPort": "<port>", "nlToken": "<token>", "nlConnectToken": "<connect_token>" } Connect with the Neutralinojs process by using the extension API as usual with the extension identifier you used in the application configuration file. ","version":"Next","tagName":"h2"},{"title":"CLI","type":0,"sectionRef":"#","url":"/docs/release-notes/cli","content":"","keywords":"","version":"Next"},{"title":"Unreleased​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#unreleased","content":" ","version":"Next","tagName":"h2"},{"title":"v11.2.2​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1122","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements","content":" Fix initial loading issues with frontend library development file patching. ","version":"Next","tagName":"h3"},{"title":"v11.2.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1120","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler","content":" Introduce the --clean flag to the neu build command to clean previous build files.Add file excluding feature for the app bundle and extensions directory via cli.resourcesExclude and cli.extensionsExclude configuration properties. For example, now developers can use the "resourcesExclude": ".*\\\\.scss$|.*\\\\.d.ts$" configuration to exclude *.scss and *.d.ts files from the final app bundle.Let app developers customize the frontend library development server wait time using the cli.frontendLibrary.waitTimeout configuration property. ","version":"Next","tagName":"h2"},{"title":"Core: Version​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-version","content":" The neu version command now compares the installed CLI version and the framework version with the latest released versions and displays a warning messages if the users use an older versions.The neu version command now displays the (latest) tag with CLI, binary, client library version details. ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-1","content":" Check and validate neutralino.config.json file before executing app-specific commands.Check app template validity before downloading content from a specific GitHub repository using the official GitHub API.Add the app icon to the final app bundle only the specific project uses an app icon.Fix the port waiting timeout issue with frontend library-based development workflow. ","version":"Next","tagName":"h3"},{"title":"v11.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1110","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-1","content":" Add cli.distributionPath into the neutralino.config.json file to customize the default dist distribution directory. ","version":"Next","tagName":"h3"},{"title":"v11.0.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1101","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-2","content":" Clean existing app build files before creating another build using the neu build command.Support older Node versions by removing the optional chaining feature usage.Fix the endless port waiting issue with the --frontend-lib-dev option. ","version":"Next","tagName":"h3"},{"title":"v11.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1100","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner","content":" Change the WebSocket connection based on the v5 framework APIs. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-3","content":" Fixed issues with the frontend library command execution. ","version":"Next","tagName":"h3"},{"title":"v10.1.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1011","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-4","content":" Fixed app development issues with the Vite server. ","version":"Next","tagName":"h3"},{"title":"v10.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1010","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-5","content":" Fixed several issues in the frontend-library-based development flow (i.e., removed the hardcoded port number, fixed double devCommand execution, etc.,). ","version":"Next","tagName":"h3"},{"title":"v10.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1000","content":" ","version":"Next","tagName":"h2"},{"title":"Core: frontend-library-based development​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-frontend-library-based-development","content":" Added new configuration options to the cli.frontendLibrary key of the neutralino.config.json: projectPath: Sets the project path of the frontend-library project. This path will be used as the current directory while executing the frontend-app-related commands.initCommand: A command that gets executed after downloading an app template with the neu create command.devCommand: This command will run with the neu run command to start the frontend development server. The CLI doesn't wait for devCommand completion, instead, it will wait for the frontend development server via the tcp-port-used package.buildCommand: The neu build command will execute this command before generating the app bundle, so you can generate static resources of your frontend app using this command. ","version":"Next","tagName":"h3"},{"title":"v9.8.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v980","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Downloader​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloader","content":" Download the latest Neutralinojs framework resources with the --latest option in the neu update command.If framework versions are not present in the app/template configuration, download the latest framework resources automatically. The CLI will download nightly releases if it can't fetch the latest release tag because of an GitHub API-related issue (i.e., Exceeded rate limits). ","version":"Next","tagName":"h3"},{"title":"v9.7.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v970","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Downloader/bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloaderbundler","content":" Download the TypeScript definition file for standalone client library mode. This won't include the TypeScript definition file to the final application bundle. ","version":"Next","tagName":"h3"},{"title":"v9.6.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v961","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/Improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-6","content":" Fix the hot-reloading issue that occurs with newer Node runtime versions. ","version":"Next","tagName":"h3"},{"title":"v9.6.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v960","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-2","content":" Avoid copying the WebView2Loader.dll file to the final app package since it was removed from the Neutralinojs framework. ","version":"Next","tagName":"h3"},{"title":"v9.5.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v951","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/Improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-7","content":" Use the decompress library instead of unzipper to fix issues with latest Node.js runtime versions.Generate the Mac universal binary with the neu build command. ","version":"Next","tagName":"h3"},{"title":"v9.5.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v950","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#devops","content":" Implement a way to test plugins locally. ","version":"Next","tagName":"h3"},{"title":"v9.4.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v940","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps: new test suite​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#devops-new-test-suite","content":" Initiate a new Node.js-based test suite. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/Improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-8","content":" Clean project files if the neu create command wan't successful.Display an error message if the neu build --copy-storage fails due to missing .storage directory.Support Darwin arm64 binaries natively without binary translation (x64 -> arm64).Make the client library downloading process optional and support importing the client library via @neutralinojs/lib.Download the module version of the client library based on the app configuration. ","version":"Next","tagName":"h3"},{"title":"v9.3.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v931","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Plugins​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-plugins","content":" Automatically re-install plugins when the neu CLI version is upgraded/downgraded via package managers. ","version":"Next","tagName":"h3"},{"title":"Core: downloader/builder​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloaderbuilder","content":" Support ARM (armhf/arm64) binaries. ","version":"Next","tagName":"h3"},{"title":"v9.3.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v930","content":" ","version":"Next","tagName":"h2"},{"title":"General​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#general","content":" Add short descriptions for each command.Support to download nightly build versions. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-9","content":" Fix plugin listing issue. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#devops-1","content":" Add a simple test-suite for testing CLI commands with a Bash script. ","version":"Next","tagName":"h3"},{"title":"v9.2.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v920","content":" ","version":"Next","tagName":"h2"},{"title":"General​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#general-1","content":" Improve log messages and styles ","version":"Next","tagName":"h3"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-1","content":" Display Neutralinojs process's STDIN and STDERR streams directly on the console.Remove --verbose option from the run command. ","version":"Next","tagName":"h3"},{"title":"v9.1.2​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v912","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-2","content":" Fix client library path issue with hot-reload workaround on Windows. ","version":"Next","tagName":"h3"},{"title":"v9.1.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v911","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixes","content":" Fix browser mode exit issue with neu run. ","version":"Next","tagName":"h3"},{"title":"v9.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v910","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-3","content":" Add a workaround to use hot module reloading from the app developer's existing frontend library/framework. ","version":"Next","tagName":"h3"},{"title":"v9.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v900","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Creator​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-creator","content":" Allow downloading any community template via neu create myapp --template <template>. <template> accepts valid GitHub repo identifiers. The default value is neutralinojs/neutralinojs-minimal. ","version":"Next","tagName":"h3"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-4","content":" Add --verbose option to identify framework initialization crashes. It will show STDERR and STDOUT of the framework once the process was terminated.Support sending any internal CLI argument to the Neutralinojs process via neu run -- <additional_args>.Remove --mode=<mode> option from run since the same work can be done with neu run -- --mode=<mode>. ","version":"Next","tagName":"h3"},{"title":"Bugfixes and improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixes-and-improvements","content":" Fix the infinite retry issue with the neu run command.Show an error message for download failures. ","version":"Next","tagName":"h3"},{"title":"v8.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v810","content":" ","version":"Next","tagName":"h2"},{"title":"Core: File watcher​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-file-watcher","content":" Exclude auto-reload files via cli.autoReloadExclude.Watch only the cli.resourcesDir to avoid many unwanted reloads. ","version":"Next","tagName":"h3"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-3","content":" Add new --copy-storage flag to automatically copy storage data to the app bundle. ","version":"Next","tagName":"h3"},{"title":"v8.0.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v801","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-4","content":" Make cli.extensionsDir optional for bundling process. ","version":"Next","tagName":"h3"},{"title":"Bugfixes​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixes-1","content":" Fix an issue in websocket error log. ","version":"Next","tagName":"h3"},{"title":"v8.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v800","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-5","content":" Copy extensions to the app bundle.Rename res.neu to resources.neu. ","version":"Next","tagName":"h3"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-5","content":" Use websocket connection to auto reload app. ","version":"Next","tagName":"h3"},{"title":"v7.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v710","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Downloader​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloader-1","content":" Use server/client versions from config ","version":"Next","tagName":"h3"},{"title":"neu version​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#neu-version","content":" Removed global Neutralino version details ","version":"Next","tagName":"h3"},{"title":"Client Library","type":0,"sectionRef":"#","url":"/docs/release-notes/client-library","content":"","keywords":"","version":"Next"},{"title":"Unreleased​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#unreleased","content":" ","version":"Next","tagName":"h2"},{"title":"v5.3.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v530","content":" ","version":"Next","tagName":"h2"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem","content":" Expose filesystem.getAbsolutePath(path), filesystem.getRelativePath(path, ?base), and filesystem.getPathParts(path) functions. ","version":"Next","tagName":"h3"},{"title":"v5.2.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v520","content":" ","version":"Next","tagName":"h2"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-1","content":" Accept overwrite, skip, and recursive options for the filesystem.copy() function. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#bugfixesimprovements","content":" Improve the window.create() function's option-to-CLI argument mapping logic. ","version":"Next","tagName":"h3"},{"title":"v5.1.1​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v511","content":" ","version":"Next","tagName":"h2"},{"title":"NPM​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#npm","content":" Fix the NPM package import issue. ","version":"Next","tagName":"h3"},{"title":"v5.1.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v510","content":" ","version":"Next","tagName":"h2"},{"title":"API: clipboard​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-clipboard","content":" Export new framework functions: clipboard.getFormat(), clipboard.readImage(), and clipboard.writeImage(image). ","version":"Next","tagName":"h3"},{"title":"TypeScript​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#typescript","content":" Separate type definitions into a new directory to improve project structure.Add missing type definitions. ","version":"Next","tagName":"h3"},{"title":"v5.0.1​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v501","content":" ","version":"Next","tagName":"h2"},{"title":"TypeScript​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#typescript-1","content":" Fix type declaration issues with the window global object. Now, window.NL_VERSION, etc. won't display errors on code editors or with the TypeScript compiler. ","version":"Next","tagName":"h3"},{"title":"v5.0.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v500","content":" ","version":"Next","tagName":"h2"},{"title":"API: app​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-app","content":" Expose app.readProcessInput(readAll=false), app.writeProcessOutput(), and app.writeProcessError() functions. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-2","content":" Export/deprecate functions based on framework's v5 release. See framework changelog for more details. ","version":"Next","tagName":"h3"},{"title":"v3.13.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3130","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window","content":" Add extendUserAgentWith and exitProcessOnClose options to window.create TypeScript definition. ","version":"Next","tagName":"h3"},{"title":"v3.12.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3120","content":" ","version":"Next","tagName":"h2"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#improvementsbugfixes","content":" Improved the performance of the draggable regions API by throttling Neutralino framework function calls.Fix the restarting issue that happens when the app path contains spaces. ","version":"Next","tagName":"h3"},{"title":"v3.11.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3110","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-1","content":" Avoid saving the window state for child windows in the window.create function by using the --window-use-saved-state=false internal CLI argument. ","version":"Next","tagName":"h3"},{"title":"v3.10.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3100","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-2","content":" Export the window.center function. ","version":"Next","tagName":"h3"},{"title":"v3.9.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v390","content":" ","version":"Next","tagName":"h2"},{"title":"API: file watchers​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-file-watchers","content":" Export filesystem.createWatcher and filesystem.removeWatcher functions. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#devops","content":" Publish to NPM only if there are unreleased changes in changelog. ","version":"Next","tagName":"h3"},{"title":"v3.8.2​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v382","content":" ","version":"Next","tagName":"h2"},{"title":"NPM/ESM support​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#npmesm-support","content":" Add ESM support for the client library via neutralino.mjs.Publish (and automate) the client library as an NPM package,@neutralinojs/lib. ","version":"Next","tagName":"h3"},{"title":"v3.8.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v380","content":" ","version":"Next","tagName":"h2"},{"title":"API: custom methods and file streams​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-custom-methods-and-file-streams","content":" Expose functions in framework's custom methods and file streams implementations. ","version":"Next","tagName":"h3"},{"title":"v3.7.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v370","content":" ","version":"Next","tagName":"h2"},{"title":"API: os, filesystem, storage, and computer​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-os-filesystem-storage-and-computer","content":" Expose new framework functions: os.getEnvs, storage.getKeys, and computer.getMousePosition.Add size and pos options to filesystem.readFile and filesystem.readBinaryFile functions. ","version":"Next","tagName":"h3"},{"title":"v3.6.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v360","content":" ","version":"Next","tagName":"h2"},{"title":"API: System information API​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-system-information-api","content":" Expose the new system information API functions: computer.getArch, computer.getKernelInfo, computer.getOSInfo, computer.getCPUInfo, and computer.getDisplays. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-os","content":" Add the defaultPath option to set the default file path for all file dialogs. ","version":"Next","tagName":"h3"},{"title":"v3.5.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v350","content":" ","version":"Next","tagName":"h2"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-3","content":" Expose createdAt and modifiedAt JavaScript timestamps with the filesystem.getStats function. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-os-1","content":" Add new functions for spawning processes. spawnProcess, getSpawnedProcesses, and updateSpawnedProcess. ","version":"Next","tagName":"h3"},{"title":"v3.4.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v340","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#devops-1","content":" Add nightly builds support. Developers can download the nightly builds by setting cli.clientVersion to nightly. ","version":"Next","tagName":"h3"},{"title":"Core: global variables​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-global-variables","content":" Add NL_CCOMMIT to hold the release commit of the client library. ","version":"Next","tagName":"h3"},{"title":"v3.3.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v330","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-3","content":" Add window.getPosition to get the current window coordinates. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-4","content":" Add filesystem.appendFile to append text content to a file. Thrown errors are similar to the filesystem.writeFile function.Add filesystem.appendBinaryFile to append binary content to a file. Thrown errors are similar to the filesystem.writeBinaryFile function. ","version":"Next","tagName":"h3"},{"title":"v3.2.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v320","content":" ","version":"Next","tagName":"h2"},{"title":"API: init​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-init","content":" Store NL_TOKEN in sessionStorage and handle native API calls after page reload.Show a message to the user via HTML if NL_TOKEN is not valid (Eg: when the user tries to open the app from another client with one-time token). ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-4","content":" Add window.setAlwaysOnTop(bool).Add window.getSize. ","version":"Next","tagName":"h3"},{"title":"v3.1.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v310","content":" ","version":"Next","tagName":"h2"},{"title":"API: clipboard​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-clipboard-1","content":" clipboard.readText and clipboard.writeText functions added. ","version":"Next","tagName":"h3"},{"title":"v3.0.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v300","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Extensions​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-extensions","content":" Extension API functions. Queue messages dispatched to extensions and send when the extension is ready. ","version":"Next","tagName":"h3"},{"title":"Core: Init​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-init","content":" Reload app based on --neu-dev-auto-reload (--debug-mode removed) with the neuDev_reloadApp event. ","version":"Next","tagName":"h3"},{"title":"API: window.create​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-windowcreate","content":" Return process information with the promise. ","version":"Next","tagName":"h3"},{"title":"API: window.setDraggableRegion​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-windowsetdraggableregion","content":" Allow passing DOM element as the param. ","version":"Next","tagName":"h3"},{"title":"API: window.unsetDraggableRegion​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-windowunsetdraggableregion","content":" Newly introduced method to remove draggable region handlers from an element. ","version":"Next","tagName":"h3"},{"title":"API: Updater​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-updater","content":" Updater API functions. ","version":"Next","tagName":"h3"},{"title":"Improvements​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#improvements","content":" Make return values of events namespace functions consistent.Rename res.neu to resources.neu. ","version":"Next","tagName":"h3"},{"title":"Core: Ping on browsers​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-ping-on-browsers","content":" Polling action to the server was removed and replaced by the server process's internal idle check. app.keepAlive was removed. ","version":"Next","tagName":"h3"},{"title":"Events​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#events","content":" Client-side implementaion of extensionReady.Allow developers to call native APIs without depending on the ready event (it's not removed becuase of the internal usage). ","version":"Next","tagName":"h3"},{"title":"Framework","type":0,"sectionRef":"#","url":"/docs/release-notes/framework","content":"","keywords":"","version":"Next"},{"title":"Unreleased​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#unreleased","content":" ","version":"Next","tagName":"h2"},{"title":"v5.3.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v530","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: window transparency on Windows​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-window-transparency-on-windows","content":" Window transparency support was added on the Windows version of the Neutralinojs framework. This can be activated with modes.window.transparent configuration property or --window-transparent command-line option. Unlike in other platforms, Windows native window becomes borderless (window controls will be hidden) with the activation of the transparent mode. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os","content":" Add the temp key for the supported directory list of the os.getPath(pathKey) function. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem","content":" Add the filesystem.getAbsolutePath(path) function to let developers get a full path string from a relative path string.Add the filesystem.getRelativePath(path, ?base) function to get a relative path from a path and a base path.Add the filesystem.getPathParts(path) to parse and get path segments like filename, extension, root path, etc. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes","content":" Fix Unicode issues in the Windows version with filesystem, storage, and general modules.Fix standard output/error data display issues on Windows ","version":"Next","tagName":"h3"},{"title":"v5.2.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v520","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: Configless framework initialization​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-configless-framework-initialization","content":" Now, developers can load the Neutralinojs framework without creating a neutralino.config.json file. Now, there is no mandatory configuration properties since Neutralinojs set reasonable defaults. Developers can launch the framework using the following methods without a configuration file: # Loading a remote URL ./framework-bin --url=https://neutralino.js.org/docs # Launches a local static web app ./framework-bin --url="/resources/" --window-title="My web app" --enable-server ","version":"Next","tagName":"h3"},{"title":"Configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration","content":" New internal CLI arguments added: --single-page-serve, --enable-native-api and --document-root=<string> ","version":"Next","tagName":"h3"},{"title":"Core: Static server SPA (Single Page App) serving​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-static-server-spa-single-page-app-serving","content":" Earlier, Neutralinojs app developers had to use hash routing with their frontend-library-based apps since the internal static server didn't offer an inbuilt URL rewrite logic for SPAs (Single Page Apps). Now, they can use the singlePageServe: true option in the app configuration file to activate SPA routing. If this setting is on, the static server will serve the main index.html file when it receives directory requests that possibly send HTTP 404 status. For example, the /invoices path serves the main index.html file if there is no directory named invoices which holds an index.html file. ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window","content":" Improve the behaviour of the window.show() function on Windows. Now, this function flashes the window if it's already in foreground and activates the window properly if it's minimized. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-1","content":" Fix path issues with the defaultPath option in system file dialogs on Windows. ","version":"Next","tagName":"h3"},{"title":"v5.1.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v510","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: window transparency​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-window-transparency","content":" Neutralinojs offers the inbuilt borderless mode and draggable region API to create custom window frames using HTML and CSS. Earlier, Neutralinojs used a default opaque color (usually white) for the window and webview layer, so app developers couldn't make custom CSS-styled window frames transparent or implement custom window frame shapes (i.e., rounded edges). Now, it offers the window.transparent boolean flag to activate window transparency. If the transparency mode is on, the Neutralinojs window and webview use an alpha color layer and become transparent, so developers can use the rgba CSS color function on body background to handle the transparency level of the app. The transparency mode can be activated using the --window-transparent=<bool> internal command-line option too. Note: This feature is not implemented for the Windows operating system yet. ","version":"Next","tagName":"h3"},{"title":"API: clipboard​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-clipboard","content":" Implement clipboard.readImage() and clipboard.writeImage(image) functions to work with clipboard image data.Expose the clipboard.clear() function to clear system clipboard.Expose the clipboard.getFormat() function to check the system clipboard data format. This function returns text, image, and unknown enum values based on existing data on the clipboard. ","version":"Next","tagName":"h3"},{"title":"v5.0.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v500","content":" ","version":"Next","tagName":"h2"},{"title":"API: Reading, writing with standard streams​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-reading-writing-with-standard-streams","content":" Implement app.readProcessInput(readAll=false) for reading string data from the standard input stream. This function can read a single line or multiple lines at once.Implement app.writeProcessOutput and app.writeProcessError for sending string data to standard output and error streams accordingly. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-1","content":" Enable default recursive behavior in the filesystem.createDirectory function.Add filesystem.copy, filesystem.move, and filesystem.remove functions.Add {recursive} options object to filesystem.readDirectory(path, options) activate recursive directory listing. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os-1","content":" Accept stdin with the background mode of the os.execCommand function. ","version":"Next","tagName":"h3"},{"title":"Core: security​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-security","content":" Now, all app clients and extensions require a valid connect token (A part of the NL_TOKEN) to connect to the Neutralinojs framework WebSocket server to receive app events.The framework now sends the access token, connect token, port, and extension identifier to extension processes via the standard input, so other processes can't read them by scanning the process list.The WebSocket client connection origin is checked during the HTTP/WS handshake to make sure that only local clients connect with a specific Neutralinojs app that runs on window, browser, or Chrome mode. Any URL origin is allowed for the cloud mode.The above security enhancements fix two security advisories on GitHub. ","version":"Next","tagName":"h3"},{"title":"Global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#global-variables","content":" Now the NL_ARCH global variable returns the same value that computer.getArch returns. ","version":"Next","tagName":"h3"},{"title":"Deprecations​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#deprecations","content":" Removed filesystem.removeFile, filesystem.removeDirectory, filesystem.copyFile, and filesystem.moveFile functions.Extensions won't receive --nl-port, --nl-token, and --nl-extension-id as command-line arguments. Now the framework sends these via stdin as a JSON string. ","version":"Next","tagName":"h3"},{"title":"v4.15.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4150","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: custom user agent string​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-custom-user-agent-string","content":" Developers sometimes use the user agent string to indentify the client in server-side and client-side source codes. Now, Neutralinojs lets app developers extend the default user agent string with a custom string via the window.extendUserAgentWith configuration property and the --window-extend-user-agent-with=<string> command-line option, as shown in the following example: "window": { // --- "extendUserAgentWith": "MyAppClient" } The above configuration extends the user agent string: console.log(navigator.userAgent) // <Default UA> MyAppClient ","version":"Next","tagName":"h3"},{"title":"Configuration: custom configuration files​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-custom-configuration-files","content":" The Neutralinojs framework typically loads the application configuration content from the neutralino.config.json file, but sometimes app developers need to use a custom configuration filename during development (i.e., For separating production and development environments). Now, you can use the --config-file=<filename> internal command-line parameter to use a custom app configuration, as shown in the following example: ./myapp-linux_x64 --load-dir-res --config-file=neutralino-dev.config.json ","version":"Next","tagName":"h3"},{"title":"v4.14.1​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4141","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops","content":" Use Windows 2019 server and macOS 11 (Big Sur) to compile framework release artifacts.Set minimum supported macOS version via MACOSX_DEPLOYMENT_TARGET=10.7 ","version":"Next","tagName":"h3"},{"title":"v4.14.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4140","content":" ","version":"Next","tagName":"h2"},{"title":"Filesystem API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#filesystem-api","content":" Introduce the filesystem.getWatchers function to get all created watchers.Add binary file reading support for the filesystem.updateOpenedFile(id, action, data) function. This function implements readBinary and readAllBinary actions and dataBinary output action in the openedFile global event.Return the existing watcher identifier from filesystem.createWatcher if there is an existing active watcher for the given path. ","version":"Next","tagName":"h3"},{"title":"OS API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#os-api","content":" Add a way to set current working directory for process creation functions: os.execCommand(command, options) now supports cwd via the options object and os.spawnProcess(command, cwd) accepts currently working directory via the second string parameter. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-2","content":" Fix Unicode charactor issues in the tray menu on Windows.Avoid including null bytes to file reader events initiated by the filesystem.openFile function.Discard window method executions on non-window modes. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-1","content":" Update external GitHub Action packages to their latest versions.Fix issues of the failing test cases ","version":"Next","tagName":"h3"},{"title":"v4.13.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4130","content":" ","version":"Next","tagName":"h2"},{"title":"Core: persistent window state​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-persistent-window-state","content":" Now the framework stores the primary window state in a temporary file (JSON formatted) and loads during the startup process. This feature stores and sets the window position (x, y coordinates), size (width and height), and maximized status. This feature is enabled by default in all platforms, but app developers can turn it off by using false for the window.useSavedState configuration attribute or --window-use-saved-state internal CLI argument. Also, the window state loading status is available via the NL_WSAVSTLOADED global variable. The framework sets true for this boolean variable if the window state was loaded from the saved configuration. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-3","content":" Fix several issues in the webview Windows code (i.e., Wait for the window close event, window style fixes, etc.). ","version":"Next","tagName":"h3"},{"title":"v4.12.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4120","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-1","content":" Add window.center to center the application window programmatically. ","version":"Next","tagName":"h3"},{"title":"Core: configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-configuration","content":" Setting the initial window position via modes.window.x and modes.window.y integer config props.Centering the window at startup via modes.window.center boolean config props.Add config overrides for the startup window position: --window-center=<true|false>, --window-x=<int> and --window-y=<int> ","version":"Next","tagName":"h3"},{"title":"Core: webview​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-webview","content":" Statically link the Webview2 loader library on Windows, so app developers can package their apps without including the WebView2Loader.dll file. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-4","content":" Added Unicode characters support for Neutralinojs Windows. ","version":"Next","tagName":"h3"},{"title":"v4.11.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4110","content":" ","version":"Next","tagName":"h2"},{"title":"API: File watchers​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-file-watchers","content":" In some scenarios, Neutralinojs app developers need to implement file watchers in their apps. Earlier, Neutralinojs API didn't offer a native file watcher API and developers had to use less-performant workarounds, such as making recursive filesystem.readDirectory calls. The new file watchers API lets you create native, cross-platform, event-based file watchers for filesystem paths with the following functions: filesystem.createWatcher(path): Creates a new file watcher for a given path and returns the watcher identifier.filesystem.removeWatcher(watcherId): Removes a files watcher based on a file watcher identifier. Whenever a filesystem change occurs, file watcher instances dispatch the watchFile event with the following data: id: Watcher identifieraction: Filesystem change: add, delete, modified, and moveddir: Directory pathfilename: Modified file ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-5","content":" Fix the initial window flashing and hidden window state issues on Windows.Fix data corruption in binary file appending.Apply dark/light themes based on system preferences on Windows. ","version":"Next","tagName":"h3"},{"title":"v4.10.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4100","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-2","content":" Generate official macOS arm64 (For Apple M1 and higher devices) and universal binaries with the GitHub workflow. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-6","content":" Add a JSON schema definition for the neutralino.config.json file.Fix source code compilation issues on macOS arm64 systems. ","version":"Next","tagName":"h3"},{"title":"ESM/NPM support​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#esmnpm-support","content":" Neutralinojs typically stores the client library implementation in a separate file (neutralino.js). This approach makes Neutralinojs app development process easier with a globally exposed JavaScript object, Neutralino. But, modern web developers use ES modules and they usually like to fetch dependencies from NPM. So, now, developers can load the __neutralino_globals.js internal script (i.e., <script src="__neutralino_globals.js"></script>) to load only globals. Then, they can use the client library implementation via neutralino.mjs with the neu CLI or from @neutralinojs/lib with a Node package manager. ","version":"Next","tagName":"h3"},{"title":"v4.9.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v490","content":" ","version":"Next","tagName":"h2"},{"title":"API: Custom methods​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-custom-methods","content":" Neutralinojs offers the extensions API to write custom backend code with any programming language, but extensions come with the following drawbacks that affect apps in several scenarios: Extensions use a shared WebSocket for communication, so using direct C++ references (i.e., the window handler) is impossible within extensions.The developer is responsible for packaging their extension binaries.A C++-based extension is not fast as native C++-based code due to the WebSockets-based IPC. Alternatively, a developer can download the framework C++ code, modify it, and re-compile it. But, the developer may face issues while synching upstream code modifications. So, Neutralinojs offers a separate namespace, a function template, inbuilt helper functions (i.e., to get the window handler, validation, etc.), and a developer guide to add custom APIs to the Neutralinojs framework without updating the framework core. Example: let res = await Neutralino.custom.fetch('https://neutralino.js.org'); If developers make a custom API that others can use, we motivate them to contribute to the Neutralinojs framework by adding it to the main codebase. Example: let res = await Neutralino.net.fetch('https://neutralino.js.org'); If the developer adds a new custom method to the framework, the client library will automatically export it to the Neutralino.custom namespace by using the NL_CMETHODS internal global variable. The Neutralino.custom.getMethods function returns an array of custom methods similar to NL_CMETHODS. ","version":"Next","tagName":"h3"},{"title":"API: File streams​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-file-streams","content":" The current Neutralinojs API offers non-stream-based (Promise-based but synchronous-like) functions for working with files. For example, the filesystem.readFile function reads the file content and retrieves data synchronously even though the WebSocket communication mechanism supports asynchronous patterns. However, the synchronous API lets developers work with files in a simple way, but they face the following issues in some scenarios: Reading large files is not performance-friendly (The whole file content gets loaded into the memory).Unable to work with dynamic file objects (i.e., Device files).File descriptors are not persistent within the app lifecycle as they get destroyed after native API calls. To solve this issue, we offer an event-based file stream API with the following functions/events: Functions​ filesystem.openFile: Creates a file stream by openning a file.filesystem.updateOpenedFile: Triggers a file read/readAll event or sets the file cursor.filesystem.getOpenedFileInfo: Returns (awaited) information about the file stream (Props: id, eof, pos, and lastRead) Events​ openedFile: Occurs per each file read event and whenever the file stream reaches EOF. ","version":"Next","tagName":"h3"},{"title":"v4.8.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v480","content":" ","version":"Next","tagName":"h2"},{"title":"API: os.getEnvs​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-osgetenvs","content":" os.getEnv returns a value for a given environment variable key. Developers had to use alternative methods to retrieve a list of all environment variables with values. The os.getEnvs returns all environment variables as a JavaScript object similar to Node's process.env. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-2","content":" Added pos and size options for readFile and readBinaryFile methods to set the file cursor position and buffer size respectively. ","version":"Next","tagName":"h3"},{"title":"API: storage.getKeys​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-storagegetkeys","content":" Added the storage.getKeys function to get an array of Neutralinojs storage keys. Now, developers don't need to write their own functions to retrieve storage keys with the filesystem API. ","version":"Next","tagName":"h3"},{"title":"API: computer.getMousePosition​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-computergetmouseposition","content":" Returns the current mouse cursor position via a JavaScript object that has x and y props. This function is helpful for develping interactive desktop widgets on all supported platforms. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements","content":" Replaced string error codes with enums in the C++ source code.Some refactorings done in C++ struct definitions and return values. ","version":"Next","tagName":"h3"},{"title":"v4.7.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v470","content":" ","version":"Next","tagName":"h2"},{"title":"API: System information API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-system-information-api","content":" Ealier, we had the getMemoryInfo function in the computer namespace to retrieve system memory statistics. Now, we have added more functions to get details about the CPU, operating system, kernel, and connected displays: computer.getArch: Returns the CPU architecture. i.e, x64, arm, etc.computer.getKernelInfo: Returns the operating system's kernel details.computer.getOSInfo: Returns the operating system details.computer.getCPUInfo: Returns the CPU details.computer.getDisplays: Returns an array of all connected displays with the resolution, frequency-like information. ","version":"Next","tagName":"h3"},{"title":"API: os dialogs​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os-dialogs","content":" Add the defaultPath option to showSaveDialog, showOpenDialog, and showFolderDialog functions to set the initial path/filename of system dialogs. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-3","content":" Run the test suite on Windows GitHub Actions instance.Fix the armhf framework binary generation issue in the GitHub Actions workflow. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-1","content":" Hide the automation info bar from the Chrome mode by default -- Developers can add the --enable-automation flag to the config file if they need the particular command-line switch. ","version":"Next","tagName":"h3"},{"title":"v4.6.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v460","content":" ","version":"Next","tagName":"h2"},{"title":"API: Process spawning API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-process-spawning-api","content":" We have os.execCommand for launching processes, but it's synchronous, meaning, the developer has to wait unti process completion to receive pid, stdOut and stdErr. execCommand is not suitable for long-running processes. The new spawning API offers API functions for handling long-running processes in a multi-threaded way. os.spawnProcess(command): Spawns a process and returns id (A virtual Neutralino-scoped pid) and pid (Operating system-level pid).os.getSpawnedProcesses(): Returns a list of spawned processes.os.updateSpawnedProcess(id, action, data): Sends an action event for the spawned process. Supports the following actions: stdIn: Sends a string via the standard input stream. data is the input string.stdInEnd: Closes the standard input stream.exit: Terminates the spawned process. ","version":"Next","tagName":"h3"},{"title":"Core: events​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-events","content":" spawnedProcess: Dispatched when there is a change in the spawned process. CustomEvent gets triggered with the following object: { id: <id>, pid: <pid>, action: <action>, data: <data> } Available actions: stdOut: Outputs standard output data. data contains the standard output payload.stdErr: Outputs standard error data. data contains the standard error payload.exit: Notified when the process terminates. data contains the process exit code. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-4","content":" Add official Linux ARM (armhf and arm64) binary build support for the standard release workflow and nightly build. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-3","content":" Expose createdAt and modifiedAt JavaScript timestamps via the filesystem.getStats function. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-2","content":" Hide the .storage directory (Neutralinojs storage location) on Windows.Support using query parameters in resources URLs. i.e., index.html?v=2.0 is supported, but caching is not yet implemented.Show a user-friendly error message for Neutralinojs server initialization failures. ","version":"Next","tagName":"h3"},{"title":"v4.5.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v450","content":" ","version":"Next","tagName":"h2"},{"title":"Core: events​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-events-1","content":" Added windowFocus and windowBlur native events. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-5","content":" Use BuildZri for C++ build automation.Implement a new workflow for nightly releases. Developers can get the nightly release binaries via the nightly version tag. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-3","content":" Search and dynamically load app indicator libraries on Linux. This enhancement supports Neutralinojs to start without a crash when there is no app indicator library present on the system.Throw NE_OS_TRAYIER from the os.setTray function for initialization failures.Fix binary file write error on Windows with the filesystem.writeBinaryFile function. This was fixed by using LF as the line breaker on all platforms as a portable solution. If the developer needs CRLF on Windows (or CR on Darwin), the developer needs to handle it explicitly with NL_OS. ","version":"Next","tagName":"h3"},{"title":"Core: global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-global-variables","content":" Add NL_COMMIT to hold framework's release commit. This is helpful to find the nightly release's code snapshot. ","version":"Next","tagName":"h3"},{"title":"v4.4.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v440","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-2","content":" Add window.getPosition to get the current window coordinates. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-4","content":" Add filesystem.appendFile to append text content to a file. Thrown errors are similar to the filesystem.writeFile function.Add filesystem.appendBinaryFile to append binary content to a file. Thrown errors are similar to the filesystem.writeBinaryFile function. ","version":"Next","tagName":"h3"},{"title":"Dependencies​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#dependencies","content":" Use ayatana-appindicator3-0.1 instead of appindicator3-0.1 (Marked as obsolete in Debian packages) ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-4","content":" Dynamically call SetProcessDpiAwarenessContext function to support previous Windows versions.Display the native method name with the NE_RT_NATPRME error payload. ","version":"Next","tagName":"h3"},{"title":"v4.3.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v430","content":" ","version":"Next","tagName":"h2"},{"title":"Core: auth​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-auth","content":" Added tokenSecurity to the configuration to improve the security of NL_TOKEN. Accepted values are none and one-time. If none is set, Neutralinojs server will always expose NL_TOKEN for any application instance, so you can open Neutralinojs apps from browser directly. If one-time (recommended) is set, Neutralinojs server expose NL_TOKEN only once and client persists the token in sessionStorage, so all other clients that acces the app after the initial client will get an auth error message (Displayed to the user via HTML). ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-3","content":" window.setAlwaysOnTop(bool) was added.window.getSize was added. ","version":"Next","tagName":"h3"},{"title":"Core: global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-global-variables-1","content":" Added NL_EXTENABLED which returns true if extensions are enabled. It is used to check extensions status faster during initialization process. ","version":"Next","tagName":"h3"},{"title":"Bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixes","content":" Fixed the file dialog order issue on Windows.Removed tray icon when the application exits. ","version":"Next","tagName":"h3"},{"title":"v4.2.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v420","content":" ","version":"Next","tagName":"h2"},{"title":"API: clipboard​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-clipboard-1","content":" Add clipboard API for all platforms. Supports reading and writing text in the system clipboard. ","version":"Next","tagName":"h3"},{"title":"Core: configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-configuration-1","content":" Accept chrome-related CLI args: --chrome-width, --chrome-height, and --chrome-args.Accept --neu-dev-extension to enable devtools connections (For internal usages with CLI).Accept custom HTTP headers via serverHeaders option. ","version":"Next","tagName":"h3"},{"title":"API: global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-global-variables","content":" Added NL_RESMODE to get details about application resources source. Returns bundle if resources are loaded from resources.neu. Otherwise, returns directory. ","version":"Next","tagName":"h3"},{"title":"Bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixes-1","content":" Fix chrome mode user data dir issue (Support paths with spaces).Fix browser mode's shutdown issue with neu CLI. ","version":"Next","tagName":"h3"},{"title":"v4.1.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v410","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-4","content":" window.getTitle returns the current native window title. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os-2","content":" Remove NE_OS_ENVNOEX from os.getEnv and return an empty string if environment variable is not defined. ","version":"Next","tagName":"h3"},{"title":"Core: Chrome mode​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-chrome-mode","content":" Now you can run Neutralinojs apps as Chrome apps via the chrome mode. ","version":"Next","tagName":"h3"},{"title":"Core: configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-configuration-2","content":" Getting chrome mode config from modes.chrome. Added height, width, and args specially for the chrome mode. ","version":"Next","tagName":"h3"},{"title":"v4.0.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v400","content":" ","version":"Next","tagName":"h2"},{"title":"API: os.execCommand​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-osexeccommand","content":" Renamed shouldRunInBackground option to background.Supports stdIn as an optional input.Returns multiple values: stdOut, stdErr, pid, and exitCode. ","version":"Next","tagName":"h3"},{"title":"Core: API extensions​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-api-extensions","content":" Config file supports new extensions array globally or in a specific mode.Neutralino spawns extension processes based on extensions array.Neutralino doesn't send kill signals to extension processes. The extension developer needs to stop processes properly.extension setting has 4 fields: id, command, commandLinux,commandDarwin, and commandWindows.The command's (platform-specific command's) value accepts ${NL_PATH} global variable.Each extension process instance is called with three CLI args: --nl-port={}, --nl-extension-id={} and --nl-token={}Enable/disable extensions with enableExtensions config. ","version":"Next","tagName":"h3"},{"title":"Core: Static server​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-static-server","content":" Supports setting document root (with documentRoot) via config. Now, it's possible to launch app without a subdirectory in the URL. ","version":"Next","tagName":"h3"},{"title":"Core: Community driver processes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-community-driver-processes","content":" Now developers can use Neutralinojs as a part of their software with any programming language by spawning Neutralinojs as a child process. Use exportAuthInfo to write auth details to ${NL_PATH}/.tmp/auth_info.json. Then the parent process can pickup access details there. Note that WebSocket communication needs to be initiated via extensions API/loader. ","version":"Next","tagName":"h3"},{"title":"API: app.broadcast​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-appbroadcast","content":" Sends an event to all app clients. This method is for extension developers. ","version":"Next","tagName":"h3"},{"title":"API: events.broadcast​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-eventsbroadcast","content":" Sends an event to all clients (apps and extensions). Useful for notifying important general events. ","version":"Next","tagName":"h3"},{"title":"API: extensions​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-extensions","content":" dispatch: Sends an event to a specific extension.broadcast: Sends an event to all connected extensions. Useful for sending shutdown signals.getStats: Returns details about loaded extensions and connected extensions. ","version":"Next","tagName":"h3"},{"title":"API: updater​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-updater","content":" checkForUpdates: Send a request to a seed URL (JSON) and fetch update details.install: Install updates based on the currently downloaded manifest. ","version":"Next","tagName":"h3"},{"title":"Events​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#events-1","content":" appClientConnect and appClientDisconnect: Occurs when a new app instance is launched and closed respectively.extClientConnect and extClientDisconnect: Occurs when a new extension is connected and disconnected respectively.extensionReady can be used to implement immediate extension calls. This is implemented from the client-side with extensions.getStats and extClientConnect. This event gurantees that it will be triggered regardless of the extension's start time. ","version":"Next","tagName":"h3"},{"title":"Error codes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#error-codes","content":" NE_EX_EXTNOTC: Thrown by extensions.dispatch if the target extension is not connected.NE_UP_CUPDMER: Thrown by updater.checkForUpdates if the JSON update manifest is invalid or applicationId is not matching.NE_UP_CUPDERR: Thrown by updater.checkForUpdates if the updater API cannot fetch the manifest.NE_UP_UPDNOUF: Thrown by updater.install when the update manifest is not loaded.NE_UP_UPDINER: Thrown by updater.install for update installation errors. ","version":"Next","tagName":"h3"},{"title":"Bug fixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bug-fixes","content":" Fix port 0 issue with modes. Earlier, if the developer sets port as 0 from a specific mode, the NL_PORT also becomes 0.Fix an issue with writeToLogFile config option. Earlier, the log file was created even this option is set to false. ","version":"Next","tagName":"h3"},{"title":"Global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#global-variables-1","content":" NL_APPVERSION: Value of the version key in the config file. ","version":"Next","tagName":"h3"}],"options":{"id":"default"}} \ No newline at end of file diff --git a/search-doc-1727176191077.json b/search-doc-1727176191077.json new file mode 100644 index 00000000..0205f809 --- /dev/null +++ b/search-doc-1727176191077.json @@ -0,0 +1 @@ +{"searchDocs":[{"title":"Neutralino.app","type":0,"sectionRef":"#","url":"/docs/api/app","content":"","keywords":"","version":"Next"},{"title":"app.exit(exitCode)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appexitexitcode","content":" Terminates the running application. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters","content":" exitCode Number: Process's exit code. The default value is always 0 (success). await Neutralino.app.exit(130); await Neutralino.app.exit(); ","version":"Next","tagName":"h3"},{"title":"app.killProcess()​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appkillprocess","content":" Kills the application process. If the application becomes unresponsive, you can use this to terminate the process instantly. It is recommended to use the exit() method to close your application properly. await Neutralino.app.killProcess(); ","version":"Next","tagName":"h2"},{"title":"app.restartProcess(options)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#apprestartprocessoptions","content":" Restarts the current application instance. ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#options","content":" args String: Additional command-line arguments that need to be passed to the new application instance's process. await Neutralino.app.restartProcess(); await Neutralino.app.restartProcess({ args: '--restarted' }); ","version":"Next","tagName":"h3"},{"title":"app.getConfig()​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appgetconfig","content":" Returns the current application configuration as a JSON object. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#return-object-awaited","content":" The current application configuration. Sometimes, this configuration object is not identical to your configuration file because the framework updates the configuration during several situations such as config overriding via CLI arguments and using 0 as the port. let config = await Neutralino.app.getConfig(); console.log('URL = ', config.url); ","version":"Next","tagName":"h3"},{"title":"app.broadcast(eventName, data)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appbroadcasteventname-data","content":" Dispatches a new event to all app instances. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-1","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.app.broadcast('myTestEvent', 'Hello'); await Neutralino.app.broadcast('myTestEvent', {myData: 'Test data'}); await Neutralino.app.broadcast('myTestEvent'); ","version":"Next","tagName":"h3"},{"title":"app.readProcessInput(readAll)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appreadprocessinputreadall","content":" Reads string data from the standard input stream of the application process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-2","content":" readAll Boolean (optional): If this is set to true, the framework will read the entire standard stream. Otherwise, only one line will be returned. The default value for this option is false. let name = await Neutralino.app.readProcessInput(); console.log(`Hello ${name}`); ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#return-string-awaited","content":" Standard input stream data. ","version":"Next","tagName":"h3"},{"title":"app.writeProcessOutput(data)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appwriteprocessoutputdata","content":" Writes string data to the standard output stream of the application process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-3","content":" data String: Data to be written. await Neutralino.app.writeProcessOutput('Enter your name: '); let name = await Neutralino.app.readProcessInput(); await Neutralino.app.writeProcessOutput(`Hello ${name}\\n`); ","version":"Next","tagName":"h3"},{"title":"app.writeProcessError(data)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appwriteprocesserrordata","content":" Writes string data to the standard error stream of the application process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-4","content":" data String: Data to be written. await Neutralino.app.writeProcessError('This message goes to stderr'); ","version":"Next","tagName":"h3"},{"title":"Neutralino.clipboard","type":0,"sectionRef":"#","url":"/docs/api/clipboard","content":"","keywords":"","version":"Next"},{"title":"clipboard.getFormat()​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardgetformat","content":" Returns the current data format of the system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#return-string-awaited","content":" Clipboard format: text, image, or unknown. let format = await Neutralino.clipboard.getFormat(); console.log(`Format: ${format}`); ","version":"Next","tagName":"h3"},{"title":"clipboard.writeText(text)​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardwritetexttext","content":" Writes text into the system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#parameters","content":" text String: Text to store into the system clipboard. await Neutralino.clipboard.writeText('Test value'); ","version":"Next","tagName":"h3"},{"title":"clipboard.writeImage(image)​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardwriteimageimage","content":" Writes image into the system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Input Object: ClipboardImage​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#input-object-clipboardimage","content":" width: Number: Image width.height: Number: Image height.bpp: Number: Bits per pixel (BPP).bpr: Number: Bytes Per Row (BPR).redMask: Number: Red mask.greenMask: Number: Green mask.blueMask: Number: Blue mask.redShift: Number: Red shift.greeShift: Number: Green shift.blueShift: Number: Blue shift.data: ArrayBuffer: Raw RGBA binary data of the image in an array buffer. let image = prepareClipboardImage(); await Neutralino.clipboard.writeImage(image); ","version":"Next","tagName":"h3"},{"title":"clipboard.readText()​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardreadtext","content":" Reads and returns text from system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#return-string-awaited-1","content":" Stored text from the system clipboard. let clipboardText = await Neutralino.clipboard.readText(); console.log(`Text: ${clipboardText}`); ","version":"Next","tagName":"h3"},{"title":"clipboard.readImage()​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardreadimage","content":" Reads and returns an image from system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#return-object-awaited","content":" Returns ClipboardImage object that has the same properties as in the writeImage() function. let clipboardImage = await Neutralino.clipboard.readImage(); console.log(`Image: ${clipboardImage}`); ","version":"Next","tagName":"h3"},{"title":"Introduction","type":0,"sectionRef":"#","url":"/docs/","content":"","keywords":"","version":"Next"},{"title":"What is Neutralinojs?​","type":1,"pageTitle":"Introduction","url":"/docs/#what-is-neutralinojs","content":" Neutralinojs is a lightweight and portable desktop application development framework. It lets you develop lightweight cross-platform desktop applications using JavaScript, HTML and CSS. You can extend Neutralinojs with any programming language (via extensions IPC) and use Neutralinojs as a part of any source file (via child processes IPC). ","version":"Next","tagName":"h2"},{"title":"Why Neutralinojs?​","type":1,"pageTitle":"Introduction","url":"/docs/#why-neutralinojs","content":" In Electron and NWjs, you have to install Node.js and hundreds of dependency libraries. Embedded Chromium and Node make simple apps bloaty. Neutralinojs offers a lightweight and portable SDK which is an alternative for Electron and NW.js. Neutralinojs doesn't bundle Chromium and uses the existing web browser library in the operating system (Eg: gtk-webkit2 on Linux). Neutralinojs implements a WebSocket connection for native operations and embeds a static web server to serve the web content. Also, it offers a built-inJavaScript client library for developers. See comparisons: Neutralinojs vs Electron vs NW.JS vs Tauri vs NodeGui vs Flutter vs .Net MAUINeutralinojs vs Electron vs NW.js (2018) When you start learning Neutralinojs, you will realize that Neutralinojs answers endless use cases. For example, you can use Neutralinojs for the following scenarios. Cross-platform desktop app development.Building web apps with native operations.Using as a cloud message broker.Connecting multiple processes by using as an IPC broker.and more... ","version":"Next","tagName":"h2"},{"title":"Highlighted features​","type":1,"pageTitle":"Introduction","url":"/docs/#highlighted-features","content":" Portable development kit.No compilation required for application developers.No additional dependencies required for users.Native functions support: Read files, run system commands, etc.Less resource intensive compared to chromium-node-based frameworks.Cross-platform: Neutralinojs apps work on Linux, Windows, macOS, and Web.Simple and flexible development environment. ","version":"Next","tagName":"h2"},{"title":"Supported platforms and CPU architectures​","type":1,"pageTitle":"Introduction","url":"/docs/#supported-platforms-and-cpu-architectures","content":" neu CLI provides you pre-built x64 binaries for Linux, macOS, and Windows. Additionally, it provides ARM (armhf/arm64) Linux binaries with the Neutralinojs framework v4.6.0 or newer versions and ARM (arm64) Darwin binaries with v4.10.0 or newer framework versions. We are trying to officially support all popular CPU architectures with the CLI soon! However, you can build Neutralinojs binaries from the source on almost all desktop operating systems and CPU architectures out there. If you need Neutralinojs binaries for non-x64 CPU, learn how to build Neutralinojs from source with this guide. ","version":"Next","tagName":"h2"},{"title":"Neutralino.custom","type":0,"sectionRef":"#","url":"/docs/api/custom","content":"","keywords":"","version":"Next"},{"title":"custom.getMethods()​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#customgetmethods","content":" Returns all custom methods added by the app developer. ","version":"Next","tagName":"h2"},{"title":"Return Array (awaited):​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#return-array-awaited","content":" A string array of all custom method identifiers. let methods = await Neutralino.custom.getMethods(); console.log(methods); ","version":"Next","tagName":"h3"},{"title":"custom.add(num1, num2, options)​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#customaddnum1-num2-options","content":" info This is a sample method and official Neutralinojs framework builds don't include this method by default. So, you have to download the Neutralinojs framework source code and uncomment the add method in thecustom namespace androuter.cpp. This method returns the sum of two numbers for demonstration purposes of custom methods. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#parameters","content":" num1 Number: The first number for the summation process.num2 Number: The second number for the summation process. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#options","content":" addExtraFive Boolean: Adds extra five to the numerical result.addExtraTen Boolean: Adds extra ten to the numerical result. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#return-number-awaited","content":" The sum of input numerical parameters with extra value additions based on options. let sum; sum = await Neutralino.custom.add(10, 10); // 20 sum = await Neutralino.custom.add(1, 1, { addExtraFive: true, addExtraTen: true }); // 17 Check the add method implementation and learn how to capture, validate, and process parameters in C++. For compiling your Neutralinojs fork, you can use the existingGitHub Actions workflows. ","version":"Next","tagName":"h3"},{"title":"Neutralino.debug","type":0,"sectionRef":"#","url":"/docs/api/debug","content":"","keywords":"","version":"Next"},{"title":"debug.log(message, type)​","type":1,"pageTitle":"Neutralino.debug","url":"/docs/api/debug#debuglogmessage-type","content":" Writes messages to neutralinojs.log file or/and standard output streams.  tip If your application is running via neu run, you can see log messages on your terminal. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.debug","url":"/docs/api/debug#parameters","content":" message String: Content to be logged.type String (optional): Type of the message. Accepted values are INFO, WARNING, and ERROR. The default value is INFO. await Neutralino.debug.log('Hello Neutralinojs'); await Neutralino.debug.log('An error occured', 'ERROR'); await Neutralino.debug.log('A warning message', 'WARNING'); ","version":"Next","tagName":"h3"},{"title":"Neutralino.events","type":0,"sectionRef":"#","url":"/docs/api/events","content":"","keywords":"","version":"Next"},{"title":"Event types​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#event-types","content":" Event id\tDescription\tAvailable modes\tAdditional dataready\tOccurs when the client library connects with the Neutralino server.\tall\tnull trayMenuItemClicked\tOccurs when the user clicks on a tray menu item.\tall\tTrayMenuItem windowClose\tOccurs when the user closes the window.\twindow\tnull windowFocus\tOccurs when the window gets focused.\twindow\tnull windowBlur\tOccurs when the window focus state is gone.\twindow\tnull serverOffline\tOccurs when the Neutralino server is offline\tall\tnull clientConnect\tOccurs when a new client access the application.\tall\tTotal clients clientDisconnect\tOccurs when a connected client leaves the application.\tall\tTotal clients appClientConnect\tOccurs when a new application instance starts.\tall\tTotal app clients appClientDisconnect\tOccurs when an application instance ends.\tall\tTotal app clients extClientConnect\tOccurs when a new extension connects.\tall\tExtension identifier extClientDisconnect\tOccurs when an extension disconnects.\tall\tExtension identifer extensionReady\tOccurs when an extension is ready to communicate with the app.\tall\tExtension identifier spawnedProcess\tOccurs then there is an update in the spawned process.\tall\tSpawnedProcess with action (stdOut, stdErr, and exit) and data (STDOUT, STDERR or exit code) openedFile\tOccurs for each read action and whenever stream cursor reaches EOF.\tall\tFile stream identifier with action (data, dataBinary, and end) and data (stream block content) watchFile\tOccurs for each filesystem change events based on watchers.\tall\tFile watcher identifier with action (add, delete, modified, and moved), dir, and filename ","version":"Next","tagName":"h2"},{"title":"events.on(eventName, handler)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsoneventname-handler","content":" Registers a new event handler.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters","content":" eventName String: Name of the event.handler Function: A function that will be called when the given event occurs. Neutralinojs will call the handler with aCustomEvent instance by attaching additional data to the detail key. function onTrayMenuItemClicked(event) { console.log(`Event data: ${event.detail}`); } await Neutralino.events.on('trayMenuItemClicked', onTrayMenuItemClicked); ","version":"Next","tagName":"h3"},{"title":"events.off(eventName, handler)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsoffeventname-handler","content":" Unregisters an event handler.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters-1","content":" eventName String: Name of the event.handler Function: A function reference. await Neutralino.events.off('trayMenuItemClicked', onTrayMenuItemClicked); ","version":"Next","tagName":"h3"},{"title":"events.dispatch(eventName, data)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsdispatcheventname-data","content":" Dispatches a new event to the current app instance. Neutralinojs client uses this JavaScript function call internally to dispatch native events.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters-2","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.events.dispatch('myTestEvent', {myData: 'Test data'}); ","version":"Next","tagName":"h3"},{"title":"events.broadcast(eventName, data)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsbroadcasteventname-data","content":" Dispatches a new event to all clients (both app and extension clients). ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters-3","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.events.broadcast('myTestEvent', 'Hello'); await Neutralino.events.broadcast('myTestEvent', {myData: 'Test data'}); await Neutralino.events.broadcast('myTestEvent'); // without any data payload ","version":"Next","tagName":"h3"},{"title":"Neutralino.extensions","type":0,"sectionRef":"#","url":"/docs/api/extensions","content":"","keywords":"","version":"Next"},{"title":"extensions.dispatch(extensionId, eventName, data)​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#extensionsdispatchextensionid-eventname-data","content":" Dispatches a new event to an extension instance. If the targeted extension is not connected yet, Neutralino client library will queue the function call and send whenever the extension comes online. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#parameters","content":" extensionId String: Extension identifier.eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.extensions.dispatch('js.neutralino.sampleextension', 'myTestEvent', {myData: 'Test data'}); await Neutralino.extensions.dispatch('js.neutralino.sampleextension', 'myTestEvent'); ","version":"Next","tagName":"h3"},{"title":"extensions.broadcast(eventName, data)​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#extensionsbroadcasteventname-data","content":" Dispatches a new event to all connected extensions. If an extension is loaded but not connected yet, the particular extension won't get the new event. Use extensions.dispatchto send messages even if the extension is not connected to the main process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#parameters-1","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.extensions.broadcast('myTestEvent', 'Hello'); await Neutralino.extensions.broadcast('myTestEvent', {myData: 'Test data'}); await Neutralino.extensions.broadcast('myTestEvent'); ","version":"Next","tagName":"h3"},{"title":"extensions.getStats()​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#extensionsgetstats","content":" Returns details about connected and loaded extensions. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#return-object-awaited","content":" loaded String[]: An array of loaded extensions.connected String[]: An array of connected extensions. These extensions have an active WebSocket-based IPC connection with the main process. let stats = await Neutralino.extensions.getStats(); console.log('stats: ', stats); ","version":"Next","tagName":"h3"},{"title":"Neutralino.computer","type":0,"sectionRef":"#","url":"/docs/api/computer","content":"","keywords":"","version":"Next"},{"title":"computer.getMemoryInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetmemoryinfo","content":" Returns system memory statistics in bytes. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited","content":" physical Object: Physical memory information. total Number: Total physical memory.available Number: Available physical memory. virtual Object: Virtual memory information. total Number: Total virtual memory.available Number: Available virtual memory. let memoryInfo = await Neutralino.computer.getMemoryInfo(); console.log(`RAM size: ${memoryInfo.physical.total}B`); ","version":"Next","tagName":"h3"},{"title":"computer.getArch()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetarch","content":" Returns the CPU architecture identifier: x64 (x86 64bit/arm64), ia32 (x86 32bit), arm, itanium, or unknown. ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-string-awaited","content":" CPU architecture. let arch = await Neutralino.computer.getArch(); console.log(arch); ","version":"Next","tagName":"h3"},{"title":"computer.getKernelInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetkernelinfo","content":" Returns operating system kernel information. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-1","content":" variant String: Kernel type: Linux, Darwin, Windows NT, or Unknown.version String: Version in the <major>.<minor>.<patch>-<build_number> format. let kernelInfo = await Neutralino.computer.getKernelInfo(); console.log(`Kernel: ${kernelInfo.variant}`); ","version":"Next","tagName":"h3"},{"title":"computer.getOSInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetosinfo","content":" Returns operating system information. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-2","content":" name String: Operating system name.description String: Operating system description.version String: Version in the <major>.<minor>.<patch>-<build_number> format. let osInfo = await Neutralino.computer.getOSInfo(); console.log(`OS: ${osInfo.name}`); ","version":"Next","tagName":"h3"},{"title":"computer.getCPUInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetcpuinfo","content":" Returns the CPU information. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-3","content":" vendor String: Vendor name.model String: Model name.frequency Number: The current CPU frequency in hertz (Hz).architecture String: CPU architecture name. Returns the same value as the getArch function.logicalThreads Number: Number of logical threads in the parallelism model.physicalCores Number: Number of physical cores in the CPU.physicalUnits Number: Number of physical CPU hardware units in the motherboard. let cpuInfo = await Neutralino.computer.getCPUInfo(); console.log(`CPU model: ${cpuInfo.model}`); ","version":"Next","tagName":"h3"},{"title":"computer.getDisplays()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetdisplays","content":" Returns information about all connected displays. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-4","content":" An array of Display objects. ","version":"Next","tagName":"h3"},{"title":"Display​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#display","content":" id Number: A virtual display identifier.resolution Object: Display resolution information. width Number: Display width.height Number: Display height. dpi Number: DPI (Dots Per Inch) value.bpp Number: BPP (Bits Per Pixel) value (also known as the color depth).refreshRate Number: Refresh rate in hertz (Hz). let displays = await Neutralino.computer.getDisplays(); for(let display of displays) { console.log(display); } ","version":"Next","tagName":"h3"},{"title":"computer.getMousePosition()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetmouseposition","content":" Returns the current mouse cursor position. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-5","content":" x Number: Distance from the left edge of the screen in pixels.y Number: Distance from the top edge of the screen in pixels. let pos = await Neutralino.computer.getMousePosition(); console.log(`Pos: ${pos.x}, ${pos.y}`); ","version":"Next","tagName":"h3"},{"title":"Error Codes","type":0,"sectionRef":"#","url":"/docs/api/error-codes","content":"","keywords":"","version":"Next"},{"title":"Native API error codes​","type":1,"pageTitle":"Error Codes","url":"/docs/api/error-codes#native-api-error-codes","content":" Error code\tMessage\tThrown byNE_FS_DIRCRER\tUnable to create directory.\tos.createDirectory NE_FS_REMVERR\tUnable to remove path.\tos.remove NE_OS_TRAYIER\tUnable to initialize the tray menu. This error is typically thrown when GNU/Linux systems don't contain an app indicator library.\tos.setTray NE_FS_FILRDER\tFile read error.\tfilesystem.readFile, filesystem.readBinaryFile NE_FS_FILWRER\tFile write error.\tfilesystem.writeFile, filesystem.writeBinaryFile NE_FS_FILOPER\tFile open error.\tfilesystem.openFile NE_FS_UNLTOUP\tUnable to update opened file id.\tfilesystem.updateOpenedFile NE_FS_UNLTFOP\tUnable to find opened file id.\tfilesystem.getOpenedFileInfo NE_FS_NOPATHE\tNo file or directory.\tfilesystem.getStats, filesystem.readDirectory NE_FS_COPYERR\tCopy error.\tfilesystem.copy NE_FS_MOVEERR\tMove error.\tfilesystem.move NE_FS_UNLCWAT\tUnable to create watcher.\tfilesystem.createWatcher NE_FS_NOWATID\tUnable to find watcher.\tfilesystem.removeWatcher NE_OS_UNLTOUP\tUnable to update the spawned process due to an invalid process identifier or action.\tos.updateSpawnedProcess NE_OS_INVMSGA\tInvalid message box arguments.\tos.showMessageBox NE_OS_INVKNPT\tInvalid platform path name.\tos.getPath NE_ST_INVSTKY\tInvalid storage key.\tstorage.getData, storage.setData NE_ST_STKEYWE\tStorage write error.\tstorage.setData NE_RT_INVTOKN\tInvalid access token.\t* NE_RT_NATPRME\tNo permission to execute the provided native method.\t* NE_RT_APIPRME\tNo permission to use the native API.\t* NE_RT_NATRTER\tNative method runtime error. Mostly occured due to missing parameters.\t* NE_RT_NATNTIM\tNative method is not implemented.\tinternal NE_CL_NSEROFF\tNeutralino server is not reachable.\t* NE_EX_EXTNOTC\tExtension is not connected yet\textensions.dispatch NE_UP_CUPDMER\tInvalid update manifest or mismatching applicationId\tupdater.checkForUpdates NE_UP_CUPDERR\tUnable to fetch update manifest\tupdater.checkForUpdates NE_UP_UPDNOUF\tNo update manifest loaded\tupdater.install NE_UP_UPDINER\tUpdate installation error\tupdater.install NE_RS_APIRQRF\tThe resources API works only if the resource file is loaded\tresources.* NE_RS_FILNOTF\tUnable to find the requested path in the resources bundle\tresources.readFile, resources.readBinaryFile, resources.extractFile ","version":"Next","tagName":"h2"},{"title":"Neutralino.init","type":0,"sectionRef":"#","url":"/docs/api/init","content":"","keywords":"","version":"Next"},{"title":"init()​","type":1,"pageTitle":"Neutralino.init","url":"/docs/api/init#init","content":" The application developer needs to call this method explicitly via a JavaScript source file before using any native API function. The init function does the following tasks when it's called. Starts a WebSocket connection with the Neutralinojs server asynchronously.Registers auto-reload event handler if the --neu-dev-auto-reload flag (the neu run command sets this flag) is provided.Defines NL_CVERSION with the client libary version in the window scope. You can call native API calls right after the init function call, as shown below. Neutralino.init(); Neutralino.os.showMessageBox('Welcome', 'Hello Neutralinojs'); Also, you can wrap immediate native calls with the ready event callback if you like. Neutralino.init(); Neutralino.events.on('ready', () => { Neutralino.os.showMessageBox('Welcome', 'Hello Neutralinojs'); }); info Neutralinojs client library typically queues and sends native API calls to the server when the WebSocket connection is established. Therefore, you don't need to use the ready event callback always. ","version":"Next","tagName":"h2"},{"title":"Native API Overview","type":0,"sectionRef":"#","url":"/docs/api/overview","content":"","keywords":"","version":"Next"},{"title":"Native API namespaces​","type":1,"pageTitle":"Native API Overview","url":"/docs/api/overview#native-api-namespaces","content":" Neutralino.appNeutralino.clipboardNeutralino.computerNeutralino.customNeutralino.debugNeutralino.eventsNeutralino.extensionsNeutralino.filesystemNeutralino.initNeutralino.osNeutralino.storageNeutralino.updaterNeutralino.windowNeutralino.resources ","version":"Next","tagName":"h2"},{"title":"Global Variables","type":0,"sectionRef":"#","url":"/docs/api/global-variables","content":"","keywords":"","version":"Next"},{"title":"Predefined global variables​","type":1,"pageTitle":"Global Variables","url":"/docs/api/global-variables#predefined-global-variables","content":" Variable\tDescriptionNL_OS\tOperating system name: Linux, Windows, or Darwin NL_ARCH\tCPU architecture: x64, arm, itanium, ia32, or unknown NL_APPID\tApplication identifier NL_APPVERSION\tApplication version NL_PORT\tApplication port NL_MODE\tMode of the application: window, browser, cloud, or chrome NL_VERSION\tNeutralinojs framework version NL_CVERSION\tNeutralinojs client version NL_CWD\tCurrent working directory NL_PATH\tApplication path NL_ARGS\tCommand-line arguments NL_PID\tIdentifier of the current process NL_RESMODE\tSource of application resources: bundle or directory NL_EXTENABLED\tReturns true if extensions are enabled NL_COMMIT\tFramework binary's release commit hash NL_CCOMMIT\tClient librar's release commit hash NL_CMETHODS\tCustom method identifiers (Returns the same output that custom.getMethods returns). NL_WSAVSTLOADED\tReturns true if the initial window state was loaded from the saved configuration tip You can use NL_COMMIT and NL_CCOMMIT values to identify the codebase snapshot if you use nightly releases. ","version":"Next","tagName":"h2"},{"title":"Custom global variables​","type":1,"pageTitle":"Global Variables","url":"/docs/api/global-variables#custom-global-variables","content":" You can make custom global variables too via neutralino.config.json, as shown below. "globalVariables": { "TEST": "Test Value" } The above custom global variable's value can be accessed with NL_TEST. You can set any data type for custom global variables. Look at the following examples. "globalVariables": { "TEST_1": 1, "TEST_2": null, "TEST_3": 3.5, "TEST_4": [3, 5, 4, 5], "TEST_5": { "key": "value", "anotherKey": 100 } } Avoid overriding predefined global variables. ","version":"Next","tagName":"h2"},{"title":"Neutralino.storage","type":0,"sectionRef":"#","url":"/docs/api/storage","content":"","keywords":"","version":"Next"},{"title":"storage.setData(key, data)​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#storagesetdatakey-data","content":" Writes data into Neutralinojs shared storage.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#parameters","content":" key String: A unique identifier.data Object (optional): Data as a string. If this value is null or undefined, the specific data record will be erased from the disk. await Neutralino.storage.setData('userDetails', JSON.stringify({ username: 'TestValue'}) ); ","version":"Next","tagName":"h3"},{"title":"storage.getData(key)​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#storagegetdatakey","content":" Reads and returns data for a given Neutralinojs shared storage key.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#parameters-1","content":" key String: Storage data record identifier. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#return-string-awaited","content":" Data string of the storage record. let data = await Neutralino.storage.getData('userDetails'); console.log(`Data: ${data}`); ","version":"Next","tagName":"h3"},{"title":"storage.getKeys()​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#storagegetkeys","content":" Returns all storage keys. ","version":"Next","tagName":"h2"},{"title":"Return Array (awaited):​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#return-array-awaited","content":" A string array of existing storage keys. let keys = await Neutralino.storage.getKeys(); console.log('Keys: ', keys); ","version":"Next","tagName":"h3"},{"title":"Neutralino.resources","type":0,"sectionRef":"#","url":"/docs/api/resources","content":"","keywords":"","version":"Next"},{"title":"resources.getFiles()​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#resourcesgetfiles","content":" Returns all files and directories embedded in the resource bundle. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#return-object-awaited","content":" An array of path strings. let files = await Neutralino.resources.getFiles(); console.log('Files: ', files); ","version":"Next","tagName":"h3"},{"title":"resources.extractFile(path, destination)​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#resourcesextractfilepath-destination","content":" Extracts a file from the resources bundle to a preferred path. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#parameters","content":" path String: Resource file path, i.e., /resources/icons/appIcon.png, starts with / similar to all Neutralinojs app resources.destination String: Path where the extract file should be created. await Neutralino.resources.extractFile('/resources/scripts/run.sh', './scripts/run.sh'); ","version":"Next","tagName":"h3"},{"title":"resources.readFile(path)​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#resourcesreadfilepath","content":" Reads a text file from resources. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#parameters-1","content":" path: Resource path. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#return-string-awaited","content":" File content. let data = await Neutralino.resources.readFile(); console.log(data); ","version":"Next","tagName":"h3"},{"title":"resources.readBinaryFile(path)​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#resourcesreadbinaryfilepath","content":" Reads a binary file from resources. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#parameters-2","content":" path: Resource path. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#return-object-awaited-1","content":" Content of the binary file as anArrayBuffer. let data = await Neutralino.resources.readBinaryFile('/resources/images/myImage.png'); let view = new Uint8Array(data); console.log('Binary content: ', view); ","version":"Next","tagName":"h3"},{"title":"Neutralino.updater","type":0,"sectionRef":"#","url":"/docs/api/updater","content":"","keywords":"","version":"Next"},{"title":"updater.checkForUpdates(url)​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#updatercheckforupdatesurl","content":" Checks latest updates from the given URL. The URL should return a valid Neutralinojs update manifest withContent-Type: application/json header. Throws NE_UP_CUPDMER for invalid manifests and NE_UP_CUPDERRfor network connectivity issues. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#parameters","content":" url String: URL to fetch update manifest. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#return-object-awaited","content":" Update manifest. let url = 'https://example.com/updates/manifest.json'; let manifest = await Neutralino.updater.checkForUpdates(url); ","version":"Next","tagName":"h3"},{"title":"updater.install()​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#updaterinstall","content":" Installs updates from the downloaded update manifest. Throws NE_UP_UPDNOUF if the manifest isn't loaded. If the update installation process fails, this function will throw NE_UP_UPDINER. let url = 'https://example.com/updates/manifest.json'; let manifest = await Neutralino.updater.checkForUpdates(url); if(manifest.version != NL_APPVERSION) { await Neutralino.updater.install(); } else { console.log('You are using the latest version!'); } ","version":"Next","tagName":"h2"},{"title":"Internal CLI Arguments","type":0,"sectionRef":"#","url":"/docs/cli/internal-cli-arguments","content":"","keywords":"","version":"Next"},{"title":"General​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#general","content":" ","version":"Next","tagName":"h2"},{"title":"--load-dir-res​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--load-dir-res","content":" Notifies Neutralinojs server to fetch files from the resources directory. If this flag is not provided, Neutralinojs server will load resources from the resources.neu file. tip If Neutralinojs fails to load resources resources.neu, this flag is automatically enabled internally to find resources from the app directory. Therefore, you can double click on the binary instead of neu run while developing apps. ","version":"Next","tagName":"h3"},{"title":"--config-file=<filename>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--config-filefilename","content":" Uses a custom configuration file instead of the default neutralino.config.json file for loading the app configuration JSON. This CLI option is helpful for setting a development-only configuration file (i.e., --config-file=neutralino-dev.config.json). info The neu build command won't typically include custom configuration files for the final application bundle — it only embeds the defaultneutralino.config.json file allowing you to store production app configuration. ","version":"Next","tagName":"h3"},{"title":"--path=<path>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--pathpath","content":" Overrides the resources path with a relative path or absolute path. This will change the NL_PATH global variable. ","version":"Next","tagName":"h3"},{"title":"--mode=<mode>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--modemode","content":" Overrides the default mode. Accepted values are: window, browser, and cloud. ","version":"Next","tagName":"h3"},{"title":"--neu-dev-auto-reload​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--neu-dev-auto-reload","content":" Listens to the neuDev_reloadApp event. When this CLI argument is provided, each modification done to the resources will automatically reload the application. The neu run command executes Neutralinojs with this flag by default. --neu-dev- is a reserved CLI argument prefix for Neutralinojs process. Therefore, avoid adding custom arguments with --neu-dev- prefix. Feel free to use the --dev- prefix for your development-related CLI flags. ","version":"Next","tagName":"h3"},{"title":"--neu-dev-extension​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--neu-dev-extension","content":" Loads js.neutralino.devtools extension internally for development purposes. The neu CLI uses this CLI argument to establish an IPC with the application process. This option only works if application resources are loaded from a directory (won't work for end-users). ","version":"Next","tagName":"h3"},{"title":"--url=<url>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--urlurl","content":" Overrides the URL on the application. ","version":"Next","tagName":"h3"},{"title":"--document-root=<url>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--document-rooturl","content":" Overrides the document root of the static server. ","version":"Next","tagName":"h3"},{"title":"--port=<port>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--portport","content":" Overrides the application port and will change the NL_PORT global variable. If 0 is given, Neutralino will use a random available port. ","version":"Next","tagName":"h3"},{"title":"--logging-enabled=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--logging-enabledtruefalse","content":" Overrides the logging feature status. ","version":"Next","tagName":"h3"},{"title":"--logging-write-to-log-file=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--logging-write-to-log-filetruefalse","content":" Overrides the log file feature status. ","version":"Next","tagName":"h3"},{"title":"--export-auth-info=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--export-auth-infotruefalse","content":" Overrides auth details export setting. ","version":"Next","tagName":"h3"},{"title":"--enable-extensions=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--enable-extensionstruefalse","content":" Overrides extensions feature's availability. ","version":"Next","tagName":"h3"},{"title":"--enable-server=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--enable-servertruefalse","content":" Enables or disables the background server (Disables static file servering feature and native API messaging). If you load a remote URL to the webview, you can set this option to true. ","version":"Next","tagName":"h3"},{"title":"--enable-native-api=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--enable-native-apitruefalse","content":" Overrides the primary native API execution permission. ","version":"Next","tagName":"h3"},{"title":"--single-page-serve=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--single-page-servetruefalse","content":" Overrides the single page serving option. ","version":"Next","tagName":"h3"},{"title":"Window mode​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#window-mode","content":" The following CLI arguments are used when the application runs with the window mode. ","version":"Next","tagName":"h2"},{"title":"--window-title=<title>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-titletitle","content":" Overrides the window title. ","version":"Next","tagName":"h3"},{"title":"--window-icon=<icon_path>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-iconicon_path","content":" Overrides the window icon. ","version":"Next","tagName":"h3"},{"title":"--window-full-screen=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-full-screentruefalse","content":" Overrides the window's initial full screen status. ","version":"Next","tagName":"h3"},{"title":"--window-always-on-top=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-always-on-toptruefalse","content":" Overrides the window's initial top-most mode. ","version":"Next","tagName":"h3"},{"title":"--window-borderless=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-borderlesstruefalse","content":" Overrides the window's borderless mode. ","version":"Next","tagName":"h3"},{"title":"--window-maximize=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-maximizetruefalse","content":" Overrides the window's initial maximize status. ","version":"Next","tagName":"h3"},{"title":"--window-hidden=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-hiddentruefalse","content":" Overrides the window's initial visibility status. ","version":"Next","tagName":"h3"},{"title":"--window-maximizable=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-maximizabletruefalse","content":" Overrides the window's initial maximizable status. ","version":"Next","tagName":"h3"},{"title":"--window-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-widthnumber","content":" Overrides the window width. ","version":"Next","tagName":"h3"},{"title":"--window-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-heightnumber","content":" Overrides the window height. ","version":"Next","tagName":"h3"},{"title":"--window-min-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-min-widthnumber","content":" Overrides the window's minimum width. ","version":"Next","tagName":"h3"},{"title":"--window-min-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-min-heightnumber","content":" Overrides the window's minimum height. ","version":"Next","tagName":"h3"},{"title":"--window-max-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-max-widthnumber","content":" Overrides the window's maximum width. ","version":"Next","tagName":"h3"},{"title":"--window-max-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-max-heightnumber","content":" Overrides the window's maximum height. ","version":"Next","tagName":"h3"},{"title":"--window-x=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-xnumber","content":" Overrides the window left (x) position. ","version":"Next","tagName":"h3"},{"title":"--window-y=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-ynumber","content":" Overrides the window top (y) position. ","version":"Next","tagName":"h3"},{"title":"--window-center=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-centertruefalse","content":" Overrides the window's initial center positioning setup. ","version":"Next","tagName":"h3"},{"title":"--window-transparent=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-transparenttruefalse","content":" Overrides the window transparency mode. ","version":"Next","tagName":"h3"},{"title":"--window-resizable=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-resizabletruefalse","content":" Overrides the window's initial resizability status. ","version":"Next","tagName":"h3"},{"title":"--window-exit-process-on-close=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-exit-process-on-closetruefalse","content":" Overrides the close button's behavior. ","version":"Next","tagName":"h3"},{"title":"--window-enable-inspector=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-enable-inspectortruefalse","content":" Automatically opens the developer tools window. ","version":"Next","tagName":"h3"},{"title":"--window-use-saved-state=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-use-saved-statetruefalse","content":" Overrides the saved window state feature setting. ","version":"Next","tagName":"h3"},{"title":"--window-extend-user-agent-with=<suffix>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-extend-user-agent-withsuffix","content":" Overrides the custom user agent setting. ","version":"Next","tagName":"h3"},{"title":"Chrome mode​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#chrome-mode","content":" The following CLI arguments are used when the application runs with the chrome mode. ","version":"Next","tagName":"h2"},{"title":"--chrome-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--chrome-widthnumber","content":" Chrome window's width. ","version":"Next","tagName":"h3"},{"title":"--chrome-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--chrome-heightnumber","content":" Chrome window's height. ","version":"Next","tagName":"h3"},{"title":"--chrome-args=<arg_list>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--chrome-argsarg_list","content":" Additional arguments for the Chrome process. Read more about chrome mode from here tip The right hand value is optional for the for boolean type CLI arguments. Therefore, you can use --window-full-screeninstead of --window-full-screen=true. However, if you define window.fullScreen as true and you need to override it asfalse you have to use --window-full-screen=false. ","version":"Next","tagName":"h3"},{"title":"Neutralino.window","type":0,"sectionRef":"#","url":"/docs/api/window","content":"","keywords":"","version":"Next"},{"title":"window.setTitle(title)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsettitletitle","content":" Sets the title of the native window. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters","content":" title String (optional): Title of the window. Clears the title, if the function was called without the parameter. await Neutralino.window.setTitle('New title'); ","version":"Next","tagName":"h3"},{"title":"window.getTitle()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowgettitle","content":" Returns the title of the native window. ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-string-awaited","content":" The current title of the native window instance. let title = await Neutralino.window.getTitle(); console.log(`title = ${title}`); ","version":"Next","tagName":"h3"},{"title":"window.minimize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowminimize","content":" Minimizes the native window. await Neutralino.window.minimize(); ","version":"Next","tagName":"h2"},{"title":"window.unminimize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowunminimize","content":" Restores the native window from the minimized state. await Neutralino.window.unminimize(); ","version":"Next","tagName":"h2"},{"title":"window.isMinimized()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowisminimized","content":" Returns true if the native window is minimized. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited","content":" true or false based on current minimized status. let status = await Neutralino.window.isMinimized(); ","version":"Next","tagName":"h3"},{"title":"window.maximize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowmaximize","content":" Maximizes the native window. await Neutralino.window.maximize(); ","version":"Next","tagName":"h2"},{"title":"window.unmaximize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowunmaximize","content":" Restores the native window. await Neutralino.window.unmaximize(); ","version":"Next","tagName":"h2"},{"title":"window.isMaximized()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowismaximized","content":" Returns true if the native window is maximized. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-1","content":" true or false based on current maximized status. let status = await Neutralino.window.isMaximized(); ","version":"Next","tagName":"h3"},{"title":"window.setFullScreen()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetfullscreen","content":" Enables the full screen mode. await Neutralino.window.setFullScreen(); ","version":"Next","tagName":"h2"},{"title":"window.exitFullScreen()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowexitfullscreen","content":" Exits from the full screen mode. await Neutralino.window.exitFullScreen(); ","version":"Next","tagName":"h2"},{"title":"window.isFullScreen()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowisfullscreen","content":" Returns true if the native window is in the full screen mode. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-2","content":" true or false based on current full screen status. let status = await Neutralino.window.isFullScreen(); ","version":"Next","tagName":"h3"},{"title":"window.show()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowshow","content":" Shows the native window. await Neutralino.window.show(); ","version":"Next","tagName":"h2"},{"title":"window.hide()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowhide","content":" Hides the native window. await Neutralino.window.hide(); ","version":"Next","tagName":"h2"},{"title":"window.isVisible()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowisvisible","content":" Returns true if the native window is visible. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-3","content":" true or false based on current visibility status. let status = await Neutralino.window.isVisible(); ","version":"Next","tagName":"h3"},{"title":"window.focus()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowfocus","content":" Focuses the native window. await Neutralino.window.focus(); ","version":"Next","tagName":"h2"},{"title":"window.setAlwaysOnTop(onTop)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetalwaysontopontop","content":" Activates or deactivates the always on top mode.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-1","content":" onTop Boolean (optional): Says whether the on top mode should be activated or not. The default value is true. await Neutralino.window.setAlwaysOnTop(true); // or setAlwaysOnTop(); await Neutralino.window.setAlwaysOnTop(false); ","version":"Next","tagName":"h3"},{"title":"window.move(x, y)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowmovex-y","content":" Moves the native window into given coordinates. Neutralinojs's cross-platform coordinate system starts from top-left corner of the screen. In other words, x=0,y=0 point refers to the top-left corner of the device's main screen. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-2","content":" x Number: An integer value for the horizontal position.y Number: An integer value for the vertical position. await Neutralino.window.move(200, 400); ","version":"Next","tagName":"h3"},{"title":"window.center()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowcenter","content":" Centers the native app window within the current display. await Neutralino.window.center(); ","version":"Next","tagName":"h2"},{"title":"window.setIcon(icon)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowseticonicon","content":" Sets an icon for the native window or Dock.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-3","content":" icon String: Path of the icon. A 200x200 PNG image file works fine on all supported operating systems. const icon = '/resources/icons/appIcon.png'; await Neutralino.window.setIcon(icon); ","version":"Next","tagName":"h3"},{"title":"window.setDraggableRegion(domId, options)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetdraggableregiondomid-options","content":" Converts a given DOM element to a draggable region. The user will be able to drag the native window by dragging the given DOM element. This feature is suitable to make custom window bars along with the borderless mode. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-4","content":" domId String | HTMLElement: A DOM element identifier.options DraggableRegionOptions (optional): Customize the behavior of the draggable region. ","version":"Next","tagName":"h3"},{"title":"DraggableRegionOptions​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#draggableregionoptions","content":" alwaysCapture Boolean (optional): If set to true, the region will always capture the pointer, ensuring that dragging is not interrupted when moving the pointer quickly. Note that it prevents child elements from receiving any pointer events. Defaults to false.dragMinDistance Number (optional): The minimum distance between cursor's starting and current position after which dragging is started. This helps prevent accidental dragging while interacting with child elements. Defaults to 10 and is measured in CSS pixels. await Neutralino.window.setDraggableRegion('myCustomTitleBar'); await Neutralino.window.setDraggableRegion('myCustomTitleBar', { alwaysCapture: true, dragMinDistance: 15 }); ","version":"Next","tagName":"h3"},{"title":"window.unsetDraggableRegion(domId)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowunsetdraggableregiondomid","content":" Converts a draggable region to a normal DOM elements by removing drag event handlers. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-5","content":" domId String | HTMLElement: A DOM element identifier. await Neutralino.window.unsetDraggableRegion('myCustomTitleBar'); ","version":"Next","tagName":"h3"},{"title":"window.setSize(Options)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetsizeoptions","content":" This method sets the size of the window. ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#options","content":" width Number (optional): Window width in pixels.height Number (optional): Window height in pixels.minWidth Number (optional): Minimum width of the window in pixels.minHeight Number (optional): Minimum height of the window in pixels.maxWidth Number (optional): Maximum width of the window in pixels.maxHeight Number (optional): Maximum height of the window in pixels.resizable Boolean (optional): A boolean value to make the window resizable or fixed. This method always expects width and height couples. For example, if you are setting minWidth, you should set minHeight too. await Neutralino.window.setSize({ width: 500, height: 200, maxWidth: 600, maxHeight: 400 }); await Neutralino.window.setSize({ resizable: false }); ","version":"Next","tagName":"h3"},{"title":"window.getSize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowgetsize","content":" Returns window size information. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-4","content":" width Number: Window width in pixels.height Number: Window height in pixels.minWidth Number Minimum width of the window in pixels.minHeight Number: Minimum height of the window in pixels.maxWidth Number: Maximum width of the window in pixels.maxHeight Number: Maximum height of the window in pixels.resizable Boolean: Says whether the window resizable or fixed. let sizeInfo = await Neutralino.window.getSize(); console.log(sizeInfo); ","version":"Next","tagName":"h3"},{"title":"window.getPosition()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowgetposition","content":" Returns window position coordinates. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-5","content":" x Number: Horizontal coordinate of the left edge of the window.y Number: Vertical coordinate of the top edge of the window. let position = await Neutralino.window.getPosition(); console.log(position); ","version":"Next","tagName":"h3"},{"title":"window.create(url, WindowOptions)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowcreateurl-windowoptions","content":" Creates a native window. You can use this method to create new window for your multi-window Neutralinojs app. Neutralinojs spawns a new process for each native window. Therefore, the new window works as an isolated app once the window is created. However, you can build communication streams between windows with the storage API. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-6","content":" url String: URL to be loaded. Eg: /resources/aboutWindow.html. Supports loading both local and remote app resources. Local resource paths need to begin with /.options (optional): an instance of WindowOptions type. ","version":"Next","tagName":"h3"},{"title":"WindowOptions​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowoptions","content":" title String: Window title.icon String: Window icon path.fullScreen Boolean: Sets full screen mode.alwaysOnTop Boolean: Activates the top-most mode.enableInspector Boolean: Activates developer tools and opens the web inspector window.borderless Boolean: Makes the window borderless.maximize Boolean: Launches the window maximized.hidden Boolean: Hides the window.maximizable Boolean: Makes the window maximizable or not.exitProcessOnClose Boolean: Exits the application process when the user clicks the window's close button.width Number: Window width.height Number: Window height.x Number: Window x position.y Number: Window y position.minWidth Number: Minimum width of the window.minHeight Number: Minimum height of the window.maxWidth Number: Maximum width of the window.maxHeight Number: Maximum height of the window.processArgs String: Additional command-line arguments for the new window process. Check all supported internal command-line arguments from here. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-object-awaited","content":" pid Number: Process identifier.stdOut String: Standard output. This value is always empty since the new window process starts asynchronously.stdErr String: Standard error. This value is always empty since the new window process starts asynchronously.exitCode Number: Exit code of the process. await Neutralino.window.create('/resources/aboutWindow.html', { icon: '/resources/icons/aboutIcon.png', enableInspector: false, width: 500, height: 300, maximizable: false, exitProcessOnClose: true, processArgs: '--window-id=W_ABOUT' }); ","version":"Next","tagName":"h3"},{"title":"Neutralino.filesystem","type":0,"sectionRef":"#","url":"/docs/api/filesystem","content":"","keywords":"","version":"Next"},{"title":"filesystem.createDirectory(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemcreatedirectorypath","content":" Creates a directory or multiple directories recursively. Throws NE_FS_DIRCRER if directory creation is not possible. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters","content":" path String: New directory path. await Neutralino.filesystem.createDirectory('./newDirectory'); await Neutralino.filesystem.createDirectory(NL_PATH + '/myFolder/api/fs'); ","version":"Next","tagName":"h3"},{"title":"filesystem.remove(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemremovepath","content":" Removes a directory or file. If the given path is a directory, this function recursively removes all contents of the specific directory. Throws NE_FS_REMVERR if the removal is not possible. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-1","content":" path String: Directory or file path. await Neutralino.filesystem.remove('./tmpDirectory'); await Neutralino.filesystem.remove('./tmpFile.txt'); ","version":"Next","tagName":"h3"},{"title":"filesystem.writeFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemwritefilefilename-data","content":" Writes a text file. Throws NE_FS_FILWRER for file write errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-2","content":" filename String: Filename.data String: Content of the file. await Neutralino.filesystem.writeFile('./myFile.txt', 'Sample content'); ","version":"Next","tagName":"h3"},{"title":"filesystem.appendFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemappendfilefilename-data","content":" Appends text content to file. Throws NE_FS_FILWRER for file write errors. If the provided file doesn't exist, this function creates a new file with data. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-3","content":" filename String: Filename.data String: Content to append. await Neutralino.filesystem.appendFile('./myFile.txt', 'Sample '); await Neutralino.filesystem.appendFile('./myFile.txt', 'content'); ","version":"Next","tagName":"h3"},{"title":"filesystem.writeBinaryFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemwritebinaryfilefilename-data","content":" Writes a binary file. Throws NE_FS_FILWRER for file write errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-4","content":" filename String: Filename.data ArrayBuffer: Content of the binary file as anArrayBuffer. let rawBin = new ArrayBuffer(1); let view = new Uint8Array(rawBin); view[0] = 64; // Saves ASCII '@' to the binary file await Neutralino.filesystem.writeBinaryFile('./myFile.bin', rawBin); ","version":"Next","tagName":"h3"},{"title":"filesystem.appendBinaryFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemappendbinaryfilefilename-data","content":" Appends binary data to a file. Throws NE_FS_FILWRER for file write errors. If the provided file doesn't exist, this function creates a new file with data. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-5","content":" filename String: Filename.data ArrayBuffer: Binary content to append as anArrayBuffer. let rawBin = new ArrayBuffer(1); let view = new Uint8Array(rawBin); view[0] = 64; // Saves ASCII '@' to the binary file await Neutralino.filesystem.appendBinaryFile('./myFile.bin', rawBin); await Neutralino.filesystem.appendBinaryFile('./myFile.bin', rawBin); ","version":"Next","tagName":"h3"},{"title":"filesystem.readFile(filename)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemreadfilefilename","content":" Reads a text file. Throws NE_FS_FILRDER for file read errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-6","content":" filename String: Filename.pos Number (optional): File cursor position in bytes.size Number (optional): File reader buffer size in bytes. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-string-awaited","content":" File content. let data = await Neutralino.filesystem.readFile('./myFile.txt'); console.log(`Content: ${data}`); let data = await Neutralino.filesystem.readFile('./myFile.txt', { pos: 2, size: 10 }); console.log(`Content: ${data}`); ","version":"Next","tagName":"h3"},{"title":"filesystem.readBinaryFile(filename, options)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemreadbinaryfilefilename-options","content":" Reads binary files. Throws NE_FS_FILRDER for file read errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-7","content":" filename String: Filename. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#options","content":" pos Number (optional): File cursor position in bytes.size Number (optional): File reader buffer size in bytes. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited","content":" Content of the binary file as anArrayBuffer. let data = await Neutralino.filesystem.readBinaryFile('./myFile.bin'); let view = new Uint8Array(data); console.log('Binary content: ', view); ","version":"Next","tagName":"h3"},{"title":"filesystem.openFile(filename)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemopenfilefilename","content":" Creates a readable file stream. Throws NE_FS_FILOPER for file open errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-8","content":" filename String: Filename. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-number-awaited","content":" File stream identifier. let fileId = await Neutralino.filesystem.openFile('./myFile.txt'); console.log(`ID: ${fileId}`); ","version":"Next","tagName":"h3"},{"title":"filesystem.updateOpenedFile(id, action, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemupdateopenedfileid-action-data","content":" Invokes file stream actions. Throws NE_FS_UNLTOUP if the framework can't update the stream. Call this method to read and seek an opened file (aka a readable stream). ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-9","content":" id Number: File stream identifier.action String: An action to take. Accepts only the following values: read: Reads a bytes segment from the file stream.readBinary: Behaves the same as read but uses the binary read mode.readAll: Triggers the read action until file stream cursor position reachesEOF.readAllBinary: Behaves the same as readAll but uses the binary read mode.seek: Sets the file cursor position.close: Closes and frees file handler resources. data Object (optional): Additional data for the action. Send the buffer size in bytes (default: 256 bytes) if the action is read, readBinary, readAll, or readAllBinary. Send the file stream cursor position if the action is seek. let fileId = await Neutralino.filesystem.openFile('./myFile.txt'); let content = ''; Neutralino.events.on('openedFile', (evt) => { if(evt.detail.id == fileId) { switch(evt.detail.action) { case 'data': content += evt.detail.data; break; case 'end': console.log(content); break; } } }); // Sets the file stream cursor to 10th byte await Neutralino.filesystem.updateOpenedFile(fileId, 'seek', 10); // Reads 2 bytes from the cursor position await Neutralino.filesystem.updateOpenedFile(fileId, 'read', 2); // Reads the next bytes until the cursor reaches EOF (buffer size: 2) await Neutralino.filesystem.updateOpenedFile(fileId, 'readAll', 2); ","version":"Next","tagName":"h3"},{"title":"filesystem.getOpenedFileInfo(id)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetopenedfileinfoid","content":" Returns file stream details. Throws NE_FS_UNLTFOP if the file stream identifier is not valid. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-10","content":" id Number: File stream identifier. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-1","content":" id Number: File stream identifier.eof Boolean: Becomes true if the stream reached EOF.pos Number: File stream cursor position.lastRead Number: Last read bytes. let info = await Neutralino.filesystem.getOpenedFileInfo(0); console.log(info); ","version":"Next","tagName":"h3"},{"title":"filesystem.createWatcher(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemcreatewatcherpath","content":" Creates a filesystem watcher. Throws NE_FS_UNLCWAT for watcher creation failures. If there is an existing active watcher for the given path, this function returns the existing watcher identifier. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-11","content":" path String: Directory path. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-number-awaited-1","content":" File watcher identifier. let watcherId = await Neutralino.filesystem.createWatcher(NL_PATH); Neutralino.events.on('watchFile', (evt) => { if(watcherId == evt.detail.id) { console.log(evt.detail); } }); console.log(`ID: ${watcherId}`); ","version":"Next","tagName":"h3"},{"title":"filesystem.removeWatcher(watcherId)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemremovewatcherwatcherid","content":" Removes a filesystem watcher. Throws NE_FS_NOWATID for watcher removal failures. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-12","content":" watcherId Number: File watcher identifier. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-number-awaited-2","content":" File watcher identifier. let watcherId = await Neutralino.filesystem.createWatcher(NL_PATH); console.log(`ID: ${watcherId}`); await Neutralino.filesystem.removeWatcher(watcherId); ","version":"Next","tagName":"h3"},{"title":"filesystem.getWatchers()​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetwatchers","content":" Returns information about created file watchers. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-2","content":" An array of FileWatcher objects. ","version":"Next","tagName":"h3"},{"title":"FileWatcher​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filewatcher","content":" id Number: Watcher identifier.path String: File watcher path. let watchers = await Neutralino.filesystem.getWatchers(); for(let watcher of watchers) { console.log(watcher); } ","version":"Next","tagName":"h3"},{"title":"filesystem.readDirectory(path, options)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemreaddirectorypath-options","content":" Reads directory contents. Throws NE_FS_NOPATHE if the path doesn't exist. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-13","content":" path String: File/directory path. ","version":"Next","tagName":"h3"},{"title":"options​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#options-1","content":" recursive Boolean: Read sub-directories recursively. The default value is false. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-3","content":" An array of DirectoryEntry objects. ","version":"Next","tagName":"h3"},{"title":"DirectoryEntry​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#directoryentry","content":" entry String: file name.type String: The type of the entry (FILE or DIRECTORY). let entries = await Neutralino.filesystem.readDirectory(NL_PATH); console.log('Content: ', entries); ","version":"Next","tagName":"h3"},{"title":"filesystem.copy(source, destination)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemcopysource-destination","content":" Copies a file or directory to a new destination. Throws NE_FS_COPYERR if the system cannot copy the path. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-14","content":" source String: Source path.destination String: Destination path. ","version":"Next","tagName":"h3"},{"title":"options​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#options-2","content":" recursive Boolean: Copy sub-directories recursively. The default value is true.overwrite Boolean: Overwrite an existing file with the same name. The default value is true.skip Boolean: Skip an existing file with the same name. The default value is false. await Neutralino.filesystem.copy('./source.txt', './destination.txt'); await Neutralino.filesystem.copy('./myDir', './myDirCopy'); ","version":"Next","tagName":"h3"},{"title":"filesystem.move(source, destination)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemmovesource-destination","content":" Moves a file or directory to a new destination. Throws NE_FS_MOVEERR if the system cannot rename the path. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-15","content":" source String: Source path.destination String: Destination path. await Neutralino.filesystem.move('./source.txt', './destination.txt'); await Neutralino.filesystem.move('./myDir', './myFolder'); ","version":"Next","tagName":"h3"},{"title":"filesystem.getStats(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetstatspath","content":" Returns file statistics for the given path. If the given path doesn't exist or is inaccessible,NE_FS_NOPATHE is thrown. Therefore, you can use this method to check for the existance of a file or directory. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-16","content":" path String: File or directory path. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-4","content":" size Number: Size in bytes.isFile Boolean: true if the path represents a normal file.isDirectory Boolean: true if the path represents a directory.createdAt Number: On Windows, returns Unix milliseconds of the file creation time — On Unix or Unix-like platforms, returns Unix milliseconds of the last inode modification time.modifiedAt Number: Unix milliseconds of the last file modification time. let stats = await Neutralino.filesystem.getStats('./sampleVideo.mp4'); console.log('Stats:', stats); ","version":"Next","tagName":"h3"},{"title":"filesystem.getAbsolutePath(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetabsolutepathpath","content":" Returns the absolute path for a given path. This function works with paths that don't exist on the system. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-17","content":" path String: Path. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-string-awaited-1","content":" Absolute path. let path = await Neutralino.filesystem.getAbsolutePath('./myFolder'); console.log(path); ","version":"Next","tagName":"h3"},{"title":"filesystem.getRelativePath(path, base)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetrelativepathpath-base","content":" Returns the relative path for a given path and base. This function works with paths that don't exist on the system. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-18","content":" path String: Path.base String (optional): Base path that is used for calculating the relative path with the path parameter. NL_CWD is used by default if this parameter is not provided. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-string-awaited-2","content":" Relative path. let path = await Neutralino.filesystem.getRelativePath('./myFolder'); console.log(path); path = await Neutralino.filesystem.getRelativePath('./myFolder', '/home/user'); console.log(path); ","version":"Next","tagName":"h3"},{"title":"filesystem.getPathParts(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetpathpartspath","content":" Parses a given path and returns its parts. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-19","content":" path String: Path. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-5","content":" rootName String: Root path name.rootDirectory String: Root path directory.rootPath String: Root path.relativePath String: Path relative to the root path.parentPath String: Parent path or the directory path without filename.filename String: Filename.extension String: File extension.stem String: Filename segment without extension. let pathParts = await Neutralino.filesystem.getPathParts('./myFolder/myFile.txt'); console.log('Parts:', pathParts); ","version":"Next","tagName":"h3"},{"title":"Neutralino.os","type":0,"sectionRef":"#","url":"/docs/api/os","content":"","keywords":"","version":"Next"},{"title":"os.execCommand(command, options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osexeccommandcommand-options","content":" Executes a command and returns the output. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters","content":" command String: The command that is to be executed. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options","content":" background Boolean: Executes the command in background and resolve the Promise immediately if this is set to true. This option makes the process detached from the API function call, so if you need to connect with the newly created process later, consider using os.spawnProcess.stdIn String: Standard input as a string.cwd String: Current working directory. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited","content":" pid Number: Process identifier.stdOut String: Standard output.stdErr String: Standard error.exitCode Number: Exit code of the process. let info = await Neutralino.os.execCommand('python --version'); console.log(`Your Python version: ${info.stdOut}`); await Neutralino.os.execCommand('npm start', { background: true }); ","version":"Next","tagName":"h3"},{"title":"os.spawnProcess(command, cwd)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osspawnprocesscommand-cwd","content":" Spawns a process based on a command in background and let developers control it. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-1","content":" command String: The command that is to be executed in a new process.cwd String (optional): Current working directory. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-1","content":" id Number: A Neutralino-scoped process identifier. This value is used for controlling the process via the native API.pid Number: Process identifier from the operating system. let pingProc = await Neutralino.os.spawnProcess('ping neutralino.js.org'); Neutralino.events.on('spawnedProcess', (evt) => { if(pingProc.id == evt.detail.id) { switch(evt.detail.action) { case 'stdOut': console.log(evt.detail.data); break; case 'stdErr': console.error(evt.detail.data); break; case 'exit': console.log(`Ping process terminated with exit code: ${evt.detail.data}`); break; } } }); ","version":"Next","tagName":"h3"},{"title":"os.updateSpawnedProcess(id, action, data)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osupdatespawnedprocessid-action-data","content":" Updates a spawned process based on a provided action and data. Throws NE_OS_UNLTOUP if the process cannot be updated. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-2","content":" id Number: Neutralino-scoped process identifier.action String: An action to take. Accepts only the following values: stdIn: Sends data to the process via the standard input stream.stdInEnd: Closes the standard input stream file descriptor.exit: Terminates the process. data Object (optional): Additional data for the action. Send stardard input string if the actionis stdIn. let nodeProc = await Neutralino.os.spawnProcess('node'); Neutralino.events.on('spawnedProcess', (evt) => { if(nodeProc.id == evt.detail.id) { switch(evt.detail.action) { case 'stdOut': console.log(evt.detail.data); // 10 break; case 'stdErr': console.error(evt.detail.data); break; case 'exit': console.log(`Node.js process terminated with exit code: ${evt.detail.data}`); break; } } }); await Neutralino.os.updateSpawnedProcess(nodeProc.id, 'stdIn', 'console.log(5 + 5);'); await Neutralino.os.updateSpawnedProcess(nodeProc.id, 'stdInEnd'); ","version":"Next","tagName":"h3"},{"title":"os.getSpawnedProcesses()​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetspawnedprocesses","content":" Returns all spawned processes. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-2","content":" An array of SpawnedProcess objects. SpawnedProcess​ id Number: A Neutralino-scoped process identifier..pid Number: Process identifier from the operating system. await Neutralino.os.spawnProcess('ping neutralino.js.org'); await Neutralino.os.spawnProcess('ping codezri.org'); let processes = await Neutralino.os.getSpawnedProcesses(); console.log(processes); ","version":"Next","tagName":"h3"},{"title":"os.getEnv(key)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetenvkey","content":" Provides the value of a given environment variable. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-3","content":" key String: The name of the environment variable. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited","content":" Value of the given environment variable. Returns an empty string if the environment variable is not defined. let value = await Neutralino.os.getEnv('USER'); console.log(`USER = ${value}`); ","version":"Next","tagName":"h3"},{"title":"os.getEnvs()​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetenvs","content":" Returns all environment variables and their values. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-3","content":" Environment variables details in key-value pairs. let envs = await Neutralino.os.getEnvs(); console.log(envs); ","version":"Next","tagName":"h3"},{"title":"os.showOpenDialog(title, options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowopendialogtitle-options","content":" Shows the file open dialog. You can use this function to obtain paths of existing files. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-4","content":" title String (optional): Title of the dialog. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-1","content":" filters Filter[] (optional): An array of Filter objects to filter the files list.multiSelections (optional): Enables multi selections.defaultPath String (optional): Initial path/filename displayed by the dialog. Filter​ name String: Filter name.extensions String: Array of file extensions. Eg: ['jpg', 'png'] ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-4","content":" An array of selected entries. let entries = await Neutralino.os.showOpenDialog('Open a diagram', { defaultPath: '/home/my/directory/', filters: [ {name: 'Images', extensions: ['jpg', 'png']}, {name: 'All files', extensions: ['*']} ] }); console.log('You have selected:', entries); ","version":"Next","tagName":"h3"},{"title":"os.showSaveDialog(title, options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowsavedialogtitle-options","content":" Shows the file save dialog. You can use this function to obtain a path to create a new file. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-5","content":" title String (optional): Title of the dialog. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-2","content":" filters Filter[] (optional): An array of Filter objects to filter the files list.forceOverwrite Boolean (optional): Skips file overwrite warning message.defaultPath String (optional): Initial path/filename displayed by the dialog. Filter​ name String: Filter name.extensions String[]: Array of file extensions. Eg: ['jpg', 'png'] ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-1","content":" Selected filename. let entry = await Neutralino.os.showSaveDialog('Save to file', { defaultPath: 'untitled.jpg', filters: [ {name: 'Images', extensions: ['jpg', 'png']}, {name: 'All files', extensions: ['*']} ] }); console.log('You have selected:', entry); ","version":"Next","tagName":"h3"},{"title":"os.showFolderDialog(title)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowfolderdialogtitle","content":" Shows the folder open dialog. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-6","content":" title String (optional): Title of the dialog. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-3","content":" defaultPath String (optional): Initial path displayed by the dialog. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-2","content":" Selected folder. let entry = await Neutralino.os.showFolderDialog('Select installation directory', { defaultPath: '/home/my/directory/' }); console.log('You have selected:', entry); ","version":"Next","tagName":"h3"},{"title":"os.showNotification(title, content, icon)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshownotificationtitle-content-icon","content":" Displays a notification message. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-7","content":" title String: Notification title.content String: Content of the notification.icon String (optional): Icon name. Accpeted values are: INFO, WARNING, ERROR, and QUESTION. The default value isINFO await Neutralino.os.showNotification('Hello world', 'It works! Have a nice day'); await Neutralino.os.showNotification('Oops :/', 'Something went wrong', 'ERROR'); ","version":"Next","tagName":"h3"},{"title":"os.showMessageBox(title, content, choice, icon)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowmessageboxtitle-content-choice-icon","content":" Displays a message box. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-8","content":" title String: Title of the message box.content String: Content of the message box.choice String (optional): Message box buttons. Accpeted values are: OK, OK_CANCEL, YES_NO, YES_NO_CANCEL, RETRY_CANCEL, and ABORT_RETRY_IGNORE. The default value is OK.icon String (optional): Icon name. Accpeted values are: INFO, WARNING, ERROR, and QUESTION. The default value is INFO. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-3","content":" User's choice. await Neutralino.os.showMessageBox('Hello', 'Welcome'); let button = await Neutralino.os .showMessageBox('Confirm', 'Are you sure you want to quit?', 'YES_NO', 'QUESTION'); if(button == 'YES') { Neutralino.app.exit(); } ","version":"Next","tagName":"h3"},{"title":"os.setTray(options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#ossettrayoptions","content":" Creates/updates the tray icon and menu. ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-4","content":" icon String: Tray icon path. Eg: /resources/icons/trayIcon.png. A20x20-sized PNG image file works fine on all supported operating systems.menuItems TrayMenuItem[]: An array of TrayMenuItem objects. TrayMenuItem​ id String (optional): A unique identifier for each menu item.text String: Label of the menu item. This field is a mandatory field. Use - (hyphen) character for a menu separator.isDisabled Boolean (optional): A boolean flag to disable/enable a specific menu item.isChecked Boolean (optional): A boolean flag to mark a specific menu item as selected. let tray = { icon: '/resources/icons/trayIcon.png', menuItems: [ {id: "about", text: "About"}, {text: "-"}, {id: "quit", text: "Quit"} ] }; await Neutralino.os.setTray(tray); ","version":"Next","tagName":"h3"},{"title":"os.getPath(name)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetpathname","content":" Returns known platform-specific folders such as Downloads, Music, Videos, etc. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-9","content":" title String: Name of the folder. Accepted values are: config, data, cache, documents, pictures, music, video,downloads, saveGames1, saveGames2, and temp. Throws NE_OS_INVKNPT for invalid folder names. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-4","content":" Path. let downloadsPath = await Neutralino.os.getPath('downloads'); console.log(`Downloads folder: ${downloadsPath}`); ","version":"Next","tagName":"h3"},{"title":"os.open(url)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osopenurl","content":" Opens a URL with the default web browser. tip If your application is running in the default web browser, this method will open a new tab. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-10","content":" url String: URL to be opened. Neutralino.os.open('https://neutralino.js.org'); ","version":"Next","tagName":"h3"},{"title":"neu CLI","type":0,"sectionRef":"#","url":"/docs/cli/neu-cli","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#installation","content":" Run the following command on your terminal to install the CLI globally. npm i -g @neutralinojs/neu You can also use neu CLI via npx if you don't want a global installation. npx @neutralinojs/neu <command> ","version":"Next","tagName":"h2"},{"title":"Commands​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#commands","content":" ","version":"Next","tagName":"h2"},{"title":"neu create <binaryName>​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-create-binaryname","content":" Creates a new Neutralinojs app based on a template. Parameters​ <binaryName>: The name of your application's binary file. For example, if you used myapp, the final application binaries will become myapp-<platform>_<arch>. Options​ --template: Sets the application template via GitHub repository identifier with the <account>/<repo> format. The default value is neutralinojs/neutralinojs-minimal ","version":"Next","tagName":"h3"},{"title":"neu build​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-build","content":" This command will create the dist folder. Thereafter, it will produce the binaries for all supported platforms and resources.neu resource file from your application resources. Options​ --release: Creates a portable ZIP file of the application bundle.--copy-storage: Copies the current snapshot of the Neutralinojs storage to the application bundle. ","version":"Next","tagName":"h3"},{"title":"neu run​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-run","content":" Executes the current application (This will execute specific binary depending on your operating system). This command will change execution permissions (using the chmod command) of the binary files on Linux and macOS. Also, it enables auto-reload for the current application. In other words, when a modification happens to application resources, the Neutralinojs application will be reloaded automatically. You can see Neutralinojs process and extensions output streams while the application is running. If you use the cli.frontendLibrarykey in app configuration, the CLI enables both frontend library's development environment and Neutralinojs's development evironment at the same time. This option patches the main HTML file with the Neutralinojs client library global variables to expose the native API to the frontend library's development server. Learn how to setup this feature from this guide. Options​ --disable-auto-reload: Disables the auto-reloading feature.--arch=<arch>: Explicitly set the CPU architecture. This option is helpful if you use a 32-bit Node.js process on a 64-bit computer.-- <process-args>: Sets additional CLI arguments for the Neutralinojs application process. For example you can enable the browser mode by entering neu run -- --mode=browser. See all accepted arguments from here. ","version":"Next","tagName":"h3"},{"title":"neu update​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-update","content":" This command will update the existing Neutralinojs binaries and client library from the internet. You can use the nightly tag for the cli.binaryVersion and cli.clientVersion in the neutralino.config.json file to use experimental daily pre-releases. Options​ --latest: Fetches the latest framework version details via the GitHub API, downloads from official releases , and update the app configuration with fetched version details. warning Nightly builds refers to automatically generated daily builds, so these builds can contain experimental or incomplete features. Therefore, avoid using nightly versions in your production apps. Use nightly versions to try out latest features, but use a stable version for production apps. ","version":"Next","tagName":"h3"},{"title":"neu version​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-version","content":" Prints all version information. If this command is executed from a Neutralinojs application directory, you will see project-specific version details. Otherwise, you will see global version details. ","version":"Next","tagName":"h3"},{"title":"neu plugins [plugin]​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-plugins-plugin","content":" Parameters​ plugin: Plugin identifier. This value is usually the npm package identifer. Options​ --add: Registers a new plugin to neu CLI. neu CLI downloads plugins to the CLI's node_modulesdirectory and loads during the bootstrap process. Plugins can introduce new commands to the CLI.--remove: Unregisters an existing plugin. ","version":"Next","tagName":"h3"},{"title":"Plugins​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#plugins","content":" Neutralinojs app developers are able to write plugins to add their own commands to the neu CLI. You can develop CLI plugins with the folllowing steps. ","version":"Next","tagName":"h2"},{"title":"Developing a plugin​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#developing-a-plugin","content":" neu CLI will register plugins using index.js as an interface. Create a new npm package with index.js and add the following code snippet. // index.js module.exports = { command: 'commandname <action>', register: (command, modules) => { command.option('--option1 --option2') .action((action, command) => { //your logic goes here.. }); } } command is the CLI command string with actions. The register function will be called when plugin is being registered. Also, it has the command object andstandard modules objectas parameters. Please check commander package documentation for more information about commands and callback parameters. ","version":"Next","tagName":"h3"},{"title":"Publishing your plugin​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#publishing-your-plugin","content":" Once you publish your plugin to the npm registry as a public package, anyone will be able to install it using: neu plugins --add <package-name> and it can be removed using: neu plugins --remove <package-name> See the Appify plugin source for further implementation details. ","version":"Next","tagName":"h3"},{"title":"Changelog​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#changelog","content":" Please check the changelog from GitHub. ","version":"Next","tagName":"h2"},{"title":"Modes","type":0,"sectionRef":"#","url":"/docs/configuration/modes","content":"","keywords":"","version":"Next"},{"title":"window​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#window","content":" Neutralinojs application will run on a native window. The window will use the user's operating system's theme. This mode is a good selection for cross-platform application development. ","version":"Next","tagName":"h2"},{"title":"browser​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#browser","content":" Neutralinojs application will use the user's default browser to load the application. Therefore, you can build web applications with native operations. You can't typically access operating system-level features via web browsers. But, the Neutralinojs browser mode helps you to make web apps that can access the operating system layer with required security controls. ","version":"Next","tagName":"h2"},{"title":"cloud​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#cloud","content":" This mode will run the Neutralinojs process as a background server. You will be able to expose your application to a public network or the internet. tip Example scenario: You can make a web application to control your computer via mobile phones. Besides, you can run the Neutralinojs server on bare-metal servers, virtual machines, and application containers as a lightweight message broker. You may find endless use-cases for this framework mode. danger Make sure that you are blocking or allowing critical native operations vianativeBlockList, nativeAllowList respectively. Also, if you started the application with administrator access, your web application will have the same permission level. ","version":"Next","tagName":"h2"},{"title":"chrome​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#chrome","content":" Neutralinojs app will run as a Chrome application. The framework uses the following Chrome command-line arguments to make the web application look more like a native app. --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-breakpad --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-infobars --disable-extensions --disable-features=site-per-process --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-sync --disable-translate --disable-windows10-custom-titlebar --metrics-recording-only --no-first-run --no-default-browser-check --safebrowsing-disable-auto-update --password-store=basic --use-mock-keychain --user-data-dir=${NL_PATH}/.tmp/chromedata Neutralinojs chrome mode works on a computer that has a pre-installed version of Google Chrome, Chromium, or Microsoft Edge browser. If no installation was detected, Neutralinojs displays an error message by asking the user to install a Chromium-based browser. You can provide additional arguments (Eg: --disable-web-security) to the Chrome process via argsconfiguration attribute. Browse all supported Chromium command-line arguments here ","version":"Next","tagName":"h2"},{"title":"neutralino.config.json","type":0,"sectionRef":"#","url":"/docs/configuration/neutralino.config.json","content":"","keywords":"","version":"Next"},{"title":"Primary​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#primary","content":" The following configuraion values cannot be overridden in different Neutralinojs modes. ","version":"Next","tagName":"h2"},{"title":"applicationId: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#applicationid-string","content":" Unique string to identify your application. Eg: js.neutralino.sample ","version":"Next","tagName":"h3"},{"title":"version: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#version-string","content":" Application version. Eg: 2.4.22 ","version":"Next","tagName":"h3"},{"title":"defaultMode: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#defaultmode-string","content":" Mode of the application. Accepted values are window, browser, cloud, and chrome. ","version":"Next","tagName":"h3"},{"title":"General​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#general","content":" You can override the following configuration values from different modes. For example, you can use a specific URL in root-level and another URL in window-mode-level, as shown below. { "url": "/" "modes": { "window": { "url": "/#window-mode" } } } ","version":"Next","tagName":"h2"},{"title":"port: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#port-number","content":" The port of your application. If the value is 0, Neutralinojs will use a random available port. ","version":"Next","tagName":"h3"},{"title":"enableServer: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#enableserver-boolean","content":" Enables or disables the background server (Disables static file servering feature and native API messaging). If you load a remote URL to the webview, you can set this option to false. Make sure to set this option to true if you load resources from local sources. The default value is false. ","version":"Next","tagName":"h3"},{"title":"enableNativeAPI: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#enablenativeapi-boolean","content":" Enables or disables the native API. If you want to use any native API functions, you can set this option to true. The default value is false. ","version":"Next","tagName":"h3"},{"title":"singlePageServe: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#singlepageserve-boolean","content":" Activates SPA (Single Page App) serving. When this option is enabled, the static server module serves the primaryindex.html file for sub-directory requests only if another index.html doesn't exist in a specific sub-directory. The default value for this option is false. ","version":"Next","tagName":"h3"},{"title":"tokenSecurity: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#tokensecurity-string","content":" Neutralinojs uses a client-server communication pattern with a local WebSocket to handle native calls. This local server is protected with an auto-generated token. This option defines the security implementation for the token. Accepts the following values: one-time (Recommended) : Server sends the access token only once, and the client persists it in thesessionStorage. If another client (Eg: browser) tries to access the app, NE_RT_INVTOKN error message will be shown instead of the application. Using this option is recommended since it reduces security issues. none : Server sends the access token always, so any new client can see the application. The default value becomes one-time if this setting is not specified by the developer. danger If you are using native APIs that can access your computer's internals such as os, filesystem, modules, never use none option since any new client can use those APIs. ","version":"Next","tagName":"h3"},{"title":"url: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#url-string","content":" The entry URL of the application. Neutralinojs will initially load this URL. This property accepts both relative and absolute URLs. See following examples. "url": "/" The above config loads http://localhost:<port>/ URL initially (internally /index.html is loaded). You can use remote urls too. "url": "http://example.com" ","version":"Next","tagName":"h3"},{"title":"documentRoot: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#documentroot-string","content":" Sets the document root for the static server. For example, if you need to use resources directory as the document root, you can use setup documentRoot as follows. { "documentRoot": "/resources/", "url": "/" } Make sure to configure url properly with the document root. The following configuration is wrong, it instructs the static server to fetch resources from ./resources/resources. { "documentRoot": "/resources/", "url": "/resources/" } However, you can use a sub-directory in URL, as shown below. { "documentRoot": "/", "url": "/resources/" } ","version":"Next","tagName":"h3"},{"title":"exportAuthInfo: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#exportauthinfo-boolean","content":" Exports authentication details to the ${NL_PATH}/.tmp/auth_info.json file with the following JSON structure. { "port": "<port>", "accessToken": "<access_token>" } You can use the above authentication details to connect with Neutralinojs from external processes by using WebSocket as an IPC mechanism. ","version":"Next","tagName":"h3"},{"title":"enableExtensions: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#enableextensions-boolean","content":" Enables/disables extensions. Learn more about this option here ","version":"Next","tagName":"h3"},{"title":"extensions: object[]​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#extensions-object","content":" An array of extension definitions. Learn more about this option here ","version":"Next","tagName":"h3"},{"title":"nativeBlockList: string[]​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#nativeblocklist-string","content":" An array of native methods needs to be blocked from the frontend of the application. The wildcard character * is allowed inside entries. { "nativeBlockList": ["os.execCommand"], "nativeBlockList": ["app.*"] } ","version":"Next","tagName":"h3"},{"title":"nativeAllowList: string[]​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#nativeallowlist-string","content":" An array of native methods needs to be allowed from the frontend of the application. The wildcard character * is allowed inside entries. { "nativeAllowList": ["os.getEnv"], "nativeAllowList": ["storage.*"] } ","version":"Next","tagName":"h3"},{"title":"globalVariables: object​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#globalvariables-object","content":" A key-value-based JavaScript object of custom global variables. ","version":"Next","tagName":"h3"},{"title":"logging.enabled: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#loggingenabled-boolean","content":" Enables or disables the logging feature. ","version":"Next","tagName":"h3"},{"title":"logging.writeToLogFile: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#loggingwritetologfile-boolean","content":" Enables or disables log file. If this setting is false, the framework won't write log to neutralinojs.log, and it will write logs to standard streams. ","version":"Next","tagName":"h3"},{"title":"serverHeaders: object​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#serverheaders-object","content":" Custom headers for the static server and Websocket handshake process. For example, the following configuration sends a custom header with every outgoing HTTP response. { "serverHeaders": { "Test-Header-Option": "Value" } } ","version":"Next","tagName":"h3"},{"title":"Window mode​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#window-mode","content":" The following configuration values are used when the application runs with the window mode. ","version":"Next","tagName":"h2"},{"title":"modes.window.title: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowtitle-string","content":" Title of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.width: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowwidth-number","content":" Width of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.height: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowheight-number","content":" Height of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.minWidth: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowminwidth-number","content":" Minimum width of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.minHeight: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowminheight-number","content":" Minimum height of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.maxWidth: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowmaxwidth-number","content":" Maximum width of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.maxHeight: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowmaxheight-number","content":" Maximum height of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.x: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowx-number","content":" Left position (x) of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.y: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowy-number","content":" Right position (y) of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.center: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowcenter-boolean","content":" Centers the native app window initially. ","version":"Next","tagName":"h3"},{"title":"modes.window.transparent: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowtransparent-boolean","content":" Enables the transparent native window mode for the application instance. If the transparency mode is activated, users can see through the webview if the webpage background uses transparent background colors. Partial transparency can be activated using the rgba() CSS color function. You can use this feature to create semi-transparent windows, windows with custom shadows, and custom-shaped window frames. The default value is false for this option. info Unlike in other platforms, Windows native window becomes borderless (window controls will be hidden) with the activation of the transparent mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.fullScreen: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowfullscreen-boolean","content":" Activates the full-screen mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.icon: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowicon-string","content":" Application icon's file name. You can directly point to an image file in the resources directory. We recommend you to choose a transparent PNG file. ","version":"Next","tagName":"h3"},{"title":"modes.window.alwaysOnTop: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowalwaysontop-boolean","content":" Activates the top-most mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.enableInspector: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowenableinspector-boolean","content":" Automatically opens the developer tools window. ","version":"Next","tagName":"h3"},{"title":"modes.window.borderless: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowborderless-boolean","content":" Activates the borderless mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.maximize: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowmaximize-boolean","content":" Launches the application maximized. ","version":"Next","tagName":"h3"},{"title":"modes.window.resizable: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowresizable-boolean","content":" Make the window resizable or not. The default value is true. ","version":"Next","tagName":"h3"},{"title":"modes.window.hidden: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowhidden-boolean","content":" Make the window invisible. This setting can be used to develop background services. ","version":"Next","tagName":"h3"},{"title":"modes.window.exitProcessOnClose: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowexitprocessonclose-boolean","content":" If this setting is true, the app process will exit when the user clicks on the close button. Otherwise, the framework will dispatch the windowClose event. ","version":"Next","tagName":"h3"},{"title":"modes.window.useSavedState: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowusesavedstate-boolean","content":" Save and load the primary window state (width, height, x, y, values and maximized status) automatically. The default value is true. ","version":"Next","tagName":"h3"},{"title":"modes.window.extendUserAgentWith: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowextenduseragentwith-string","content":" Extends the default webview-specific user agent string with a custom suffix. If this value is not set, the webview sets the default user agent from the platform-specific rendering engine (i.e., WebKit on GNU/Linux). ","version":"Next","tagName":"h3"},{"title":"Chrome mode​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#chrome-mode","content":" The following configuration values are used when the application starts with the chrome mode. ","version":"Next","tagName":"h2"},{"title":"modes.chrome.width: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeschromewidth-number","content":" Width of the chrome window. ","version":"Next","tagName":"h3"},{"title":"modes.chrome.height: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeschromeheight-number","content":" Height of the chrome window. ","version":"Next","tagName":"h3"},{"title":"modes.chrome.args: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeschromeargs-string","content":" Additional command-line arguments for the Chrome process. Read more about chrome mode from here ","version":"Next","tagName":"h3"},{"title":"CLI​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cli","content":" The following configuration values are used for the neu CLI. ","version":"Next","tagName":"h2"},{"title":"cli.binaryName: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clibinaryname-string","content":" Binary file name of your application. If it is myapp, all binaries will usemyapp-<platform>_<arch> format. ","version":"Next","tagName":"h3"},{"title":"cli.resourcesPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliresourcespath-string","content":" Path of your application resources. ","version":"Next","tagName":"h3"},{"title":"cli.resourcesExclude: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliresourcesexclude-string","content":" Regex pattern to exclude files from final app bundle. For example, the following configuration will exclude all the TypeScript source files from the final build: { "resourcesExclude" : ".*\\\\.ts$|.*\\\\.tsx$" } ","version":"Next","tagName":"h3"},{"title":"cli.extensionsPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliextensionspath-string","content":" Path of your application extensions. ","version":"Next","tagName":"h3"},{"title":"cli.extensionsExclude: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliextensionsexclude-string","content":" Regex pattern to exclude files from the extensions directory of the final app package. For example, the following configuration will exclude .log and .info files: { "extensionsExclude" : ".*\\\\.log$|.*\\\\.info$" } ","version":"Next","tagName":"h3"},{"title":"cli.clientLibrary: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliclientlibrary-string","content":" Filename of the Neutralinojs JavaScript library. ","version":"Next","tagName":"h3"},{"title":"cli.binaryVersion: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clibinaryversion-string","content":" Neutralinojs server version. Get nightly builds by using the nightly tag. ","version":"Next","tagName":"h3"},{"title":"cli.clientVersion: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliclientversion-string","content":" Neutralinojs client version. Get nightly builds by using the nightly tag. ","version":"Next","tagName":"h3"},{"title":"cli.autoReloadExclude: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliautoreloadexclude-string","content":" A JavaScript regular expression to exclude files from the auto-reload file watcher. For example, the following configuration will disable auto-reloading for SASS stylesheets (.scss). { "autoReloadExclude": ".*\\\\.scss$" } Use | character to set multiple regular expressions, as shown below. { "autoReloadExclude": ".*\\\\.scss$|.*\\\\.less$" } ","version":"Next","tagName":"h3"},{"title":"cli.frontendLibrary: object​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clifrontendlibrary-object","content":" Enables frontend development tools (HMR, etc) for the neu run command. Learn more about frontend framework integration from here ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.projectPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectprojectpath-string","content":" Sets the project path of the host project. This path will be used as the current directory while executing the host-project-related commands. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.initCommand: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectinitcommand-string","content":" A command that gets executed after downloading an host app template with the neu create command. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.devCommand: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectdevcommand-string","content":" This command will run with the neu run command to start the host project. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.buildCommand: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectbuildcommand-string","content":" The neu build command will execute this command before generating the app bundle, so you can generate bundled version of host project code. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.buildPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectbuildpath-string","content":" Location where the final read-to-distribute host project files will be stored after the execution of buildCommand. Files in this folder are copied into the app bundle path after the execution of neu build command. ","version":"Next","tagName":"h3"},{"title":"cli.distributionPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clidistributionpath-string","content":" Sets the build path for neu CLI. For example, if you need to get the built binaries in build folder instead of dist, you can set the distributionPath as follows: { "distributionPath": "/build", } The default value for distributionPath is /dist. ","version":"Next","tagName":"h3"},{"title":"Windows-specific options​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#windows-specific-options","content":" There are additional configuration options that define metadata and appearance of executables for Windows platform. These fields must be placed in the root of neutralino.config.json. Every field is optional. ","version":"Next","tagName":"h2"},{"title":"applicationName: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#applicationname-string","content":" The human-readable application name. Fills in the ProductName field of the executable. ","version":"Next","tagName":"h3"},{"title":"applicationIcon: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#applicationicon-string","content":" The location of the executable's icon relative to neutralino.config.json. The icon must be in PNG format. If it is not set, an icon from modes.window.icon will be chosen instead. If modes.window.icon does not point to a PNG file, too, a default Neutralino.js icon will be used. ","version":"Next","tagName":"h3"},{"title":"author: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#author-string","content":" The developer of the application. Fills in the CompanyName field of the executable. ","version":"Next","tagName":"h3"},{"title":"description: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#description-string","content":" A description of the executable file. This usually describes the purpose of your application. Fills in the FileDescription field of the executable. ","version":"Next","tagName":"h3"},{"title":"copyright: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#copyright-string","content":" Copyright information. Fills in the LegalCopyright field of the executable. Example configuration: { "applicationId": "cook.pancake.bakery", "version": "1.2.0", "applicationName": "Pancake Bakery", "author": "Sweet Pancakes LLC", "description": "Digital recipe book for pancakes from all over the world", "copyright": "Copyright © Sweet Pancakes LLC 2042. All rights reserved.", "applicationIcon": "buildAssets/appIcon.png", "cli": { "binaryName": "pancakebakery" } } ","version":"Next","tagName":"h3"},{"title":"Project Structure","type":0,"sectionRef":"#","url":"/docs/configuration/project-structure","content":"","keywords":"","version":"Next"},{"title":"Developing apps with vanilla JS​","type":1,"pageTitle":"Project Structure","url":"/docs/configuration/project-structure#developing-apps-with-vanilla-js","content":" If you like to develop Neutralinojs applications with vanilla JavaScript, you can place all application resources in one directory. After that, you can update the neutralino.config.json file with the following values. ... "cli": { ... "resourcesPath": "/<resourcesDir>/", "clientLibrary": "/<resourcesDir>/neutralino.js" } You can choose a name for <resourceDir>. But, by default neu CLI will use resources. ","version":"Next","tagName":"h2"},{"title":"Developing apps with frontend frameworks​","type":1,"pageTitle":"Project Structure","url":"/docs/configuration/project-structure#developing-apps-with-frontend-frameworks","content":" Any frontend framework can be used to make Neutralinojs applications. You can use any pattern as you wish to include both Neutralinojs app and frontend app in one repository. You can check our recommended approach from this guide. ","version":"Next","tagName":"h2"},{"title":"Examples​","type":1,"pageTitle":"Project Structure","url":"/docs/configuration/project-structure#examples","content":" Please browse sample apps section. ","version":"Next","tagName":"h3"},{"title":"About Neutralinojs","type":0,"sectionRef":"#","url":"/docs/contributing/about-neutralinojs","content":"","keywords":"","version":"Next"},{"title":"History​","type":1,"pageTitle":"About Neutralinojs","url":"/docs/contributing/about-neutralinojs#history","content":" In 2018, three Uva Wellassa University students, Shalitha Suranga,Deepal Samarakoon, and Chathumadhuri Hettiarachchi published a research paper about a theoretical way to build cross-platform apps using inbuilt platform-specific browser libraries. They initially planned to use "Neutrino" as the research project name, but it was already taken. So, they decided to use "Neutralinojs" as the project name (Neutralino refers to a hypothetical lightweight particle). For the research paper, Shalitha Suranga wrote a small POC project for GNU/Linux and Windows to demonstrate the theoretical idea and published it to GitHub as an experimental open-source project. In 2019, the research paper authors started working with the software development industry. But, Shalitha Suranga decided to maintain the POC project alone as a hobby project due to the positive feedback received from the developer communities. Later, Kasun Vithanage ported the POC project to the macOS platform. During 2020–2021, Shalitha Suranga rewrote the Neutralinojs POC project with a new WebSockets-based architecture. His goal was to make the project production-ready with a stable API, well-organized codebase, DevOps improvements, and developer-friendly documentation. Since this rewrite was so different compared to the original research project idea, he planned to re-brand "Neutralinojs" as "Neu.js". However, he decided to use the same name due to the existing Neutralinojs-related content on the internet. In 2022, Neutralinojs passed remarkable development milestones and became a popular open-source framework for building lightweight cross-platform desktop apps with JavaScript. During this journey, the developer community supported Neutralinojs with ideas and code contributions. ","version":"Next","tagName":"h2"},{"title":"Current development​","type":1,"pageTitle":"About Neutralinojs","url":"/docs/contributing/about-neutralinojs#current-development","content":" In 2022, Shalitha Suranga added the Neutralinojs project under the CodeZri non-profit organization to maintain the project, along with his other personal open-source projects. Nowadays, he releases a new framework version every two months with support from very supportive contributors. The project uses a community-driven development methodology. Developer community members and maintainers collaboratively work by writing code, reporting bugs, improving documentation, and discussing features. ","version":"Next","tagName":"h2"},{"title":"Financial perspective​","type":1,"pageTitle":"About Neutralinojs","url":"/docs/contributing/about-neutralinojs#financial-perspective","content":" Shalitha Suranga often donates his time to Neutralinojs by writing code, reviewing pull requests, and planning future of Neutralinojs. He integrated EthicalAds andGoogle Adsense with the Neutralinojs website to generate revenue for his work. Also, he accepts donations from the developer community via his personalPatreon and GitHub Sponsors accounts. Moreover, you can donate Neutralinojs via OpenCollective. Neutralinojs has no plans to monetize the framework with paid licensing/subscriptions, paid support, or courses. Also, Neutralinojs doesn't accept payments to deliver new custom features or solve bugs in apps. Our goal is to keep improving Neutralinojs as a pure FOSS project under the donation-based financial model. tip Read this articleto learn how to build a community-friendly revenue stream around your open-source project. We motivate everyone to build a community-friendly revenue stream around open-source projects! ","version":"Next","tagName":"h2"},{"title":"Architecture","type":0,"sectionRef":"#","url":"/docs/contributing/architecture","content":"Architecture The Neutralinojs framework core follows a single-process, monolithic, and layered architectural pattern with two-interconnected components: the framework core (C++) and the client library (JavaScript). Look at the following high-level architectural diagram: The framework core has two key components: the router and the native API. The router component is responsible for processing HTTP and WebSocket messages. Neutralinojs typically serve all web resources via HTTP like a normal HTTP web server. The Neutralinojs native API communication protocol uses the WebSocket messaging protocol. The router serves web resources and executes native API functions according to the incoming requests from the web context. Your JavaScript application needs to use the Neutralinojs client library functions to execute native API operations. The platform-specific webview runs the JavaScript code of the client library and your application. The webview component isn't a core framework component, so you can run Neutralinojs applications on any modern web browser with browser, chrome, and cloud modes. Because of this flexibility, you can write extensions with any programming language and connect to the framework core with authentication details. Even though an extension-less application follows a monolithic pattern, extensions make Neutralinojs applications non-monolithic with the process-based microservices architecture.","keywords":"","version":"Next"},{"title":"Committers","type":0,"sectionRef":"#","url":"/docs/contributing/committers","content":"","keywords":"","version":"Next"},{"title":"Become a committer​","type":1,"pageTitle":"Committers","url":"/docs/contributing/committers#become-a-committer","content":" You can actively submit patches, bug-reports, and ideas to become a Neutralinojs committer! ","version":"Next","tagName":"h2"},{"title":"Become a PMC member​","type":1,"pageTitle":"Committers","url":"/docs/contributing/committers#become-a-pmc-member","content":" PMC (Project Management Committee) members usually take decisions about project's future. Active committers will be added to the PMC list frequently by the existing PMC members according to their commitment. ","version":"Next","tagName":"h2"},{"title":"Code Style Guide","type":0,"sectionRef":"#","url":"/docs/contributing/code-style-guide","content":"","keywords":"","version":"Next"},{"title":"Programming best practices​","type":1,"pageTitle":"Code Style Guide","url":"/docs/contributing/code-style-guide#programming-best-practices","content":" First, make sure that your code change adheres to the following language-independent best practices: Neutralinojs codebases use a procedural and functional mixed coding style, so avoid adding classes and OOP concepts. However, it's okay to use class-based libraries, but make sure not to expose those classes from Neutralinojs internal procedures. Keep the source code simple even though the development requirement is somewhat complex.This articleexplains more about programming principles that you need to know. We stabilized the Neutralinojs codebase structure and have no plans to extend it further with new modules. In other words, please try to implement your code changes without changing the existing code structure. Please discuss first if your code suggestion needs to extend the code structure. Try to make new APIs and features consistent with the existing implementation. We decided not to expose any operating system-specific feature from the Neutralinojs API for the framework consistency across all operating systems. Therefore, make sure that your new feature will work on all supported operating systems. Write tests for new features and update the changelog file. Add comments only if a further explanation is required. Use self-explanatory identifiers for every code element by following the existing naming convention in the codebase. Use four spaces for indentation instead of tabs or two spaces. Inspect an existing source file and use the same formatting with new source files. ","version":"Next","tagName":"h2"},{"title":"C++ code style guide​","type":1,"pageTitle":"Code Style Guide","url":"/docs/contributing/code-style-guide#c-code-style-guide","content":" We are still composing a complete C++ code style guide. Make sure to follow the following points for C++ code submissions for now.  We don't use C++ exceptions. Use booleans to identify failures. For example, we use the following struct for the file read operation: struct FileReaderResult { bool hasError = false; string error; string data; }; We prefer single-line comments (i.e., // comment) over multi-line comments. Use pass-by-reference for complex data types, but use pass-by-value for atomics. Also, make sure to use theconst keyword properly if the parameter doesn't change within the procedure. For example, look at the following function definition: fs::FileReaderResult readFile(const string &filename); Avoid mixing old C-style syntax with modern C++ syntax.Use the __ prefix (double underscore) to declare module-only functions as shown in the following example: void __registerAllowList() { // implementation } Use getter and setter functions instead of shared global variables (defined with extern). ","version":"Next","tagName":"h2"},{"title":"JavaScript code style guide​","type":1,"pageTitle":"Code Style Guide","url":"/docs/contributing/code-style-guide#javascript-code-style-guide","content":" Use ES6 JavaScript syntax by avoiding legacy language syntax. Use template literals for somewhat complex string construction, but use the + operator for simple concatenation. Use the async/await syntax instead of the then/catch syntax for asynchronous operations. Avoid using too recent JavaScript APIs and language features since we need to support older Node.js and browser versions. But, think twice about readability with somewhat old JavaScript features. Don't use more than three parameters for a function—use a JSON object instead for better readability. If you work with some TypeScript codes, always strive to use the meaningful data types instead any orunknown broad data types. ","version":"Next","tagName":"h2"},{"title":"Developer Support","type":0,"sectionRef":"#","url":"/docs/contributing/developer-support","content":"","keywords":"","version":"Next"},{"title":"Bug reports and feature requests​","type":1,"pageTitle":"Developer Support","url":"/docs/contributing/developer-support#bug-reports-and-feature-requests","content":" There are no perfect software. But we can build good software. Help us to improve Neutralinojs by reporting bugs and submitting feature requests. Please create an issue on appropriate GitHub repository for feature requests and bug reporting. Neutralinojs native API: Create an issueNeutralinojs JavaScript API: Create an issueneu CLI: Create an issueStarter template: Create an issueDocumentaion: Create an issue: ","version":"Next","tagName":"h2"},{"title":"Framework Developer Guide","type":0,"sectionRef":"#","url":"/docs/contributing/framework-developer-guide","content":"","keywords":"","version":"Next"},{"title":"Setup and build the framework​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#setup-and-build-the-framework","content":" ","version":"Next","tagName":"h2"},{"title":"Cloning the repository​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#cloning-the-repository","content":" First, clone the main repository. git clone https://github.com/neutralinojs/neutralinojs.git cd neutralinojs ","version":"Next","tagName":"h3"},{"title":"Installing compilation tools and dependencies​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#installing-compilation-tools-and-dependencies","content":" Linux​ No need for separate compilers because Linux distributions usually have GNU C/C++ compilers installed already. Install GTK, WebKit, other libraries with the following command. Debian​ sudo apt install \\ libgtk-3-dev \\ libwebkit2gtk-4.0-37 \\ libwebkit2gtk-4.0-dev Fedora​ sudo dnf install \\ @development-tools \\ gtk3 \\ webkit2gtk3.x86_64 \\ webkit2gtk3-devel.x86_64 \\ libgtk-3-dev \\ libwebkit2gtk-4.0-37 \\ libwebkit2gtk-4.0-dev \\ libglib2.0-dev \\ libxrandr-dev Arch​ sudo pacman -S \\ gtk3 \\ webkit2gtk Windows​ Install the latest Visual Studio IDE with Windows SDK. The Neutralinojs compilation process will use the MSVC C++ compiler (aka cl.exe). info How to activate Windows 10 SDK: While installing it in the Visual Studio Installer, go to tab Workloads, section "Desktop & Mobile" and select "Desktop development with C++". On the right in "Installation details" > "Desktop development with C++" > "Optional", make sure "Windows 10 SDK" is checked. macOS​ Install Xcode Command Line Tools. ","version":"Next","tagName":"h3"},{"title":"Compile the Neutralinojs framework.​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#compile-the-neutralinojs-framework","content":" Run the following script in order to build the framework binaries. python scripts/bz.py info You need to have the Python interpreter (version 3.x) installed to run this script. Neutralinojs uses BuildZri C++ build automation tool to generate binaries on local development computers and CI/CD servers. Read the BuildZri documentation to learn more about CLI options and configuration. ","version":"Next","tagName":"h3"},{"title":"Setup and build the client​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#setup-and-build-the-client","content":" Neutralinojs apps communicate with the Neutralinojs process via a WebSocket connection. This WebSocket connection gets initiated by the Neutralinojs client. Clone the client repository to the same directory where you downloaded the main repository. git clone https://github.com/neutralinojs/neutralino.js.git cd neutralino.js Install developer dependencies. npm install ","version":"Next","tagName":"h2"},{"title":"Executing the test app​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#executing-the-test-app","content":" The main repository has a simple test application that you can use during development related activities. You can enter the following command from the main repository to build and update the test app's client. bash ./scripts/update_client.sh Now run the newly compiled test app with the following command. LinuxmacOSWindows ./bin/neutralino-linux_x64 --load-dir-res ","version":"Next","tagName":"h2"},{"title":"Testing​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#testing","content":" Testing is a crucial part in every development activity. Every pull request in the main codebase will trigger the following automated tests. Builds on Linux, macOS, and Windows with x64 machines.Integration test suite. However, you can run our integration test suite from your local computer too with the following command from the main codebase's directory. cd spec npm install npm run test It's always good to run the test suite for the module you've updated with the following command. npm run test <module> # Eg: npm run test filesystem info If you need to run tests for the extensions module, make sure to enter npm install from./bin/extensions/sampleextension first. The above command will run test only for the given module. ","version":"Next","tagName":"h2"},{"title":"Adding a new test case​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#adding-a-new-test-case","content":" To add a test case simply add it to the spec/<module>.spec.js file. For example, if you need to add a new test case to the debug module, add the test case to the spec/debug.spec.js file. Next, run the test suite for that specific module, as shown in the following command snippet: cd spec npm i npm run test debug ","version":"Next","tagName":"h3"},{"title":"Project directory structure​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#project-directory-structure","content":" ","version":"Next","tagName":"h2"},{"title":"Framework​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#framework","content":" Source: github.com/neutralinojs/neutralinojs api: The native API implementation and controllers. Written in REST API style.auth: Authentication and permissions-related logic.bin: Test app source code.lib: Third-party libraries source files.server: WebSocket/HTTP communication endpoints.spec: Integration/API test suite.scripts: Contains automation scripts to build the framework, generate release notes, update the client library, and build resources.neu for the test app. ","version":"Next","tagName":"h3"},{"title":"Client library​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#client-library","content":" Source: github.com/neutralinojs/neutralino.js src/api: JavaScript API frontend and implementaion.src/browser: Browser-related API implementation.src/ws: WebSocket client implementaion.scripts: Contains automation scripts to generate release notes. ","version":"Next","tagName":"h3"},{"title":"Contribution guidelines​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#contribution-guidelines","content":" Before, contributing to the codebase, please check the following things. Discuss the feature/improvement/bug-fix with the Neutralinojs team via GitHub discussions.Get familiar with the code style. Write your code according to theNeutralinojs code style guide.Become familiar with all modules in the codebase.Avoid adding new features to only one platform. Thanks for helping us to make Neutralinojs better! ","version":"Next","tagName":"h2"},{"title":"Security","type":0,"sectionRef":"#","url":"/docs/contributing/security","content":"","keywords":"","version":"Next"},{"title":"Port security and authentication​","type":1,"pageTitle":"Security","url":"/docs/contributing/security#port-security-and-authentication","content":" Once you study the Neutralinojs architecture, you will notice that the framework frontend communicates with the framework core via a WebSocket-based network port. Developers who know the operating system internals will argue that the Neutralinojs framework is vulnerable due to the local port-based IPC. Let's understand it this way. The network is undoubtedly vulnerable, but network security strategies make networks secure for every computer user—that's how we trust the internet today. Similarly, Neutralinojs uses the One-Time-Token (OTT) strategy to prevent possible port scanning attacks. Here is how the Neutralinojs local port is secured: The Neutralinojs framework's authentication module generates the OTT during the initialization process and a part of the OTT is saved as Connection Token (CT) for WebSocket clients.When the user loads the client-library script, the framework sends the OTT only once.The client library stores the OTT in the local storage for future usage—the framework never sends the OTT again to the frontend. Depending on the current application mode, the client library stores the OTT in either webview or web browser.The client library uses CT to establish a WebSocket connection with the framework.The OTT is used to verify every native API function call that comes from WebSocket clients (including the client-library).The framework blocks WebSocket connections from remote URLs within window, browser, and Chrome modes. The following criteria need to be satisfied for executing an arbitrary API function via a malicious webpage (local) or program: The specific malicious component needs to capture the OTT before the original application obtains the OTT from the framework core. This attacking strategy is not practical because of the fast application startup and lack of faster ways to access operating system-level process status. Even though someone manages to detect the application startup, the original application requests OTT before the malicious program (The framework sends OTT only once). On the other hand, malicious programs don't need Neutralinojs to damage your computer system, so use programs you trust. Even the OTT request process is not possible with modern web browsers via remote pages due to CORS-like security strategies. Also, we don't even enable the native API for remote pages due to strict application security. If there is a way (there is no proven approach yet) to crack OTT, native API access controls protect the user's computer. ","version":"Next","tagName":"h2"},{"title":"Native API access control and authorization​","type":1,"pageTitle":"Security","url":"/docs/contributing/security#native-api-access-control-and-authorization","content":" The OTT strategy provides authentication for native API access by preventing invalid/vulnerable client connections. The OTT grants access to the native API, but it doesn't give access to everything. Most modern popular application runtimes provide access to everything without proper access control. In the Neutralinojs native API model, developers need to mention the APIs they need explicitly for better security. Developers can define API permission requirements via the native allowlist or blocklist features. The Neutralinojs native API permission system provides authorization support by validating incoming requests with the pre-defined permission matrices. Look at the following authentication/authorization diagram for more details: Moreover, Neutralinojs extensions also securely receive WebSocket authentication details (OTT, CT, and port) via standard input streams, so malicious programs can't obtain connectivity secrets by scanning your process list. Read our security policyto learn how to handle security-related framework issues. ","version":"Next","tagName":"h2"},{"title":"Frequently Asked Questions","type":0,"sectionRef":"#","url":"/docs/contributing/frequently-asked-questions","content":"","keywords":"","version":"Next"},{"title":"Framework​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#framework","content":" ","version":"Next","tagName":"h2"},{"title":"Error Code 127: libayatana-appindicator3.so.1 cannot open shared object file: No such file or directory​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#error-code-127-libayatana-appindicator3so1-cannot-open-shared-object-file-no-such-file-or-directory","content":" We fixed this issue in v4.5.0, so please upgrade your framework version. If you need to use a lower framework version, you need to install the missing package with the following commands to start the app properly: apt update apt install -y libayatana-appindicator3-1 Make sure to run the above commands with sudo. Check the package information for further reference. ","version":"Next","tagName":"h3"},{"title":"CLI​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#cli","content":" ","version":"Next","tagName":"h2"},{"title":"What should I do when I get Missing permission to execute the native method: <namespace.func> error ?​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#what-should-i-do-when-i-get-missing-permission-to-execute-the-native-method-namespacefunc-error-","content":" This error occurs when permissions are not given to execute a specific native method. To be able to run this function, add the namespace.func to the nativeAllowList. To allow all functions of the particular namespace, use namespace.*. Check here to learn more about allowlists. ","version":"Next","tagName":"h3"},{"title":"yarn global add @neutralinojs/neu doesn't complete the installation process.​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#yarn-global-add-neutralinojsneu-doesnt-complete-the-installation-process","content":" When yarn is used to install neu, the output shows success Installed "@neutralinojs/neu". But, neu commands don't work even after installation, which neu outputs nothing. Check here for further information about the particular issue. This error is more of an yarn issue. To fix it, the developer needs to add the yarn global bin command output to $PATH. For example, we can add the following command to the .bashrc file (or other Shell interpreter initialization scripts): export PATH="$(yarn global bin):$PATH" For more information, check the official documentation of yarn here. ","version":"Next","tagName":"h3"},{"title":"Distribution Overview","type":0,"sectionRef":"#","url":"/docs/distribution/overview","content":"","keywords":"","version":"Next"},{"title":"Application build results​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#application-build-results","content":" The neu build command generates the following files on any supported operating system into the dist directory. Filename\tOS\tCPU architecture\tTypemyapp-linux_x64\tLinux\tx86_64\tApplication binary myapp-linux_armhf\tLinux\tarmhf\tApplication binary myapp-linux_arm64\tLinux\tarm64\tApplication binary myapp-mac_x64\tmacOS\tx86_64\tApplication binary (Intel) myapp-mac_universal\tmacOS\tx86_64 and arm64\tApplication binary myapp-mac_arm64\tmacOS\tarm64\tApplication binary (M1/M2/M3) myapp-win_x64\tWindows\tx86_64\tApplication binary resources.neu\tall\tN/A\tApplication resource file Neutralinojs officially offers only pre-built x64 and armhf/arm64 Linux-only binaries. If you need binaries for other CPU architectures, consider building binaries from the source with this guide. We are trying to officially support all CPU architectures soon! ","version":"Next","tagName":"h2"},{"title":"Selecting files for packaging​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#selecting-files-for-packaging","content":" The neu CLI generates application binaries for all supported platforms at once. These binaries are pre-built binaries. Therefore, please check oursecurity policy before you continue with the distribution process. As the first step for packaging, you can pick two files for each targeted operating system: application binary and the resource file. For example, if you need to make an application package for x64 Linux computers, pick myapp-linux_x64and the resources.neu file. The resources.neu contains all application resources, so, double click on the binary and check whether the resource file is not corrupted. ","version":"Next","tagName":"h2"},{"title":"Creating portable application packages using build scripts​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#creating-portable-application-packages-using-build-scripts","content":" The hschneider/neutralino-build-scripts community project offers pre-developed build scripts for generating platform-specific application bundles. For example, it generates a standard app structure on GNU/Linux by generating .desktop file with app icon by also providing a shell script to install the app. Clone the scripts to your root directory of your app folder to get started with Neutralinojs build scripts: git clone https://github.com/hschneider/neutralino-build-scripts.git build-scripts Install jq, which is required for parsing JSON files: # On macOS: brew install jq # On Linux or Windows/WSL: sudo apt-get install jq Update neutralino.config.json file with build scripts configuration as follows: "buildScript": { "mac": { "architecture": ["x64", "arm64", "universal"], "minimumOS": "10.13.0", "appName": "myapp", "appBundleName": "myapp", "appIdentifier": "com.marketmix.ext.bun.demo", "appIcon": "resources/icons/icon.icns" }, "win": { "architecture": ["x64"], "appName": "myapp", "appIcon": "resources/icons/icon.ico" }, "linux": { "architecture": ["x64", "arm64", "armhf"], "appName": "myapp", "appIcon": "resources/icons/icon.png", "appPath": "/usr/share/myapp", "appIconPath": "/usr/share/myapp/icon.png", "appIconLocation": "/usr/share/myapp/icon.png" } } ","version":"Next","tagName":"h2"},{"title":"Generating an application bundle for macOS​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#generating-an-application-bundle-for-macos","content":" You can generate a new application bundle for macOS by running the following command: ./build-mac.sh The build is created in the ./dist folder. The buildScript/mac JSON segment in the config-file contains the following fields: Key\tDescriptionarchitecture\tThis is an array of the architectures, you want to build. In our example we build all 3 architectures. minimumOS\tThe minimum macOS version. appName\tThe app-name as displayed in the Finder. appBundleName\tThe macOS app-bundle name. appIdentifier\tThe macOS app-identifier. appIcon\tPath to the app-icon in .icns format. If only the filename is submitted, the file is expected in the project's root. Visit the build scripts official documentation for more details. ","version":"Next","tagName":"h3"},{"title":"Generating an application bundle for Windows​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#generating-an-application-bundle-for-windows","content":" You can generate a new application bundle for Windows by running the following command: ./build-win.sh The build is created in the ./dist folder. You can now run install install-icon.cmd to set the app icon as specifed in config file. This script required you to have Resource Hacker installed on your machine. The buildScript/win JSON segment in the config-file contains the following fields: Key\tDescriptionarchitecture\tThis is an array of the architectures, you want to build. Because Neutralino currently only support 'x64', you should leave this untouched. appName\tThe app-name as displayed in the File Explorer, with or without .exe-suffix. appIcon\tPath to the app-icon in .ico format. If only the filename is submitted, the file is expected in the project's root. The icon is copied from this path into the app-bundle. To apply the icon to the executable file, you'll have to run Resource Hacker from a Windows machine. To do so, just double-click install-icon.cmd in the app-bundle. Visit the build scripts official documentation for more details. ","version":"Next","tagName":"h3"},{"title":"Generating an application bundle for Linux​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#generating-an-application-bundle-for-linux","content":" You can generate a new application bundle for GNU/Linux by running the following command: ./build-linux.sh All build targets are created in the ./dist folder. Calling sudo ./install.sh from your build folder automatically installs the app to the locations you defined. The buildScript/linux JSON segment in the config-file contains the following fields: Key\tDescriptionarchitecture\tThis is an array of the architectures, you want to build. In our example we build all 3 architectures. appName\tThe app-name as displayed in the File Explorer. appIcon\tPath to the app-icon in .png or .svg format. If only the filename is submitted, the file is expected in the project's root. The icon is copied from this path into the app-bundle. Example: resources/icons/icon.png appPath\tThe path of application directory in system where the source files will live after installing without the executable name and without ending slash. Example: /usr/share/myapp appIconPath\tThis is path to application icon after the application has been installed in the Linux system. This path is written to the .desktop-file. Example: /usr/share/myapp/icon.png appIconLocation\tSame as appIconPath. Visit the build scripts official documentation for more details. ","version":"Next","tagName":"h3"},{"title":"Creating application installers​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#creating-application-installers","content":" The following guides are not documented yet. Creating an application installer for LinuxCreating an application installer for macOSCreating an application installer for Windows ","version":"Next","tagName":"h2"},{"title":"Your First Neutralinojs App","type":0,"sectionRef":"#","url":"/docs/getting-started/your-first-neutralinojs-app","content":"","keywords":"","version":"Next"},{"title":"Introduction​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#introduction","content":" We are going to create a simple application using Neutralinojs. This sample application will display Hello with the current username of your operating system. For example, if the current username is John, it will show, Hello John. note This tutorial uses Vanilla JavaScript for building the app. If you would like to use a frontend library, check this guide. ","version":"Next","tagName":"h2"},{"title":"Step 0: Installing neu CLI​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-0-installing-neu-cli","content":" You need to install neu CLI to create Neutralinojs applications. However, you can develop applications without CLI as well. But, the CLI will make some hard stuff easy. Run the following command on your terminal to install neu CLI globally. npm install -g @neutralinojs/neu If you don't want a global installation, use neu CLI with npx. npx @neutralinojs/neu <command> ","version":"Next","tagName":"h2"},{"title":"Step 1: Creating a new app​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-1-creating-a-new-app","content":" Enter the following command to scaffold a new app. neu create myapp The above command will create a new app inside myapp directory. To make sure whether everything is fine, run your application. cd myapp neu run info If you are on Windows, you might get a blank white screen. The reason for this is, accessing localhost from a UWP context is disabled by default. Run the following command with administrative privileges on the command prompt to fix this. CheckNetIsolation.exe LoopbackExempt -a -n="Microsoft.Win32WebViewHost_cw5n1h2txyewy" You may include this in your Windows setup files (with the user's consent) because users also may get an empty white screen on Windows. For better developer experience, we recommend you to install the WebView2 runtime on Windows. ","version":"Next","tagName":"h2"},{"title":"Step 2: Writing JavaScript, HTML, and CSS​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-2-writing-javascript-html-and-css","content":" Insert the following content into your application resource files. index.htmlstyles.cssmain.js <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>NeutralinoJs</title> <link rel="stylesheet" href="styles.css"> </head> <body> <div id="neutralinoapp"> <h1 id="name"></h1> </div> <script src="js/neutralino.js"></script> <script src="js/main.js"></script> </body> </html> Neutralinojs prevents arbitary native API function execution unlike Node.js environments. Here we used the os.getEnv native function, so check whether your application configuration allows the application frontend to execute it. The default configuration already allows the entire os namespace with the following nativeAllowList permission setup: "nativeAllowList": [ "app.*", "os.*", "debug.log" ], We don't need to update anything in the permission setup since it already allows os.getEnv native function calls. ","version":"Next","tagName":"h2"},{"title":"Step 3: Running your application​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-3-running-your-application","content":" As mentioned above, you can use the run command to start your application. neu run Congrats! your application works. info The neu run command will reload your application when there is a change in application resources. Try to change your index.html while the application is running. ","version":"Next","tagName":"h2"},{"title":"Step 4: Building your application ​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-4-building-your-application","content":" To make portable binaries for your application, we can use the build command. Enter the following command on your terminal to make final binaries for all supported platforms.  neu build --release The above command will produce binaries for all platforms into the dist directory and the --release flag will also package your binaries into a .zip file. This command will do the work blazing fast because there is no compilation process behind. ","version":"Next","tagName":"h2"},{"title":"What's next?​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#whats-next","content":" Now you know how to create Neutralinojs applications. We will suggest you to look into the following topics next. neutralino.config.jsonProject structureneu CLIGlobal variablesApplication modesNative API overview We've built the above example application with vanilla JavaScript. However, you can use your favorite frontend framework to build Neutralinojs apps. Check more details about frontend framework support here. ","version":"Next","tagName":"h2"},{"title":"Auto Updater","type":0,"sectionRef":"#","url":"/docs/how-to/auto-updater","content":"","keywords":"","version":"Next"},{"title":"Creating the update manifest​","type":1,"pageTitle":"Auto Updater","url":"/docs/how-to/auto-updater#creating-the-update-manifest","content":" When you ask Neutralinojs to check for updates, it will check the update manifest via the network. Update manifest refers to a JSON document which has the following format. { "applicationId": "js.neutralino.sample", "version": "0.0.2", "resourcesURL": "http://example.com/updater_test/update_res.neu", "data": { } } applicationId String: Application identifier. You need to use the same name you used in neutralinojs.config.json. Otherwise, the update check operation will not proceed.version String: Application version.resourcesURL String: A link to download resources.neu. You can use any file name as you wish, but make sure to serve data with the Content-Type: application/octet-stream header.data Object (optional): Additional data about the update. Accepts any JSON value. ","version":"Next","tagName":"h2"},{"title":"Hosting the update manifest and resources​","type":1,"pageTitle":"Auto Updater","url":"/docs/how-to/auto-updater#hosting-the-update-manifest-and-resources","content":" Host the application manifest and resources file on the internet or a private network according to your access requirements. You can test auto updater locally by setting up a static server or placing update manifest and the resource file into your application's resources directory. Also, you can setup a DevOps pipeline to automate your application updates if you need. If you release a new application version by upgrading Neutralinojs server, users have to download/install the app again since the auto updater only update application resources (including Neutralinojs client). ","version":"Next","tagName":"h2"},{"title":"Writing code to update your app​","type":1,"pageTitle":"Auto Updater","url":"/docs/how-to/auto-updater#writing-code-to-update-your-app","content":" Call the following function whenever you need to check for updates. try { let url = "http://example.com/updater_test/update_manifest.json"; let manifest = await Neutralino.updater.checkForUpdates(url); } catch(err) { // Handle errors } Next, you can use the manifest object to compare versions. try { let url = "http://example.com/updater_test/update_manifest.json"; let manifest = await Neutralino.updater.checkForUpdates(url); if(manifest.version != NL_APPVERSION) { await Neutralino.updater.install(); await Neutralino.app.restartProcess(); } } catch(err) { // Handle errors } As shown in the above code snippet, you can call Neutralino.updater.install to perform the update based on the downloaded manifest. Later, restart the application with the app.restartProcess function. ","version":"Next","tagName":"h2"},{"title":"CLI","type":0,"sectionRef":"#","url":"/docs/release-notes/cli","content":"","keywords":"","version":"Next"},{"title":"Unreleased​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#unreleased","content":" ","version":"Next","tagName":"h2"},{"title":"v11.3.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1130","content":" ","version":"Next","tagName":"h2"},{"title":"Host projects support​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#host-projects-support","content":" Developers can launch Neutralinojs from any programming language using child process APIs (i.e., subprocess in Python) and communicate with the framework process using the extension API. The new hostProject configuration object extends the official CLI to help developers easily create, run, and build these host projects. For example, the following host project configuration instructs the CLI to run a Node.js host project: "hostProject": { "projectPath": "/node-src", "buildPath": "/node-src/dist/", "initCommand": "npm install", "devCommand": "npm start", "buildCommand": "npm run build" } Community projects implement bindings and templates to create host projects using Node.js, Python, Go, etc. For example, the node-neutralino NPM package lets you launch Neutralinojs via Node.js environments and execute native APIs via the NeutralinoApp class: import NeutralinoApp from 'node-neutralino'; const app = new NeutralinoApp({ url: '/', windowOptions: { enableInspector: false, } }); app.init(); app.window.setTitle('Node.js'); ","version":"Next","tagName":"h3"},{"title":"Executable icon and metadata on Windows​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#executable-icon-and-metadata-on-windows","content":" Now, the neu build command automatically updates the executable file icon and metadata based on the following configuration options: author: gets written into executable's metadata.description: gets written into executable's metadata.copyright: gets written into executable's metadata. Defaults to current date + generic "all rights reserved".applicationName: gets written into executable's metadata. Defaults to cli.binaryName.applicationIcon: a relative path to an icon in .png format. Defaults to modes.window.icon. If it is not set, uses Neutralinojs logo. ","version":"Next","tagName":"h3"},{"title":"Using Frontend Libraries","type":0,"sectionRef":"#","url":"/docs/getting-started/using-frontend-libraries","content":"","keywords":"","version":"Next"},{"title":"React​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#react","content":" neu create myapp --template codezri/neutralinojs-react cd myapp # Start the React development server with Neutralinojs neu run # Build the React and Neutralinojs app neu build Repository: codezri/neutralinojs-react ","version":"Next","tagName":"h2"},{"title":"Using any frontend library​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#using-any-frontend-library","content":" The following tutorial guides you to set up any frontend library with Neutralinojs by explaining how we built the Neutralinojs React template: ","version":"Next","tagName":"h2"},{"title":"Initializing projects​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#initializing-projects","content":" First, you need to create a new empty Neutralinojs project. Use theneutralinojs/neutralinojs-zero template to create an empty project, as shown below. neu create myapp --template neutralinojs/neutralinojs-zero Now, create a new project with your favourite frontend framework's command-line tools. In this tutorial, we are going to use React, but you can use any frontend library as you wish. You need to create this project inside the myapp directory. cd myapp npx create-react-app react-src ","version":"Next","tagName":"h3"},{"title":"Configuring Neutralinojs project​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#configuring-neutralinojs-project","content":" The neutralinojs-zero template has a pre-included HTML file and icon, so delete the www directory since we don't need those files now. rm -rf www You need to configure the Neutralinojs project to support the frontend framework. First, you can set the document root with your frontend framework's build directory. React typically generates build outputs tobuild directory, so we can update documentRoot as follows. "documentRoot": "/react-src/build/" Now, our Neutralinojs app knows the application resource location, but it's missing an icon, so set an icon for the app. You can load an icon from your frontend framework's default resources directory. For demonstration purposes, let's use the React icon from the public directory. "modes": { "window": { // --- other options "icon": "/react-src/public/logo192.png" } } ","version":"Next","tagName":"h3"},{"title":"Configuring neu CLI​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#configuring-neu-cli","content":" By default, the zero template configuration asks the Neutralinojs CLI to download the Neutralinojs client (aka neutralino.js) from GitHub releases. Then, the CLI creates your app package by copying the neutralino.js file. However, you can download the client library from the NPM registry and bundle with your app frontend. Remove the clientLibrary property from the Neutralinojs configuration to avoid fetching the client from GitHub releases: We can configure CLI for React by using the following options. "cli": { // --- other options "resourcesPath": "/react-src/build/", // --- "clientLibrary": "/www/neutralino.js", // <--- Remove this option // --- } Now, you can build and run the React application as a Neutralinojs application — it's possible with the following steps. First, build the React application with the following command. cd react-src npm run build Finally, run the Neutralinojs application. cd .. neu run ","version":"Next","tagName":"h3"},{"title":"Initializing native API with @neutralinojs/lib​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#initializing-native-api-with-neutralinojslib","content":" You could run the application with the neu run command, but you cannot use the native API yet because it has not been initialized. To do that you need to install the Neutralinojs client with following command: cd react-src npm install @neutralinojs/lib The next step is to load Neutralinojs global variables. You can achieve that by including JavaScript script in the root HTML file of a framework of your choice. React typically holds the main HTML file content in the ./public/index.html file, so we can put the following HTML snippet there to load the client library. <script src="%PUBLIC_URL%/__neutralino_globals.js"></script> Now make sure to initialize the client library from your frontend application entry point file. React's application entry-point is typically ./src/index.js. Therefore, we can do the initialization process from there by calling the init function from @neutralinojs/lib package. import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; // Import init function from "@neutralinojs/lib" import { init } from "@neutralinojs/lib" ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById('root') ); init(); // Add this function call Let's validate if the client library loaded properly. To do that let's use filesystem API in order to read the current directory of Neutralinojs app. Firstly you need to update neutralino.config.json to allow what API your application can call. You can enable the whole namespace filesystem.* or just single function from a given namespace like in the snippet below. "nativeAllowList": [ "app.*", "filesystem.readDirectory" ], Now let's add following snippet in ./src/App.js file which will log the current directory or error message when App component is mounted. import { useEffect } from 'react' import './App.css'; // Import filesystem namespace import { filesystem } from "@neutralinojs/lib" function App() { // Log current directory or error after component is mounted useEffect(() => { filesystem.readDirectory('./').then((data) => { console.log(data) }).catch((err) => { console.log(err) }) }, []) return ( <div className="App"> My Neutralinojs App </div> ); } export default App; The last step is to run your Neutralinojs app with --window-enable-inspector argument which will allow you to open developer tools. cd react-src npm run build cd .. neu run -- --window-enable-inspector The current directory should be logged to the console. To open developer tools right click anywhere in the Neutralinojs application and press inspect element. ","version":"Next","tagName":"h3"},{"title":"Enabling hot-reload and configuration​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#enabling-hot-reload-and-configuration","content":" Building every code change and testing your application is undoubtedly time-consuming. Therefore, you can use your frontend framework's HMR (Hot Module Replacement) features to speed up your development activities. But, we have a small issue here. There are now two HTTP servers: the Neutralinojs resource server and the frontend framework's development server. How can we load the Neutralinojs client library from the frontend framework's development server? Don't worry — neu CLI provides a built-in feature to enable HMR by patching the main HTML file. You can add the following section to your configuration file for activating hot-reloading. "cli": { // --- other options "frontendLibrary": { "patchFile": "/react-src/public/index.html", "devUrl": "http://localhost:3000" } } } The above options tell neu CLI about the main HTML file and development server URL. Next, configure your project by adding frontend-library-specific development commands as follows: "cli": { // --- other options "frontendLibrary": { "patchFile": "/react-src/public/index.html", "devUrl": "http://localhost:3000", "projectPath": "/react-src/", "initCommand": "npm install", "devCommand": "BROWSER=none npm start", "buildCommand": "npm run build" } } } Finally, run the Neutralinojs application with the following command. neu run The above command executes the devCommand, starts the React development server, and run the Neutralinojs app in development mode. ","version":"Next","tagName":"h3"},{"title":"Packaging​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#packaging","content":" To produce the app binaries, you can use the following command, as usual: neu build --release The above command executes the buildCommand first, so the application bundle will use the currect React project source. See the full source code of this tutorial here. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements","content":" Use the zip-lib package to handle ZIP files for better performance and simplicity in the source code. ","version":"Next","tagName":"h3"},{"title":"v11.2.2​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1122","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-1","content":" Fix initial loading issues with frontend library development file patching. ","version":"Next","tagName":"h3"},{"title":"v11.2.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1120","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler","content":" Introduce the --clean flag to the neu build command to clean previous build files.Add file excluding feature for the app bundle and extensions directory via cli.resourcesExclude and cli.extensionsExclude configuration properties. For example, now developers can use the "resourcesExclude": ".*\\\\.scss$|.*\\\\.d.ts$" configuration to exclude *.scss and *.d.ts files from the final app bundle.Let app developers customize the frontend library development server wait time using the cli.frontendLibrary.waitTimeout configuration property. ","version":"Next","tagName":"h2"},{"title":"Core: Version​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-version","content":" The neu version command now compares the installed CLI version and the framework version with the latest released versions and displays a warning messages if the users use an older versions.The neu version command now displays the (latest) tag with CLI, binary, client library version details. ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-2","content":" Check and validate neutralino.config.json file before executing app-specific commands.Check app template validity before downloading content from a specific GitHub repository using the official GitHub API.Add the app icon to the final app bundle only the specific project uses an app icon.Fix the port waiting timeout issue with frontend library-based development workflow. ","version":"Next","tagName":"h3"},{"title":"v11.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1110","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-1","content":" Add cli.distributionPath into the neutralino.config.json file to customize the default dist distribution directory. ","version":"Next","tagName":"h3"},{"title":"v11.0.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1101","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-3","content":" Clean existing app build files before creating another build using the neu build command.Support older Node versions by removing the optional chaining feature usage.Fix the endless port waiting issue with the --frontend-lib-dev option. ","version":"Next","tagName":"h3"},{"title":"v11.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1100","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner","content":" Change the WebSocket connection based on the v5 framework APIs. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-4","content":" Fixed issues with the frontend library command execution. ","version":"Next","tagName":"h3"},{"title":"v10.1.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1011","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-5","content":" Fixed app development issues with the Vite server. ","version":"Next","tagName":"h3"},{"title":"v10.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1010","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-6","content":" Fixed several issues in the frontend-library-based development flow (i.e., removed the hardcoded port number, fixed double devCommand execution, etc.,). ","version":"Next","tagName":"h3"},{"title":"v10.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1000","content":" ","version":"Next","tagName":"h2"},{"title":"Core: frontend-library-based development​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-frontend-library-based-development","content":" Added new configuration options to the cli.frontendLibrary key of the neutralino.config.json: projectPath: Sets the project path of the frontend-library project. This path will be used as the current directory while executing the frontend-app-related commands.initCommand: A command that gets executed after downloading an app template with the neu create command.devCommand: This command will run with the neu run command to start the frontend development server. The CLI doesn't wait for devCommand completion, instead, it will wait for the frontend development server via the tcp-port-used package.buildCommand: The neu build command will execute this command before generating the app bundle, so you can generate static resources of your frontend app using this command. ","version":"Next","tagName":"h3"},{"title":"v9.8.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v980","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Downloader​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloader","content":" Download the latest Neutralinojs framework resources with the --latest option in the neu update command.If framework versions are not present in the app/template configuration, download the latest framework resources automatically. The CLI will download nightly releases if it can't fetch the latest release tag because of an GitHub API-related issue (i.e., Exceeded rate limits). ","version":"Next","tagName":"h3"},{"title":"v9.7.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v970","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Downloader/bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloaderbundler","content":" Download the TypeScript definition file for standalone client library mode. This won't include the TypeScript definition file to the final application bundle. ","version":"Next","tagName":"h3"},{"title":"v9.6.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v961","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/Improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-7","content":" Fix the hot-reloading issue that occurs with newer Node runtime versions. ","version":"Next","tagName":"h3"},{"title":"v9.6.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v960","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-2","content":" Avoid copying the WebView2Loader.dll file to the final app package since it was removed from the Neutralinojs framework. ","version":"Next","tagName":"h3"},{"title":"v9.5.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v951","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/Improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-8","content":" Use the decompress library instead of unzipper to fix issues with latest Node.js runtime versions.Generate the Mac universal binary with the neu build command. ","version":"Next","tagName":"h3"},{"title":"v9.5.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v950","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#devops","content":" Implement a way to test plugins locally. ","version":"Next","tagName":"h3"},{"title":"v9.4.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v940","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps: new test suite​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#devops-new-test-suite","content":" Initiate a new Node.js-based test suite. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/Improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-9","content":" Clean project files if the neu create command wan't successful.Display an error message if the neu build --copy-storage fails due to missing .storage directory.Support Darwin arm64 binaries natively without binary translation (x64 -> arm64).Make the client library downloading process optional and support importing the client library via @neutralinojs/lib.Download the module version of the client library based on the app configuration. ","version":"Next","tagName":"h3"},{"title":"v9.3.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v931","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Plugins​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-plugins","content":" Automatically re-install plugins when the neu CLI version is upgraded/downgraded via package managers. ","version":"Next","tagName":"h3"},{"title":"Core: downloader/builder​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloaderbuilder","content":" Support ARM (armhf/arm64) binaries. ","version":"Next","tagName":"h3"},{"title":"v9.3.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v930","content":" ","version":"Next","tagName":"h2"},{"title":"General​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#general","content":" Add short descriptions for each command.Support to download nightly build versions. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-10","content":" Fix plugin listing issue. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#devops-1","content":" Add a simple test-suite for testing CLI commands with a Bash script. ","version":"Next","tagName":"h3"},{"title":"v9.2.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v920","content":" ","version":"Next","tagName":"h2"},{"title":"General​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#general-1","content":" Improve log messages and styles ","version":"Next","tagName":"h3"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-1","content":" Display Neutralinojs process's STDIN and STDERR streams directly on the console.Remove --verbose option from the run command. ","version":"Next","tagName":"h3"},{"title":"v9.1.2​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v912","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-2","content":" Fix client library path issue with hot-reload workaround on Windows. ","version":"Next","tagName":"h3"},{"title":"v9.1.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v911","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixes","content":" Fix browser mode exit issue with neu run. ","version":"Next","tagName":"h3"},{"title":"v9.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v910","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-3","content":" Add a workaround to use hot module reloading from the app developer's existing frontend library/framework. ","version":"Next","tagName":"h3"},{"title":"v9.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v900","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Creator​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-creator","content":" Allow downloading any community template via neu create myapp --template <template>. <template> accepts valid GitHub repo identifiers. The default value is neutralinojs/neutralinojs-minimal. ","version":"Next","tagName":"h3"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-4","content":" Add --verbose option to identify framework initialization crashes. It will show STDERR and STDOUT of the framework once the process was terminated.Support sending any internal CLI argument to the Neutralinojs process via neu run -- <additional_args>.Remove --mode=<mode> option from run since the same work can be done with neu run -- --mode=<mode>. ","version":"Next","tagName":"h3"},{"title":"Bugfixes and improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixes-and-improvements","content":" Fix the infinite retry issue with the neu run command.Show an error message for download failures. ","version":"Next","tagName":"h3"},{"title":"v8.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v810","content":" ","version":"Next","tagName":"h2"},{"title":"Core: File watcher​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-file-watcher","content":" Exclude auto-reload files via cli.autoReloadExclude.Watch only the cli.resourcesDir to avoid many unwanted reloads. ","version":"Next","tagName":"h3"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-3","content":" Add new --copy-storage flag to automatically copy storage data to the app bundle. ","version":"Next","tagName":"h3"},{"title":"v8.0.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v801","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-4","content":" Make cli.extensionsDir optional for bundling process. ","version":"Next","tagName":"h3"},{"title":"Bugfixes​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixes-1","content":" Fix an issue in websocket error log. ","version":"Next","tagName":"h3"},{"title":"v8.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v800","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-5","content":" Copy extensions to the app bundle.Rename res.neu to resources.neu. ","version":"Next","tagName":"h3"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-5","content":" Use websocket connection to auto reload app. ","version":"Next","tagName":"h3"},{"title":"v7.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v710","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Downloader​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloader-1","content":" Use server/client versions from config ","version":"Next","tagName":"h3"},{"title":"neu version​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#neu-version","content":" Removed global Neutralino version details ","version":"Next","tagName":"h3"},{"title":"Client Library","type":0,"sectionRef":"#","url":"/docs/release-notes/client-library","content":"","keywords":"","version":"Next"},{"title":"Unreleased​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#unreleased","content":" ","version":"Next","tagName":"h2"},{"title":"v5.4.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v540","content":" ","version":"Next","tagName":"h2"},{"title":"API: resources​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-resources","content":" Export getFiles(), extractFile(path, dest), readFile(path), and readBinaryFile(path) functions. ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window","content":" Export minimize(), unminimize(), and isMinimized() functions.Add alwaysCapture and dragMinDistance options to the window.setDraggableRegion() function and improve the performance of the overall draggable window implementation. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#bugfixesimprovements","content":" Fix several issues with TypeScript exports and definitions. ","version":"Next","tagName":"h3"},{"title":"v5.3.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v530","content":" ","version":"Next","tagName":"h2"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem","content":" Expose filesystem.getAbsolutePath(path), filesystem.getRelativePath(path, ?base), and filesystem.getPathParts(path) functions. ","version":"Next","tagName":"h3"},{"title":"v5.2.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v520","content":" ","version":"Next","tagName":"h2"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-1","content":" Accept overwrite, skip, and recursive options for the filesystem.copy() function. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#bugfixesimprovements-1","content":" Improve the window.create() function's option-to-CLI argument mapping logic. ","version":"Next","tagName":"h3"},{"title":"v5.1.1​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v511","content":" ","version":"Next","tagName":"h2"},{"title":"NPM​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#npm","content":" Fix the NPM package import issue. ","version":"Next","tagName":"h3"},{"title":"v5.1.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v510","content":" ","version":"Next","tagName":"h2"},{"title":"API: clipboard​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-clipboard","content":" Export new framework functions: clipboard.getFormat(), clipboard.readImage(), and clipboard.writeImage(image). ","version":"Next","tagName":"h3"},{"title":"TypeScript​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#typescript","content":" Separate type definitions into a new directory to improve project structure.Add missing type definitions. ","version":"Next","tagName":"h3"},{"title":"v5.0.1​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v501","content":" ","version":"Next","tagName":"h2"},{"title":"TypeScript​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#typescript-1","content":" Fix type declaration issues with the window global object. Now, window.NL_VERSION, etc. won't display errors on code editors or with the TypeScript compiler. ","version":"Next","tagName":"h3"},{"title":"v5.0.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v500","content":" ","version":"Next","tagName":"h2"},{"title":"API: app​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-app","content":" Expose app.readProcessInput(readAll=false), app.writeProcessOutput(), and app.writeProcessError() functions. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-2","content":" Export/deprecate functions based on framework's v5 release. See framework changelog for more details. ","version":"Next","tagName":"h3"},{"title":"v3.13.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3130","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-1","content":" Add extendUserAgentWith and exitProcessOnClose options to window.create TypeScript definition. ","version":"Next","tagName":"h3"},{"title":"v3.12.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3120","content":" ","version":"Next","tagName":"h2"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#improvementsbugfixes","content":" Improved the performance of the draggable regions API by throttling Neutralino framework function calls.Fix the restarting issue that happens when the app path contains spaces. ","version":"Next","tagName":"h3"},{"title":"v3.11.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3110","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-2","content":" Avoid saving the window state for child windows in the window.create function by using the --window-use-saved-state=false internal CLI argument. ","version":"Next","tagName":"h3"},{"title":"v3.10.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3100","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-3","content":" Export the window.center function. ","version":"Next","tagName":"h3"},{"title":"v3.9.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v390","content":" ","version":"Next","tagName":"h2"},{"title":"API: file watchers​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-file-watchers","content":" Export filesystem.createWatcher and filesystem.removeWatcher functions. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#devops","content":" Publish to NPM only if there are unreleased changes in changelog. ","version":"Next","tagName":"h3"},{"title":"v3.8.2​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v382","content":" ","version":"Next","tagName":"h2"},{"title":"NPM/ESM support​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#npmesm-support","content":" Add ESM support for the client library via neutralino.mjs.Publish (and automate) the client library as an NPM package,@neutralinojs/lib. ","version":"Next","tagName":"h3"},{"title":"v3.8.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v380","content":" ","version":"Next","tagName":"h2"},{"title":"API: custom methods and file streams​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-custom-methods-and-file-streams","content":" Expose functions in framework's custom methods and file streams implementations. ","version":"Next","tagName":"h3"},{"title":"v3.7.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v370","content":" ","version":"Next","tagName":"h2"},{"title":"API: os, filesystem, storage, and computer​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-os-filesystem-storage-and-computer","content":" Expose new framework functions: os.getEnvs, storage.getKeys, and computer.getMousePosition.Add size and pos options to filesystem.readFile and filesystem.readBinaryFile functions. ","version":"Next","tagName":"h3"},{"title":"v3.6.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v360","content":" ","version":"Next","tagName":"h2"},{"title":"API: System information API​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-system-information-api","content":" Expose the new system information API functions: computer.getArch, computer.getKernelInfo, computer.getOSInfo, computer.getCPUInfo, and computer.getDisplays. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-os","content":" Add the defaultPath option to set the default file path for all file dialogs. ","version":"Next","tagName":"h3"},{"title":"v3.5.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v350","content":" ","version":"Next","tagName":"h2"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-3","content":" Expose createdAt and modifiedAt JavaScript timestamps with the filesystem.getStats function. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-os-1","content":" Add new functions for spawning processes. spawnProcess, getSpawnedProcesses, and updateSpawnedProcess. ","version":"Next","tagName":"h3"},{"title":"v3.4.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v340","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#devops-1","content":" Add nightly builds support. Developers can download the nightly builds by setting cli.clientVersion to nightly. ","version":"Next","tagName":"h3"},{"title":"Core: global variables​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-global-variables","content":" Add NL_CCOMMIT to hold the release commit of the client library. ","version":"Next","tagName":"h3"},{"title":"v3.3.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v330","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-4","content":" Add window.getPosition to get the current window coordinates. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-4","content":" Add filesystem.appendFile to append text content to a file. Thrown errors are similar to the filesystem.writeFile function.Add filesystem.appendBinaryFile to append binary content to a file. Thrown errors are similar to the filesystem.writeBinaryFile function. ","version":"Next","tagName":"h3"},{"title":"v3.2.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v320","content":" ","version":"Next","tagName":"h2"},{"title":"API: init​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-init","content":" Store NL_TOKEN in sessionStorage and handle native API calls after page reload.Show a message to the user via HTML if NL_TOKEN is not valid (Eg: when the user tries to open the app from another client with one-time token). ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-5","content":" Add window.setAlwaysOnTop(bool).Add window.getSize. ","version":"Next","tagName":"h3"},{"title":"v3.1.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v310","content":" ","version":"Next","tagName":"h2"},{"title":"API: clipboard​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-clipboard-1","content":" clipboard.readText and clipboard.writeText functions added. ","version":"Next","tagName":"h3"},{"title":"v3.0.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v300","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Extensions​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-extensions","content":" Extension API functions. Queue messages dispatched to extensions and send when the extension is ready. ","version":"Next","tagName":"h3"},{"title":"Core: Init​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-init","content":" Reload app based on --neu-dev-auto-reload (--debug-mode removed) with the neuDev_reloadApp event. ","version":"Next","tagName":"h3"},{"title":"API: window.create​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-windowcreate","content":" Return process information with the promise. ","version":"Next","tagName":"h3"},{"title":"API: window.setDraggableRegion​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-windowsetdraggableregion","content":" Allow passing DOM element as the param. ","version":"Next","tagName":"h3"},{"title":"API: window.unsetDraggableRegion​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-windowunsetdraggableregion","content":" Newly introduced method to remove draggable region handlers from an element. ","version":"Next","tagName":"h3"},{"title":"API: Updater​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-updater","content":" Updater API functions. ","version":"Next","tagName":"h3"},{"title":"Improvements​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#improvements","content":" Make return values of events namespace functions consistent.Rename res.neu to resources.neu. ","version":"Next","tagName":"h3"},{"title":"Core: Ping on browsers​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-ping-on-browsers","content":" Polling action to the server was removed and replaced by the server process's internal idle check. app.keepAlive was removed. ","version":"Next","tagName":"h3"},{"title":"Events​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#events","content":" Client-side implementaion of extensionReady.Allow developers to call native APIs without depending on the ready event (it's not removed becuase of the internal usage). ","version":"Next","tagName":"h3"},{"title":"Extensions Overview","type":0,"sectionRef":"#","url":"/docs/how-to/extensions-overview","content":"","keywords":"","version":"Next"},{"title":"Defining the extensions​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#defining-the-extensions","content":" First, you need to define extensions you use in neutralinojs.config.json with the following structure. "extensions": [ { "id": "js.neutralino.sampleextension", "commandLinux": "${NL_PATH}/extensions/binary/linux/ext_bin", "commandDarwin": "${NL_PATH}/extensions/binary/mac/ext_bin", "commandWindows": "${NL_PATH}/extensions/binary/win/ext_bin.exe" }, { "id": "js.neutralino.binaryextension", "command": "node ${NL_PATH}/extensions/binary/main.js", } ] id String: A unique key to identify each extension. This id cannot contain any characters except for letters, numbers, and periods.command String (optional): A cross-platform command to start the extension. Eg: node ${NL_PATH}/extensions/binary/main.jswill work on every platform.commandLinux String (optional): Extension startup command for Linux.commandDarwin String (optional): Extension startup command for macOS.commandWindows String (optional): Extension startup command for Windows. ","version":"Next","tagName":"h2"},{"title":"Enable the extensions feature​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#enable-the-extensions-feature","content":" The extensions API is disabled by default. Enable extensions by adding the following setting to your app config. "enableExtensions": true ","version":"Next","tagName":"h2"},{"title":"Connecting an extension with Neutralinojs​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#connecting-an-extension-with-neutralinojs","content":" As you already noticed, an extension is just a separate process. Neutralinojs starts spawning extension instances during the framework bootstrap process and initiates each extension process by sending the following JSON object via standard input streams: { "nlPort": "", "nlToken": "", "nlConnectToken": "", "nlExtensionId": "" } The above JSON properties contains connectivity information as follows: nlPort: port of the Neutralinojs server.nlToken: Access token to use the native API.nlConnectToken: A token that extension should send during WebSocket connection initialization.nlExtensionId: Extension identifier. Now, you can connect with the Neutralinojs server with the above details. Use the following WebSocket URL to initiate a new WebSocket connection. ws://localhost:{port}?extensionId={extensionId}&connectToken={connectToken} ","version":"Next","tagName":"h2"},{"title":"Sending a message from app to an extension​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#sending-a-message-from-app-to-an-extension","content":" The extensions API uses an event-based messaging protocol. Every message uses the following JSON structure. { "event": "<event_name>", "data": {} } Use the built-in extensions API to send a message to any extension, as shown below. let extension = 'js.neutralino.sampleextension'; let event = 'helloExtension'; let data = { testValue: 10, }; await Neutralino.extensions.dispatch(extension, event, data); The above code snippet sends a message to the js.neutralino.sampleextension extension instance. You can send messages to extensions with the dispatch function anytime. If you send a message before the extension connects with the main process, the Neutralinojs client library queues and sends it when the target extension's connection is established. In other words, you don't need to worry about extensions' status when you send messages to extensions. ","version":"Next","tagName":"h2"},{"title":"Sending a message from the extension to app​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#sending-a-message-from-the-extension-to-app","content":" When you connect your extensions with the Neutralinojs main process, you can call the native API by sending WebSocket messages to the Neutralinojs process directly. Neutralinojs server processes messages based on the following format. { "id": "<id>", "method": "<method>", "accessToken": "<token>", "data": {} } id String: A UUID v4 string.method String: Native method name. Eg: window.setTitle.accessToken String: Access token generated by the Neutralinojs server.data Object (optional): Parameters for the native method. You can invoke the app.broadcast native method to send messages to all app instances. Register a callback with the events.on in the application code to receive the message send by the extension process. ","version":"Next","tagName":"h2"},{"title":"Terminating an extension instance​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#terminating-an-extension-instance","content":" When Neutralino exits, it does not send kill signals to all extension instances. Therefore, it is necessary to stop the extension process when the WebSocket-based IPC (Inter-Process Communication) closes. The following Node.js extension code shows how to do this: const fs = require('fs'); const process = require('process'); const WS = require('websocket').w3cwebsocket; const { v4: uuidv4 } = require('uuid'); const chalk = require('chalk'); // Obtain required params to start a WS connection from stdIn. const processInput = JSON.parse(fs.readFileSync(process.stdin.fd, 'utf-8')); const NL_PORT = processInput.nlPort; const NL_TOKEN = processInput.nlToken; const NL_CTOKEN = processInput.nlConnectToken; const NL_EXTID = processInput.nlExtensionId; const client = new WS( `ws://localhost:${NL_PORT}?extensionId=${NL_EXTID}&connectToken=${NL_CTOKEN}` ); client.onerror = () => log("Connection error!", "ERROR"); client.onopen = () => log("Connected"); client.onclose = () => process.exit(); client.onmessage = (e) => { const { event, data } = JSON.parse(e.data); if (event === "eventToExtension") { log(data); client.send( JSON.stringify({ id: uuidv4(), method: "app.broadcast", accessToken: NL_TOKEN, data: { event: "eventFromExtension", data: "Hello app!" }, }) ); } }; function log(message, type = "INFO") { const logLine = `[${NL_EXTID}]: ${chalk[ type === "INFO" ? "green" : "red" ](type)} ${message}`; console[type === "INFO" ? "log" : "error"](logLine); } This code implements a simple Node.js extension for Neutralinojs, which establishes a WebSocket connection to the Neutralinojs server and handles incoming messages from the server. It also sends a message to the server using the client.send method when it receives a specific event from the server. For more information on how to terminate an extension instance, you can refer to the sample extension source.https://github.com/neutralinojs/neutralinojs/tree/main/bin/extensions/sampleextension ","version":"Next","tagName":"h2"},{"title":"Using Neutralinojs from your source files​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#using-neutralinojs-from-your-source-files","content":" The above approach helps you to extend Neutralinojs API with a custom backend code. Neutralinojs process can spawn multiple extensions as child processes and communicate with the internal messaging protocol. On the other hand, you can spawn Neutralinojs processes from your own processes and communicate with the same messaging protocol. Using this approach, it's possible to write Neutralinojs apps with any backend language. You can obtain authentication details for the Neutralinojs process by setting your config as below. "exportAuthInfo": true The above setting exports authentication details to ${NL_PATH}/.tmp/auth_info.json with the following format. { "nlPort": "<port>", "nlToken": "<token>", "nlConnectToken": "<connect_token>" } Connect with the Neutralinojs process by using the extension API as usual with the extension identifier you used in the application configuration file. ","version":"Next","tagName":"h2"},{"title":"Framework","type":0,"sectionRef":"#","url":"/docs/release-notes/framework","content":"","keywords":"","version":"Next"},{"title":"Unreleased​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#unreleased","content":" ","version":"Next","tagName":"h2"},{"title":"v5.4.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v540","content":" ","version":"Next","tagName":"h2"},{"title":"API: resources​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-resources","content":" Implement getFiles(), extractFile(path, dest), readFile(path), and readBinaryFile(path) functions via the resources module for reading the files embedded in the resources.neu resources bundle. These functions works only if the framework loaded resources from the resource bundle -- they will throw NE_RS_APIRQRF if the framework loaded resources from the resources directory. ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window","content":" Implement minimize(), unminimize(), and isMinimized() functions to minimize and restore the native app window. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes","content":" Fix issues with the clipboard.writeImage() function on Windows.Fix the unwanted delay with the window.exitProcessOnClose configuration option on Windows.Fix a bug with the window.isFullScreen() function on GNU/Linux-based platforms.Fix duplicate virtual PID issues with the os.spawnProcess() function. ","version":"Next","tagName":"h3"},{"title":"v5.3.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v530","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: window transparency on Windows​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-window-transparency-on-windows","content":" Window transparency support was added on the Windows version of the Neutralinojs framework. This can be activated with modes.window.transparent configuration property or --window-transparent command-line option. Unlike in other platforms, Windows native window becomes borderless (window controls will be hidden) with the activation of the transparent mode. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os","content":" Add the temp key for the supported directory list of the os.getPath(pathKey) function. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem","content":" Add the filesystem.getAbsolutePath(path) function to let developers get a full path string from a relative path string.Add the filesystem.getRelativePath(path, ?base) function to get a relative path from a path and a base path.Add the filesystem.getPathParts(path) to parse and get path segments like filename, extension, root path, etc. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-1","content":" Fix Unicode issues in the Windows version with filesystem, storage, and general modules.Fix standard output/error data display issues on Windows ","version":"Next","tagName":"h3"},{"title":"v5.2.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v520","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: Configless framework initialization​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-configless-framework-initialization","content":" Now, developers can load the Neutralinojs framework without creating a neutralino.config.json file. Now, there is no mandatory configuration properties since Neutralinojs set reasonable defaults. Developers can launch the framework using the following methods without a configuration file: # Loading a remote URL ./framework-bin --url=https://neutralino.js.org/docs # Launches a local static web app ./framework-bin --url="/resources/" --window-title="My web app" --enable-server ","version":"Next","tagName":"h3"},{"title":"Configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration","content":" New internal CLI arguments added: --single-page-serve, --enable-native-api and --document-root=<string> ","version":"Next","tagName":"h3"},{"title":"Core: Static server SPA (Single Page App) serving​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-static-server-spa-single-page-app-serving","content":" Earlier, Neutralinojs app developers had to use hash routing with their frontend-library-based apps since the internal static server didn't offer an inbuilt URL rewrite logic for SPAs (Single Page Apps). Now, they can use the singlePageServe: true option in the app configuration file to activate SPA routing. If this setting is on, the static server will serve the main index.html file when it receives directory requests that possibly send HTTP 404 status. For example, the /invoices path serves the main index.html file if there is no directory named invoices which holds an index.html file. ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-1","content":" Improve the behaviour of the window.show() function on Windows. Now, this function flashes the window if it's already in foreground and activates the window properly if it's minimized. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-2","content":" Fix path issues with the defaultPath option in system file dialogs on Windows. ","version":"Next","tagName":"h3"},{"title":"v5.1.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v510","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: window transparency​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-window-transparency","content":" Neutralinojs offers the inbuilt borderless mode and draggable region API to create custom window frames using HTML and CSS. Earlier, Neutralinojs used a default opaque color (usually white) for the window and webview layer, so app developers couldn't make custom CSS-styled window frames transparent or implement custom window frame shapes (i.e., rounded edges). Now, it offers the window.transparent boolean flag to activate window transparency. If the transparency mode is on, the Neutralinojs window and webview use an alpha color layer and become transparent, so developers can use the rgba CSS color function on body background to handle the transparency level of the app. The transparency mode can be activated using the --window-transparent=<bool> internal command-line option too. Note: This feature is not implemented for the Windows operating system yet. ","version":"Next","tagName":"h3"},{"title":"API: clipboard​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-clipboard","content":" Implement clipboard.readImage() and clipboard.writeImage(image) functions to work with clipboard image data.Expose the clipboard.clear() function to clear system clipboard.Expose the clipboard.getFormat() function to check the system clipboard data format. This function returns text, image, and unknown enum values based on existing data on the clipboard. ","version":"Next","tagName":"h3"},{"title":"v5.0.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v500","content":" ","version":"Next","tagName":"h2"},{"title":"API: Reading, writing with standard streams​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-reading-writing-with-standard-streams","content":" Implement app.readProcessInput(readAll=false) for reading string data from the standard input stream. This function can read a single line or multiple lines at once.Implement app.writeProcessOutput and app.writeProcessError for sending string data to standard output and error streams accordingly. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-1","content":" Enable default recursive behavior in the filesystem.createDirectory function.Add filesystem.copy, filesystem.move, and filesystem.remove functions.Add {recursive} options object to filesystem.readDirectory(path, options) activate recursive directory listing. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os-1","content":" Accept stdin with the background mode of the os.execCommand function. ","version":"Next","tagName":"h3"},{"title":"Core: security​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-security","content":" Now, all app clients and extensions require a valid connect token (A part of the NL_TOKEN) to connect to the Neutralinojs framework WebSocket server to receive app events.The framework now sends the access token, connect token, port, and extension identifier to extension processes via the standard input, so other processes can't read them by scanning the process list.The WebSocket client connection origin is checked during the HTTP/WS handshake to make sure that only local clients connect with a specific Neutralinojs app that runs on window, browser, or Chrome mode. Any URL origin is allowed for the cloud mode.The above security enhancements fix two security advisories on GitHub. ","version":"Next","tagName":"h3"},{"title":"Global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#global-variables","content":" Now the NL_ARCH global variable returns the same value that computer.getArch returns. ","version":"Next","tagName":"h3"},{"title":"Deprecations​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#deprecations","content":" Removed filesystem.removeFile, filesystem.removeDirectory, filesystem.copyFile, and filesystem.moveFile functions.Extensions won't receive --nl-port, --nl-token, and --nl-extension-id as command-line arguments. Now the framework sends these via stdin as a JSON string. ","version":"Next","tagName":"h3"},{"title":"v4.15.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4150","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: custom user agent string​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-custom-user-agent-string","content":" Developers sometimes use the user agent string to indentify the client in server-side and client-side source codes. Now, Neutralinojs lets app developers extend the default user agent string with a custom string via the window.extendUserAgentWith configuration property and the --window-extend-user-agent-with=<string> command-line option, as shown in the following example: "window": { // --- "extendUserAgentWith": "MyAppClient" } The above configuration extends the user agent string: console.log(navigator.userAgent) // <Default UA> MyAppClient ","version":"Next","tagName":"h3"},{"title":"Configuration: custom configuration files​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-custom-configuration-files","content":" The Neutralinojs framework typically loads the application configuration content from the neutralino.config.json file, but sometimes app developers need to use a custom configuration filename during development (i.e., For separating production and development environments). Now, you can use the --config-file=<filename> internal command-line parameter to use a custom app configuration, as shown in the following example: ./myapp-linux_x64 --load-dir-res --config-file=neutralino-dev.config.json ","version":"Next","tagName":"h3"},{"title":"v4.14.1​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4141","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops","content":" Use Windows 2019 server and macOS 11 (Big Sur) to compile framework release artifacts.Set minimum supported macOS version via MACOSX_DEPLOYMENT_TARGET=10.7 ","version":"Next","tagName":"h3"},{"title":"v4.14.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4140","content":" ","version":"Next","tagName":"h2"},{"title":"Filesystem API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#filesystem-api","content":" Introduce the filesystem.getWatchers function to get all created watchers.Add binary file reading support for the filesystem.updateOpenedFile(id, action, data) function. This function implements readBinary and readAllBinary actions and dataBinary output action in the openedFile global event.Return the existing watcher identifier from filesystem.createWatcher if there is an existing active watcher for the given path. ","version":"Next","tagName":"h3"},{"title":"OS API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#os-api","content":" Add a way to set current working directory for process creation functions: os.execCommand(command, options) now supports cwd via the options object and os.spawnProcess(command, cwd) accepts currently working directory via the second string parameter. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-3","content":" Fix Unicode charactor issues in the tray menu on Windows.Avoid including null bytes to file reader events initiated by the filesystem.openFile function.Discard window method executions on non-window modes. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-1","content":" Update external GitHub Action packages to their latest versions.Fix issues of the failing test cases ","version":"Next","tagName":"h3"},{"title":"v4.13.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4130","content":" ","version":"Next","tagName":"h2"},{"title":"Core: persistent window state​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-persistent-window-state","content":" Now the framework stores the primary window state in a temporary file (JSON formatted) and loads during the startup process. This feature stores and sets the window position (x, y coordinates), size (width and height), and maximized status. This feature is enabled by default in all platforms, but app developers can turn it off by using false for the window.useSavedState configuration attribute or --window-use-saved-state internal CLI argument. Also, the window state loading status is available via the NL_WSAVSTLOADED global variable. The framework sets true for this boolean variable if the window state was loaded from the saved configuration. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-4","content":" Fix several issues in the webview Windows code (i.e., Wait for the window close event, window style fixes, etc.). ","version":"Next","tagName":"h3"},{"title":"v4.12.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4120","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-2","content":" Add window.center to center the application window programmatically. ","version":"Next","tagName":"h3"},{"title":"Core: configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-configuration","content":" Setting the initial window position via modes.window.x and modes.window.y integer config props.Centering the window at startup via modes.window.center boolean config props.Add config overrides for the startup window position: --window-center=<true|false>, --window-x=<int> and --window-y=<int> ","version":"Next","tagName":"h3"},{"title":"Core: webview​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-webview","content":" Statically link the Webview2 loader library on Windows, so app developers can package their apps without including the WebView2Loader.dll file. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-5","content":" Added Unicode characters support for Neutralinojs Windows. ","version":"Next","tagName":"h3"},{"title":"v4.11.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4110","content":" ","version":"Next","tagName":"h2"},{"title":"API: File watchers​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-file-watchers","content":" In some scenarios, Neutralinojs app developers need to implement file watchers in their apps. Earlier, Neutralinojs API didn't offer a native file watcher API and developers had to use less-performant workarounds, such as making recursive filesystem.readDirectory calls. The new file watchers API lets you create native, cross-platform, event-based file watchers for filesystem paths with the following functions: filesystem.createWatcher(path): Creates a new file watcher for a given path and returns the watcher identifier.filesystem.removeWatcher(watcherId): Removes a files watcher based on a file watcher identifier. Whenever a filesystem change occurs, file watcher instances dispatch the watchFile event with the following data: id: Watcher identifieraction: Filesystem change: add, delete, modified, and moveddir: Directory pathfilename: Modified file ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-6","content":" Fix the initial window flashing and hidden window state issues on Windows.Fix data corruption in binary file appending.Apply dark/light themes based on system preferences on Windows. ","version":"Next","tagName":"h3"},{"title":"v4.10.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4100","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-2","content":" Generate official macOS arm64 (For Apple M1 and higher devices) and universal binaries with the GitHub workflow. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-7","content":" Add a JSON schema definition for the neutralino.config.json file.Fix source code compilation issues on macOS arm64 systems. ","version":"Next","tagName":"h3"},{"title":"ESM/NPM support​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#esmnpm-support","content":" Neutralinojs typically stores the client library implementation in a separate file (neutralino.js). This approach makes Neutralinojs app development process easier with a globally exposed JavaScript object, Neutralino. But, modern web developers use ES modules and they usually like to fetch dependencies from NPM. So, now, developers can load the __neutralino_globals.js internal script (i.e., <script src="__neutralino_globals.js"></script>) to load only globals. Then, they can use the client library implementation via neutralino.mjs with the neu CLI or from @neutralinojs/lib with a Node package manager. ","version":"Next","tagName":"h3"},{"title":"v4.9.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v490","content":" ","version":"Next","tagName":"h2"},{"title":"API: Custom methods​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-custom-methods","content":" Neutralinojs offers the extensions API to write custom backend code with any programming language, but extensions come with the following drawbacks that affect apps in several scenarios: Extensions use a shared WebSocket for communication, so using direct C++ references (i.e., the window handler) is impossible within extensions.The developer is responsible for packaging their extension binaries.A C++-based extension is not fast as native C++-based code due to the WebSockets-based IPC. Alternatively, a developer can download the framework C++ code, modify it, and re-compile it. But, the developer may face issues while synching upstream code modifications. So, Neutralinojs offers a separate namespace, a function template, inbuilt helper functions (i.e., to get the window handler, validation, etc.), and a developer guide to add custom APIs to the Neutralinojs framework without updating the framework core. Example: let res = await Neutralino.custom.fetch('https://neutralino.js.org'); If developers make a custom API that others can use, we motivate them to contribute to the Neutralinojs framework by adding it to the main codebase. Example: let res = await Neutralino.net.fetch('https://neutralino.js.org'); If the developer adds a new custom method to the framework, the client library will automatically export it to the Neutralino.custom namespace by using the NL_CMETHODS internal global variable. The Neutralino.custom.getMethods function returns an array of custom methods similar to NL_CMETHODS. ","version":"Next","tagName":"h3"},{"title":"API: File streams​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-file-streams","content":" The current Neutralinojs API offers non-stream-based (Promise-based but synchronous-like) functions for working with files. For example, the filesystem.readFile function reads the file content and retrieves data synchronously even though the WebSocket communication mechanism supports asynchronous patterns. However, the synchronous API lets developers work with files in a simple way, but they face the following issues in some scenarios: Reading large files is not performance-friendly (The whole file content gets loaded into the memory).Unable to work with dynamic file objects (i.e., Device files).File descriptors are not persistent within the app lifecycle as they get destroyed after native API calls. To solve this issue, we offer an event-based file stream API with the following functions/events: Functions​ filesystem.openFile: Creates a file stream by openning a file.filesystem.updateOpenedFile: Triggers a file read/readAll event or sets the file cursor.filesystem.getOpenedFileInfo: Returns (awaited) information about the file stream (Props: id, eof, pos, and lastRead) Events​ openedFile: Occurs per each file read event and whenever the file stream reaches EOF. ","version":"Next","tagName":"h3"},{"title":"v4.8.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v480","content":" ","version":"Next","tagName":"h2"},{"title":"API: os.getEnvs​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-osgetenvs","content":" os.getEnv returns a value for a given environment variable key. Developers had to use alternative methods to retrieve a list of all environment variables with values. The os.getEnvs returns all environment variables as a JavaScript object similar to Node's process.env. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-2","content":" Added pos and size options for readFile and readBinaryFile methods to set the file cursor position and buffer size respectively. ","version":"Next","tagName":"h3"},{"title":"API: storage.getKeys​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-storagegetkeys","content":" Added the storage.getKeys function to get an array of Neutralinojs storage keys. Now, developers don't need to write their own functions to retrieve storage keys with the filesystem API. ","version":"Next","tagName":"h3"},{"title":"API: computer.getMousePosition​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-computergetmouseposition","content":" Returns the current mouse cursor position via a JavaScript object that has x and y props. This function is helpful for develping interactive desktop widgets on all supported platforms. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements","content":" Replaced string error codes with enums in the C++ source code.Some refactorings done in C++ struct definitions and return values. ","version":"Next","tagName":"h3"},{"title":"v4.7.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v470","content":" ","version":"Next","tagName":"h2"},{"title":"API: System information API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-system-information-api","content":" Ealier, we had the getMemoryInfo function in the computer namespace to retrieve system memory statistics. Now, we have added more functions to get details about the CPU, operating system, kernel, and connected displays: computer.getArch: Returns the CPU architecture. i.e, x64, arm, etc.computer.getKernelInfo: Returns the operating system's kernel details.computer.getOSInfo: Returns the operating system details.computer.getCPUInfo: Returns the CPU details.computer.getDisplays: Returns an array of all connected displays with the resolution, frequency-like information. ","version":"Next","tagName":"h3"},{"title":"API: os dialogs​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os-dialogs","content":" Add the defaultPath option to showSaveDialog, showOpenDialog, and showFolderDialog functions to set the initial path/filename of system dialogs. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-3","content":" Run the test suite on Windows GitHub Actions instance.Fix the armhf framework binary generation issue in the GitHub Actions workflow. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-1","content":" Hide the automation info bar from the Chrome mode by default -- Developers can add the --enable-automation flag to the config file if they need the particular command-line switch. ","version":"Next","tagName":"h3"},{"title":"v4.6.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v460","content":" ","version":"Next","tagName":"h2"},{"title":"API: Process spawning API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-process-spawning-api","content":" We have os.execCommand for launching processes, but it's synchronous, meaning, the developer has to wait unti process completion to receive pid, stdOut and stdErr. execCommand is not suitable for long-running processes. The new spawning API offers API functions for handling long-running processes in a multi-threaded way. os.spawnProcess(command): Spawns a process and returns id (A virtual Neutralino-scoped pid) and pid (Operating system-level pid).os.getSpawnedProcesses(): Returns a list of spawned processes.os.updateSpawnedProcess(id, action, data): Sends an action event for the spawned process. Supports the following actions: stdIn: Sends a string via the standard input stream. data is the input string.stdInEnd: Closes the standard input stream.exit: Terminates the spawned process. ","version":"Next","tagName":"h3"},{"title":"Core: events​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-events","content":" spawnedProcess: Dispatched when there is a change in the spawned process. CustomEvent gets triggered with the following object: { id: <id>, pid: <pid>, action: <action>, data: <data> } Available actions: stdOut: Outputs standard output data. data contains the standard output payload.stdErr: Outputs standard error data. data contains the standard error payload.exit: Notified when the process terminates. data contains the process exit code. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-4","content":" Add official Linux ARM (armhf and arm64) binary build support for the standard release workflow and nightly build. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-3","content":" Expose createdAt and modifiedAt JavaScript timestamps via the filesystem.getStats function. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-2","content":" Hide the .storage directory (Neutralinojs storage location) on Windows.Support using query parameters in resources URLs. i.e., index.html?v=2.0 is supported, but caching is not yet implemented.Show a user-friendly error message for Neutralinojs server initialization failures. ","version":"Next","tagName":"h3"},{"title":"v4.5.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v450","content":" ","version":"Next","tagName":"h2"},{"title":"Core: events​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-events-1","content":" Added windowFocus and windowBlur native events. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-5","content":" Use BuildZri for C++ build automation.Implement a new workflow for nightly releases. Developers can get the nightly release binaries via the nightly version tag. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-3","content":" Search and dynamically load app indicator libraries on Linux. This enhancement supports Neutralinojs to start without a crash when there is no app indicator library present on the system.Throw NE_OS_TRAYIER from the os.setTray function for initialization failures.Fix binary file write error on Windows with the filesystem.writeBinaryFile function. This was fixed by using LF as the line breaker on all platforms as a portable solution. If the developer needs CRLF on Windows (or CR on Darwin), the developer needs to handle it explicitly with NL_OS. ","version":"Next","tagName":"h3"},{"title":"Core: global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-global-variables","content":" Add NL_COMMIT to hold framework's release commit. This is helpful to find the nightly release's code snapshot. ","version":"Next","tagName":"h3"},{"title":"v4.4.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v440","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-3","content":" Add window.getPosition to get the current window coordinates. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-4","content":" Add filesystem.appendFile to append text content to a file. Thrown errors are similar to the filesystem.writeFile function.Add filesystem.appendBinaryFile to append binary content to a file. Thrown errors are similar to the filesystem.writeBinaryFile function. ","version":"Next","tagName":"h3"},{"title":"Dependencies​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#dependencies","content":" Use ayatana-appindicator3-0.1 instead of appindicator3-0.1 (Marked as obsolete in Debian packages) ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-4","content":" Dynamically call SetProcessDpiAwarenessContext function to support previous Windows versions.Display the native method name with the NE_RT_NATPRME error payload. ","version":"Next","tagName":"h3"},{"title":"v4.3.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v430","content":" ","version":"Next","tagName":"h2"},{"title":"Core: auth​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-auth","content":" Added tokenSecurity to the configuration to improve the security of NL_TOKEN. Accepted values are none and one-time. If none is set, Neutralinojs server will always expose NL_TOKEN for any application instance, so you can open Neutralinojs apps from browser directly. If one-time (recommended) is set, Neutralinojs server expose NL_TOKEN only once and client persists the token in sessionStorage, so all other clients that acces the app after the initial client will get an auth error message (Displayed to the user via HTML). ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-4","content":" window.setAlwaysOnTop(bool) was added.window.getSize was added. ","version":"Next","tagName":"h3"},{"title":"Core: global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-global-variables-1","content":" Added NL_EXTENABLED which returns true if extensions are enabled. It is used to check extensions status faster during initialization process. ","version":"Next","tagName":"h3"},{"title":"Bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixes","content":" Fixed the file dialog order issue on Windows.Removed tray icon when the application exits. ","version":"Next","tagName":"h3"},{"title":"v4.2.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v420","content":" ","version":"Next","tagName":"h2"},{"title":"API: clipboard​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-clipboard-1","content":" Add clipboard API for all platforms. Supports reading and writing text in the system clipboard. ","version":"Next","tagName":"h3"},{"title":"Core: configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-configuration-1","content":" Accept chrome-related CLI args: --chrome-width, --chrome-height, and --chrome-args.Accept --neu-dev-extension to enable devtools connections (For internal usages with CLI).Accept custom HTTP headers via serverHeaders option. ","version":"Next","tagName":"h3"},{"title":"API: global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-global-variables","content":" Added NL_RESMODE to get details about application resources source. Returns bundle if resources are loaded from resources.neu. Otherwise, returns directory. ","version":"Next","tagName":"h3"},{"title":"Bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixes-1","content":" Fix chrome mode user data dir issue (Support paths with spaces).Fix browser mode's shutdown issue with neu CLI. ","version":"Next","tagName":"h3"},{"title":"v4.1.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v410","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-5","content":" window.getTitle returns the current native window title. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os-2","content":" Remove NE_OS_ENVNOEX from os.getEnv and return an empty string if environment variable is not defined. ","version":"Next","tagName":"h3"},{"title":"Core: Chrome mode​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-chrome-mode","content":" Now you can run Neutralinojs apps as Chrome apps via the chrome mode. ","version":"Next","tagName":"h3"},{"title":"Core: configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-configuration-2","content":" Getting chrome mode config from modes.chrome. Added height, width, and args specially for the chrome mode. ","version":"Next","tagName":"h3"},{"title":"v4.0.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v400","content":" ","version":"Next","tagName":"h2"},{"title":"API: os.execCommand​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-osexeccommand","content":" Renamed shouldRunInBackground option to background.Supports stdIn as an optional input.Returns multiple values: stdOut, stdErr, pid, and exitCode. ","version":"Next","tagName":"h3"},{"title":"Core: API extensions​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-api-extensions","content":" Config file supports new extensions array globally or in a specific mode.Neutralino spawns extension processes based on extensions array.Neutralino doesn't send kill signals to extension processes. The extension developer needs to stop processes properly.extension setting has 4 fields: id, command, commandLinux,commandDarwin, and commandWindows.The command's (platform-specific command's) value accepts ${NL_PATH} global variable.Each extension process instance is called with three CLI args: --nl-port={}, --nl-extension-id={} and --nl-token={}Enable/disable extensions with enableExtensions config. ","version":"Next","tagName":"h3"},{"title":"Core: Static server​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-static-server","content":" Supports setting document root (with documentRoot) via config. Now, it's possible to launch app without a subdirectory in the URL. ","version":"Next","tagName":"h3"},{"title":"Core: Community driver processes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-community-driver-processes","content":" Now developers can use Neutralinojs as a part of their software with any programming language by spawning Neutralinojs as a child process. Use exportAuthInfo to write auth details to ${NL_PATH}/.tmp/auth_info.json. Then the parent process can pickup access details there. Note that WebSocket communication needs to be initiated via extensions API/loader. ","version":"Next","tagName":"h3"},{"title":"API: app.broadcast​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-appbroadcast","content":" Sends an event to all app clients. This method is for extension developers. ","version":"Next","tagName":"h3"},{"title":"API: events.broadcast​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-eventsbroadcast","content":" Sends an event to all clients (apps and extensions). Useful for notifying important general events. ","version":"Next","tagName":"h3"},{"title":"API: extensions​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-extensions","content":" dispatch: Sends an event to a specific extension.broadcast: Sends an event to all connected extensions. Useful for sending shutdown signals.getStats: Returns details about loaded extensions and connected extensions. ","version":"Next","tagName":"h3"},{"title":"API: updater​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-updater","content":" checkForUpdates: Send a request to a seed URL (JSON) and fetch update details.install: Install updates based on the currently downloaded manifest. ","version":"Next","tagName":"h3"},{"title":"Events​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#events-1","content":" appClientConnect and appClientDisconnect: Occurs when a new app instance is launched and closed respectively.extClientConnect and extClientDisconnect: Occurs when a new extension is connected and disconnected respectively.extensionReady can be used to implement immediate extension calls. This is implemented from the client-side with extensions.getStats and extClientConnect. This event gurantees that it will be triggered regardless of the extension's start time. ","version":"Next","tagName":"h3"},{"title":"Error codes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#error-codes","content":" NE_EX_EXTNOTC: Thrown by extensions.dispatch if the target extension is not connected.NE_UP_CUPDMER: Thrown by updater.checkForUpdates if the JSON update manifest is invalid or applicationId is not matching.NE_UP_CUPDERR: Thrown by updater.checkForUpdates if the updater API cannot fetch the manifest.NE_UP_UPDNOUF: Thrown by updater.install when the update manifest is not loaded.NE_UP_UPDINER: Thrown by updater.install for update installation errors. ","version":"Next","tagName":"h3"},{"title":"Bug fixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bug-fixes","content":" Fix port 0 issue with modes. Earlier, if the developer sets port as 0 from a specific mode, the NL_PORT also becomes 0.Fix an issue with writeToLogFile config option. Earlier, the log file was created even this option is set to false. ","version":"Next","tagName":"h3"},{"title":"Global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#global-variables-1","content":" NL_APPVERSION: Value of the version key in the config file. ","version":"Next","tagName":"h3"}],"options":{"id":"default"}} \ No newline at end of file diff --git a/search-doc.json b/search-doc.json index 31055e2d..0205f809 100644 --- a/search-doc.json +++ b/search-doc.json @@ -1 +1 @@ -{"searchDocs":[{"title":"Introduction","type":0,"sectionRef":"#","url":"/docs/","content":"","keywords":"","version":"Next"},{"title":"What is Neutralinojs?​","type":1,"pageTitle":"Introduction","url":"/docs/#what-is-neutralinojs","content":" Neutralinojs is a lightweight and portable desktop application development framework. It lets you develop lightweight cross-platform desktop applications using JavaScript, HTML and CSS. You can extend Neutralinojs with any programming language (via extensions IPC) and use Neutralinojs as a part of any source file (via child processes IPC). ","version":"Next","tagName":"h2"},{"title":"Neutralino.app","type":0,"sectionRef":"#","url":"/docs/api/app","content":"","keywords":"","version":"Next"},{"title":"app.exit(exitCode)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appexitexitcode","content":" Terminates the running application. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters","content":" exitCode Number: Process's exit code. The default value is always 0 (success). await Neutralino.app.exit(130); await Neutralino.app.exit(); ","version":"Next","tagName":"h3"},{"title":"app.killProcess()​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appkillprocess","content":" Kills the application process. If the application becomes unresponsive, you can use this to terminate the process instantly. It is recommended to use the exit() method to close your application properly. await Neutralino.app.killProcess(); ","version":"Next","tagName":"h2"},{"title":"app.restartProcess(options)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#apprestartprocessoptions","content":" Restarts the current application instance. ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#options","content":" args String: Additional command-line arguments that need to be passed to the new application instance's process. await Neutralino.app.restartProcess(); await Neutralino.app.restartProcess({ args: '--restarted' }); ","version":"Next","tagName":"h3"},{"title":"app.getConfig()​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appgetconfig","content":" Returns the current application configuration as a JSON object. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#return-object-awaited","content":" The current application configuration. Sometimes, this configuration object is not identical to your configuration file because the framework updates the configuration during several situations such as config overriding via CLI arguments and using 0 as the port. let config = await Neutralino.app.getConfig(); console.log('URL = ', config.url); ","version":"Next","tagName":"h3"},{"title":"app.broadcast(eventName, data)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appbroadcasteventname-data","content":" Dispatches a new event to all app instances. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-1","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.app.broadcast('myTestEvent', 'Hello'); await Neutralino.app.broadcast('myTestEvent', {myData: 'Test data'}); await Neutralino.app.broadcast('myTestEvent'); ","version":"Next","tagName":"h3"},{"title":"app.readProcessInput(readAll)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appreadprocessinputreadall","content":" Reads string data from the standard input stream of the application process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-2","content":" readAll Boolean (optional): If this is set to true, the framework will read the entire standard stream. Otherwise, only one line will be returned. The default value for this option is false. let name = await Neutralino.app.readProcessInput(); console.log(`Hello ${name}`); ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#return-string-awaited","content":" Standard input stream data. ","version":"Next","tagName":"h3"},{"title":"app.writeProcessOutput(data)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appwriteprocessoutputdata","content":" Writes string data to the standard output stream of the application process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-3","content":" data String: Data to be written. await Neutralino.app.writeProcessOutput('Enter your name: '); let name = await Neutralino.app.readProcessInput(); await Neutralino.app.writeProcessOutput(`Hello ${name}\\n`); ","version":"Next","tagName":"h3"},{"title":"app.writeProcessError(data)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appwriteprocesserrordata","content":" Writes string data to the standard error stream of the application process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-4","content":" data String: Data to be written. await Neutralino.app.writeProcessError('This message goes to stderr'); ","version":"Next","tagName":"h3"},{"title":"Why Neutralinojs?​","type":1,"pageTitle":"Introduction","url":"/docs/#why-neutralinojs","content":" In Electron and NWjs, you have to install Node.js and hundreds of dependency libraries. Embedded Chromium and Node make simple apps bloaty. Neutralinojs offers a lightweight and portable SDK which is an alternative for Electron and NW.js. Neutralinojs doesn't bundle Chromium and uses the existing web browser library in the operating system (Eg: gtk-webkit2 on Linux). Neutralinojs implements a WebSocket connection for native operations and embeds a static web server to serve the web content. Also, it offers a built-inJavaScript client library for developers. See comparisons: Neutralinojs vs Electron vs NW.JS vs Tauri vs NodeGui vs Flutter vs .Net MAUINeutralinojs vs Electron vs NW.js (2018) When you start learning Neutralinojs, you will realize that Neutralinojs answers endless use cases. For example, you can use Neutralinojs for the following scenarios. Cross-platform desktop app development.Building web apps with native operations.Using as a cloud message broker.Connecting multiple processes by using as an IPC broker.and more... ","version":"Next","tagName":"h2"},{"title":"Highlighted features​","type":1,"pageTitle":"Introduction","url":"/docs/#highlighted-features","content":" Portable development kit.No compilation required for application developers.No additional dependencies required for users.Native functions support: Read files, run system commands, etc.Less resource intensive compared to chromium-node-based frameworks.Cross-platform: Neutralinojs apps work on Linux, Windows, macOS, and Web.Simple and flexible development environment. ","version":"Next","tagName":"h2"},{"title":"Supported platforms and CPU architectures​","type":1,"pageTitle":"Introduction","url":"/docs/#supported-platforms-and-cpu-architectures","content":" neu CLI provides you pre-built x64 binaries for Linux, macOS, and Windows. Additionally, it provides ARM (armhf/arm64) Linux binaries with the Neutralinojs framework v4.6.0 or newer versions and ARM (arm64) Darwin binaries with v4.10.0 or newer framework versions. We are trying to officially support all popular CPU architectures with the CLI soon! However, you can build Neutralinojs binaries from the source on almost all desktop operating systems and CPU architectures out there. If you need Neutralinojs binaries for non-x64 CPU, learn how to build Neutralinojs from source with this guide. ","version":"Next","tagName":"h2"},{"title":"Neutralino.clipboard","type":0,"sectionRef":"#","url":"/docs/api/clipboard","content":"","keywords":"","version":"Next"},{"title":"clipboard.getFormat()​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardgetformat","content":" Returns the current data format of the system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#return-string-awaited","content":" Clipboard format: text, image, or unknown. let format = await Neutralino.clipboard.getFormat(); console.log(`Format: ${format}`); ","version":"Next","tagName":"h3"},{"title":"clipboard.writeText(text)​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardwritetexttext","content":" Writes text into the system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#parameters","content":" text String: Text to store into the system clipboard. await Neutralino.clipboard.writeText('Test value'); ","version":"Next","tagName":"h3"},{"title":"clipboard.writeImage(image)​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardwriteimageimage","content":" Writes image into the system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Input Object: ClipboardImage​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#input-object-clipboardimage","content":" width: Number: Image width.height: Number: Image height.bpp: Number: Bits per pixel (BPP).bpr: Number: Bytes Per Row (BPR).redMask: Number: Red mask.greenMask: Number: Green mask.blueMask: Number: Blue mask.redShift: Number: Red shift.greeShift: Number: Green shift.blueShift: Number: Blue shift.data: ArrayBuffer: Raw RGBA binary data of the image in an array buffer. let image = prepareClipboardImage(); await Neutralino.clipboard.writeImage(image); ","version":"Next","tagName":"h3"},{"title":"clipboard.readText()​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardreadtext","content":" Reads and returns text from system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#return-string-awaited-1","content":" Stored text from the system clipboard. let clipboardText = await Neutralino.clipboard.readText(); console.log(`Text: ${clipboardText}`); ","version":"Next","tagName":"h3"},{"title":"clipboard.readImage()​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardreadimage","content":" Reads and returns an image from system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#return-object-awaited","content":" Returns ClipboardImage object that has the same properties as in the writeImage() function. let clipboardImage = await Neutralino.clipboard.readImage(); console.log(`Image: ${clipboardImage}`); ","version":"Next","tagName":"h3"},{"title":"Neutralino.custom","type":0,"sectionRef":"#","url":"/docs/api/custom","content":"","keywords":"","version":"Next"},{"title":"custom.getMethods()​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#customgetmethods","content":" Returns all custom methods added by the app developer. ","version":"Next","tagName":"h2"},{"title":"Return Array (awaited):​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#return-array-awaited","content":" A string array of all custom method identifiers. let methods = await Neutralino.custom.getMethods(); console.log(methods); ","version":"Next","tagName":"h3"},{"title":"custom.add(num1, num2, options)​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#customaddnum1-num2-options","content":" info This is a sample method and official Neutralinojs framework builds don't include this method by default. So, you have to download the Neutralinojs framework source code and uncomment the add method in thecustom namespace androuter.cpp. This method returns the sum of two numbers for demonstration purposes of custom methods. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#parameters","content":" num1 Number: The first number for the summation process.num2 Number: The second number for the summation process. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#options","content":" addExtraFive Boolean: Adds extra five to the numerical result.addExtraTen Boolean: Adds extra ten to the numerical result. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#return-number-awaited","content":" The sum of input numerical parameters with extra value additions based on options. let sum; sum = await Neutralino.custom.add(10, 10); // 20 sum = await Neutralino.custom.add(1, 1, { addExtraFive: true, addExtraTen: true }); // 17 Check the add method implementation and learn how to capture, validate, and process parameters in C++. For compiling your Neutralinojs fork, you can use the existingGitHub Actions workflows. ","version":"Next","tagName":"h3"},{"title":"Neutralino.computer","type":0,"sectionRef":"#","url":"/docs/api/computer","content":"","keywords":"","version":"Next"},{"title":"computer.getMemoryInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetmemoryinfo","content":" Returns system memory statistics in bytes. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited","content":" physical Object: Physical memory information. total Number: Total physical memory.available Number: Available physical memory. virtual Object: Virtual memory information. total Number: Total virtual memory.available Number: Available virtual memory. let memoryInfo = await Neutralino.computer.getMemoryInfo(); console.log(`RAM size: ${memoryInfo.physical.total}B`); ","version":"Next","tagName":"h3"},{"title":"computer.getArch()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetarch","content":" Returns the CPU architecture identifier: x64 (x86 64bit/arm64), ia32 (x86 32bit), arm, itanium, or unknown. ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-string-awaited","content":" CPU architecture. let arch = await Neutralino.computer.getArch(); console.log(arch); ","version":"Next","tagName":"h3"},{"title":"computer.getKernelInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetkernelinfo","content":" Returns operating system kernel information. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-1","content":" variant String: Kernel type: Linux, Darwin, Windows NT, or Unknown.version String: Version in the <major>.<minor>.<patch>-<build_number> format. let kernelInfo = await Neutralino.computer.getKernelInfo(); console.log(`Kernel: ${kernelInfo.variant}`); ","version":"Next","tagName":"h3"},{"title":"computer.getOSInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetosinfo","content":" Returns operating system information. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-2","content":" name String: Operating system name.description String: Operating system description.version String: Version in the <major>.<minor>.<patch>-<build_number> format. let osInfo = await Neutralino.computer.getOSInfo(); console.log(`OS: ${osInfo.name}`); ","version":"Next","tagName":"h3"},{"title":"computer.getCPUInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetcpuinfo","content":" Returns the CPU information. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-3","content":" vendor String: Vendor name.model String: Model name.frequency Number: The current CPU frequency in hertz (Hz).architecture String: CPU architecture name. Returns the same value as the getArch function.logicalThreads Number: Number of logical threads in the parallelism model.physicalCores Number: Number of physical cores in the CPU.physicalUnits Number: Number of physical CPU hardware units in the motherboard. let cpuInfo = await Neutralino.computer.getCPUInfo(); console.log(`CPU model: ${cpuInfo.model}`); ","version":"Next","tagName":"h3"},{"title":"computer.getDisplays()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetdisplays","content":" Returns information about all connected displays. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-4","content":" An array of Display objects. ","version":"Next","tagName":"h3"},{"title":"Display​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#display","content":" id Number: A virtual display identifier.resolution Object: Display resolution information. width Number: Display width.height Number: Display height. dpi Number: DPI (Dots Per Inch) value.bpp Number: BPP (Bits Per Pixel) value (also known as the color depth).refreshRate Number: Refresh rate in hertz (Hz). let displays = await Neutralino.computer.getDisplays(); for(let display of displays) { console.log(display); } ","version":"Next","tagName":"h3"},{"title":"computer.getMousePosition()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetmouseposition","content":" Returns the current mouse cursor position. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-5","content":" x Number: Distance from the left edge of the screen in pixels.y Number: Distance from the top edge of the screen in pixels. let pos = await Neutralino.computer.getMousePosition(); console.log(`Pos: ${pos.x}, ${pos.y}`); ","version":"Next","tagName":"h3"},{"title":"Neutralino.extensions","type":0,"sectionRef":"#","url":"/docs/api/extensions","content":"","keywords":"","version":"Next"},{"title":"extensions.dispatch(extensionId, eventName, data)​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#extensionsdispatchextensionid-eventname-data","content":" Dispatches a new event to an extension instance. If the targeted extension is not connected yet, Neutralino client library will queue the function call and send whenever the extension comes online. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#parameters","content":" extensionId String: Extension identifier.eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.extensions.dispatch('js.neutralino.sampleextension', 'myTestEvent', {myData: 'Test data'}); await Neutralino.extensions.dispatch('js.neutralino.sampleextension', 'myTestEvent'); ","version":"Next","tagName":"h3"},{"title":"extensions.broadcast(eventName, data)​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#extensionsbroadcasteventname-data","content":" Dispatches a new event to all connected extensions. If an extension is loaded but not connected yet, the particular extension won't get the new event. Use extensions.dispatchto send messages even if the extension is not connected to the main process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#parameters-1","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.extensions.broadcast('myTestEvent', 'Hello'); await Neutralino.extensions.broadcast('myTestEvent', {myData: 'Test data'}); await Neutralino.extensions.broadcast('myTestEvent'); ","version":"Next","tagName":"h3"},{"title":"extensions.getStats()​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#extensionsgetstats","content":" Returns details about connected and loaded extensions. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#return-object-awaited","content":" loaded String[]: An array of loaded extensions.connected String[]: An array of connected extensions. These extensions have an active WebSocket-based IPC connection with the main process. let stats = await Neutralino.extensions.getStats(); console.log('stats: ', stats); ","version":"Next","tagName":"h3"},{"title":"Neutralino.events","type":0,"sectionRef":"#","url":"/docs/api/events","content":"","keywords":"","version":"Next"},{"title":"Event types​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#event-types","content":" Event id\tDescription\tAvailable modes\tAdditional dataready\tOccurs when the client library connects with the Neutralino server.\tall\tnull trayMenuItemClicked\tOccurs when the user clicks on a tray menu item.\tall\tTrayMenuItem windowClose\tOccurs when the user closes the window.\twindow\tnull windowFocus\tOccurs when the window gets focused.\twindow\tnull windowBlur\tOccurs when the window focus state is gone.\twindow\tnull serverOffline\tOccurs when the Neutralino server is offline\tall\tnull clientConnect\tOccurs when a new client access the application.\tall\tTotal clients clientDisconnect\tOccurs when a connected client leaves the application.\tall\tTotal clients appClientConnect\tOccurs when a new application instance starts.\tall\tTotal app clients appClientDisconnect\tOccurs when an application instance ends.\tall\tTotal app clients extClientConnect\tOccurs when a new extension connects.\tall\tExtension identifier extClientDisconnect\tOccurs when an extension disconnects.\tall\tExtension identifer extensionReady\tOccurs when an extension is ready to communicate with the app.\tall\tExtension identifier spawnedProcess\tOccurs then there is an update in the spawned process.\tall\tSpawnedProcess with action (stdOut, stdErr, and exit) and data (STDOUT, STDERR or exit code) openedFile\tOccurs for each read action and whenever stream cursor reaches EOF.\tall\tFile stream identifier with action (data, dataBinary, and end) and data (stream block content) watchFile\tOccurs for each filesystem change events based on watchers.\tall\tFile watcher identifier with action (add, delete, modified, and moved), dir, and filename ","version":"Next","tagName":"h2"},{"title":"events.on(eventName, handler)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsoneventname-handler","content":" Registers a new event handler.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters","content":" eventName String: Name of the event.handler Function: A function that will be called when the given event occurs. Neutralinojs will call the handler with aCustomEvent instance by attaching additional data to the detail key. function onTrayMenuItemClicked(event) { console.log(`Event data: ${event.detail}`); } await Neutralino.events.on('trayMenuItemClicked', onTrayMenuItemClicked); ","version":"Next","tagName":"h3"},{"title":"events.off(eventName, handler)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsoffeventname-handler","content":" Unregisters an event handler.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters-1","content":" eventName String: Name of the event.handler Function: A function reference. await Neutralino.events.off('trayMenuItemClicked', onTrayMenuItemClicked); ","version":"Next","tagName":"h3"},{"title":"events.dispatch(eventName, data)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsdispatcheventname-data","content":" Dispatches a new event to the current app instance. Neutralinojs client uses this JavaScript function call internally to dispatch native events.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters-2","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.events.dispatch('myTestEvent', {myData: 'Test data'}); ","version":"Next","tagName":"h3"},{"title":"events.broadcast(eventName, data)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsbroadcasteventname-data","content":" Dispatches a new event to all clients (both app and extension clients). ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters-3","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.events.broadcast('myTestEvent', 'Hello'); await Neutralino.events.broadcast('myTestEvent', {myData: 'Test data'}); await Neutralino.events.broadcast('myTestEvent'); // without any data payload ","version":"Next","tagName":"h3"},{"title":"Neutralino.debug","type":0,"sectionRef":"#","url":"/docs/api/debug","content":"","keywords":"","version":"Next"},{"title":"debug.log(message, type)​","type":1,"pageTitle":"Neutralino.debug","url":"/docs/api/debug#debuglogmessage-type","content":" Writes messages to neutralinojs.log file or/and standard output streams.  tip If your application is running via neu run, you can see log messages on your terminal. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.debug","url":"/docs/api/debug#parameters","content":" message String: Content to be logged.type String (optional): Type of the message. Accepted values are INFO, WARNING, and ERROR. The default value is INFO. await Neutralino.debug.log('Hello Neutralinojs'); await Neutralino.debug.log('An error occured', 'ERROR'); await Neutralino.debug.log('A warning message', 'WARNING'); ","version":"Next","tagName":"h3"},{"title":"Error Codes","type":0,"sectionRef":"#","url":"/docs/api/error-codes","content":"","keywords":"","version":"Next"},{"title":"Native API error codes​","type":1,"pageTitle":"Error Codes","url":"/docs/api/error-codes#native-api-error-codes","content":" Error code\tMessage\tThrown byNE_FS_DIRCRER\tUnable to create directory.\tos.createDirectory NE_FS_REMVERR\tUnable to remove path.\tos.remove NE_OS_TRAYIER\tUnable to initialize the tray menu. This error is typically thrown when GNU/Linux systems don't contain an app indicator library.\tos.setTray NE_FS_FILRDER\tFile read error.\tfilesystem.readFile, filesystem.readBinaryFile NE_FS_FILWRER\tFile write error.\tfilesystem.writeFile, filesystem.writeBinaryFile NE_FS_FILOPER\tFile open error.\tfilesystem.openFile NE_FS_UNLTOUP\tUnable to update opened file id.\tfilesystem.updateOpenedFile NE_FS_UNLTFOP\tUnable to find opened file id.\tfilesystem.getOpenedFileInfo NE_FS_NOPATHE\tNo file or directory.\tfilesystem.getStats, filesystem.readDirectory NE_FS_COPYERR\tCopy error.\tfilesystem.copy NE_FS_MOVEERR\tMove error.\tfilesystem.move NE_FS_UNLCWAT\tUnable to create watcher.\tfilesystem.createWatcher NE_FS_NOWATID\tUnable to find watcher.\tfilesystem.removeWatcher NE_OS_UNLTOUP\tUnable to update the spawned process due to an invalid process identifier or action.\tos.updateSpawnedProcess NE_OS_INVMSGA\tInvalid message box arguments.\tos.showMessageBox NE_OS_INVKNPT\tInvalid platform path name.\tos.getPath NE_ST_INVSTKY\tInvalid storage key.\tstorage.getData, storage.setData NE_ST_STKEYWE\tStorage write error.\tstorage.setData NE_RT_INVTOKN\tInvalid access token.\tall NE_RT_NATPRME\tNo permission to execute the provided native method.\tall, NE_RT_APIPRME\tNo permission to use the native API.\tall NE_RT_NATRTER\tNative method runtime error. Mostly occured due to missing parameters.\tall NE_RT_NATNTIM\tNative method is not implemented.\tinternal NE_CL_NSEROFF\tNeutralino server is not reachable.\tall NE_EX_EXTNOTC\tExtension is not connected yet\textensions.dispatch NE_UP_CUPDMER\tInvalid update manifest or mismatching applicationId\tupdater.checkForUpdates NE_UP_CUPDERR\tUnable to fetch update manifest\tupdater.checkForUpdates NE_UP_UPDNOUF\tNo update manifest loaded\tupdater.install NE_UP_UPDINER\tUpdate installation error\tupdater.install ","version":"Next","tagName":"h2"},{"title":"Neutralino.init","type":0,"sectionRef":"#","url":"/docs/api/init","content":"","keywords":"","version":"Next"},{"title":"init()​","type":1,"pageTitle":"Neutralino.init","url":"/docs/api/init#init","content":" The application developer needs to call this method explicitly via a JavaScript source file before using any native API function. The init function does the following tasks when it's called. Starts a WebSocket connection with the Neutralinojs server asynchronously.Registers auto-reload event handler if the --neu-dev-auto-reload flag (the neu run command sets this flag) is provided.Defines NL_CVERSION with the client libary version in the window scope. You can call native API calls right after the init function call, as shown below. Neutralino.init(); Neutralino.os.showMessageBox('Welcome', 'Hello Neutralinojs'); Also, you can wrap immediate native calls with the ready event callback if you like. Neutralino.init(); Neutralino.events.on('ready', () => { Neutralino.os.showMessageBox('Welcome', 'Hello Neutralinojs'); }); info Neutralinojs client library typically queues and sends native API calls to the server when the WebSocket connection is established. Therefore, you don't need to use the ready event callback always. ","version":"Next","tagName":"h2"},{"title":"Global Variables","type":0,"sectionRef":"#","url":"/docs/api/global-variables","content":"","keywords":"","version":"Next"},{"title":"Predefined global variables​","type":1,"pageTitle":"Global Variables","url":"/docs/api/global-variables#predefined-global-variables","content":" Variable\tDescriptionNL_OS\tOperating system name: Linux, Windows, or Darwin NL_ARCH\tCPU architecture: x64, arm, itanium, ia32, or unknown NL_APPID\tApplication identifier NL_APPVERSION\tApplication version NL_PORT\tApplication port NL_MODE\tMode of the application: window, browser, cloud, or chrome NL_VERSION\tNeutralinojs framework version NL_CVERSION\tNeutralinojs client version NL_CWD\tCurrent working directory NL_PATH\tApplication path NL_ARGS\tCommand-line arguments NL_PID\tIdentifier of the current process NL_RESMODE\tSource of application resources: bundle or directory NL_EXTENABLED\tReturns true if extensions are enabled NL_COMMIT\tFramework binary's release commit hash NL_CCOMMIT\tClient librar's release commit hash NL_CMETHODS\tCustom method identifiers (Returns the same output that custom.getMethods returns). NL_WSAVSTLOADED\tReturns true if the initial window state was loaded from the saved configuration tip You can use NL_COMMIT and NL_CCOMMIT values to identify the codebase snapshot if you use nightly releases. ","version":"Next","tagName":"h2"},{"title":"Custom global variables​","type":1,"pageTitle":"Global Variables","url":"/docs/api/global-variables#custom-global-variables","content":" You can make custom global variables too via neutralino.config.json, as shown below. "globalVariables": { "TEST": "Test Value" } The above custom global variable's value can be accessed with NL_TEST. You can set any data type for custom global variables. Look at the following examples. "globalVariables": { "TEST_1": 1, "TEST_2": null, "TEST_3": 3.5, "TEST_4": [3, 5, 4, 5], "TEST_5": { "key": "value", "anotherKey": 100 } } Avoid overriding predefined global variables. ","version":"Next","tagName":"h2"},{"title":"Native API Overview","type":0,"sectionRef":"#","url":"/docs/api/overview","content":"","keywords":"","version":"Next"},{"title":"Native API namespaces​","type":1,"pageTitle":"Native API Overview","url":"/docs/api/overview#native-api-namespaces","content":" Neutralino.appNeutralino.clipboardNeutralino.computerNeutralino.customNeutralino.debugNeutralino.eventsNeutralino.extensionsNeutralino.filesystemNeutralino.initNeutralino.osNeutralino.storageNeutralino.updaterNeutralino.window ","version":"Next","tagName":"h2"},{"title":"Neutralino.updater","type":0,"sectionRef":"#","url":"/docs/api/updater","content":"","keywords":"","version":"Next"},{"title":"updater.checkForUpdates(url)​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#updatercheckforupdatesurl","content":" Checks latest updates from the given URL. The URL should return a valid Neutralinojs update manifest withContent-Type: application/json header. Throws NE_UP_CUPDMER for invalid manifests and NE_UP_CUPDERRfor network connectivity issues. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#parameters","content":" url String: URL to fetch update manifest. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#return-object-awaited","content":" Update manifest. let url = 'https://example.com/updates/manifest.json'; let manifest = await Neutralino.updater.checkForUpdates(url); ","version":"Next","tagName":"h3"},{"title":"updater.install()​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#updaterinstall","content":" Installs updates from the downloaded update manifest. Throws NE_UP_UPDNOUF if the manifest isn't loaded. If the update installation process fails, this function will throw NE_UP_UPDINER. let url = 'https://example.com/updates/manifest.json'; let manifest = await Neutralino.updater.checkForUpdates(url); if(manifest.version != NL_APPVERSION) { await Neutralino.updater.install(); } else { console.log('You are using the latest version!'); } ","version":"Next","tagName":"h2"},{"title":"Neutralino.storage","type":0,"sectionRef":"#","url":"/docs/api/storage","content":"","keywords":"","version":"Next"},{"title":"storage.setData(key, data)​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#storagesetdatakey-data","content":" Writes data into Neutralinojs shared storage.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#parameters","content":" key String: A unique identifier.data Object (optional): Data as a string. If this value is null or undefined, the specific data record will be erased from the disk. await Neutralino.storage.setData('userDetails', JSON.stringify({ username: 'TestValue'}) ); ","version":"Next","tagName":"h3"},{"title":"storage.getData(key)​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#storagegetdatakey","content":" Reads and returns data for a given Neutralinojs shared storage key.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#parameters-1","content":" key String: Storage data record identifier. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#return-string-awaited","content":" Data string of the storage record. let data = await Neutralino.storage.getData('userDetails'); console.log(`Data: ${data}`); ","version":"Next","tagName":"h3"},{"title":"storage.getKeys()​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#storagegetkeys","content":" Returns all storage keys. ","version":"Next","tagName":"h2"},{"title":"Return Array (awaited):​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#return-array-awaited","content":" A string array of existing storage keys. let keys = await Neutralino.storage.getKeys(); console.log('Keys: ', keys); ","version":"Next","tagName":"h3"},{"title":"Internal CLI Arguments","type":0,"sectionRef":"#","url":"/docs/cli/internal-cli-arguments","content":"","keywords":"","version":"Next"},{"title":"General​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#general","content":" ","version":"Next","tagName":"h2"},{"title":"--load-dir-res​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--load-dir-res","content":" Notifies Neutralinojs server to fetch files from the resources directory. If this flag is not provided, Neutralinojs server will load resources from the resources.neu file. tip If Neutralinojs fails to load resources resources.neu, this flag is automatically enabled internally to find resources from the app directory. Therefore, you can double click on the binary instead of neu run while developing apps. ","version":"Next","tagName":"h3"},{"title":"--config-file=<filename>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--config-filefilename","content":" Uses a custom configuration file instead of the default neutralino.config.json file for loading the app configuration JSON. This CLI option is helpful for setting a development-only configuration file (i.e., --config-file=neutralino-dev.config.json). info The neu build command won't typically include custom configuration files for the final application bundle — it only embeds the defaultneutralino.config.json file allowing you to store production app configuration. ","version":"Next","tagName":"h3"},{"title":"--path=<path>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--pathpath","content":" Overrides the resources path with a relative path or absolute path. This will change the NL_PATH global variable. ","version":"Next","tagName":"h3"},{"title":"--mode=<mode>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--modemode","content":" Overrides the default mode. Accepted values are: window, browser, and cloud. ","version":"Next","tagName":"h3"},{"title":"--neu-dev-auto-reload​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--neu-dev-auto-reload","content":" Listens to the neuDev_reloadApp event. When this CLI argument is provided, each modification done to the resources will automatically reload the application. The neu run command executes Neutralinojs with this flag by default. --neu-dev- is a reserved CLI argument prefix for Neutralinojs process. Therefore, avoid adding custom arguments with --neu-dev- prefix. Feel free to use the --dev- prefix for your development-related CLI flags. ","version":"Next","tagName":"h3"},{"title":"--neu-dev-extension​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--neu-dev-extension","content":" Loads js.neutralino.devtools extension internally for development purposes. The neu CLI uses this CLI argument to establish an IPC with the application process. This option only works if application resources are loaded from a directory (won't work for end-users). ","version":"Next","tagName":"h3"},{"title":"--url=<url>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--urlurl","content":" Overrides the URL on the application. ","version":"Next","tagName":"h3"},{"title":"--document-root=<url>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--document-rooturl","content":" Overrides the document root of the static server. ","version":"Next","tagName":"h3"},{"title":"--port=<port>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--portport","content":" Overrides the application port and will change the NL_PORT global variable. If 0 is given, Neutralino will use a random available port. ","version":"Next","tagName":"h3"},{"title":"--logging-enabled=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--logging-enabledtruefalse","content":" Overrides the logging feature status. ","version":"Next","tagName":"h3"},{"title":"--logging-write-to-log-file=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--logging-write-to-log-filetruefalse","content":" Overrides the log file feature status. ","version":"Next","tagName":"h3"},{"title":"--export-auth-info=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--export-auth-infotruefalse","content":" Overrides auth details export setting. ","version":"Next","tagName":"h3"},{"title":"--enable-extensions=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--enable-extensionstruefalse","content":" Overrides extensions feature's availability. ","version":"Next","tagName":"h3"},{"title":"--enable-server=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--enable-servertruefalse","content":" Enables or disables the background server (Disables static file servering feature and native API messaging). If you load a remote URL to the webview, you can set this option to true. ","version":"Next","tagName":"h3"},{"title":"--enable-native-api=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--enable-native-apitruefalse","content":" Overrides the primary native API execution permission. ","version":"Next","tagName":"h3"},{"title":"--single-page-serve=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--single-page-servetruefalse","content":" Overrides the single page serving option. ","version":"Next","tagName":"h3"},{"title":"Window mode​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#window-mode","content":" The following CLI arguments are used when the application runs with the window mode. ","version":"Next","tagName":"h2"},{"title":"--window-title=<title>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-titletitle","content":" Overrides the window title. ","version":"Next","tagName":"h3"},{"title":"--window-icon=<icon_path>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-iconicon_path","content":" Overrides the window icon. ","version":"Next","tagName":"h3"},{"title":"--window-full-screen=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-full-screentruefalse","content":" Overrides the window's initial full screen status. ","version":"Next","tagName":"h3"},{"title":"--window-always-on-top=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-always-on-toptruefalse","content":" Overrides the window's initial top-most mode. ","version":"Next","tagName":"h3"},{"title":"--window-borderless=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-borderlesstruefalse","content":" Overrides the window's borderless mode. ","version":"Next","tagName":"h3"},{"title":"--window-maximize=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-maximizetruefalse","content":" Overrides the window's initial maximize status. ","version":"Next","tagName":"h3"},{"title":"--window-hidden=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-hiddentruefalse","content":" Overrides the window's initial visibility status. ","version":"Next","tagName":"h3"},{"title":"--window-maximizable=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-maximizabletruefalse","content":" Overrides the window's initial maximizable status. ","version":"Next","tagName":"h3"},{"title":"--window-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-widthnumber","content":" Overrides the window width. ","version":"Next","tagName":"h3"},{"title":"--window-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-heightnumber","content":" Overrides the window height. ","version":"Next","tagName":"h3"},{"title":"--window-min-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-min-widthnumber","content":" Overrides the window's minimum width. ","version":"Next","tagName":"h3"},{"title":"--window-min-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-min-heightnumber","content":" Overrides the window's minimum height. ","version":"Next","tagName":"h3"},{"title":"--window-max-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-max-widthnumber","content":" Overrides the window's maximum width. ","version":"Next","tagName":"h3"},{"title":"--window-max-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-max-heightnumber","content":" Overrides the window's maximum height. ","version":"Next","tagName":"h3"},{"title":"--window-x=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-xnumber","content":" Overrides the window left (x) position. ","version":"Next","tagName":"h3"},{"title":"--window-y=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-ynumber","content":" Overrides the window top (y) position. ","version":"Next","tagName":"h3"},{"title":"--window-center=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-centertruefalse","content":" Overrides the window's initial center positioning setup. ","version":"Next","tagName":"h3"},{"title":"--window-transparent=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-transparenttruefalse","content":" Overrides the window transparency mode. ","version":"Next","tagName":"h3"},{"title":"--window-resizable=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-resizabletruefalse","content":" Overrides the window's initial resizability status. ","version":"Next","tagName":"h3"},{"title":"--window-exit-process-on-close=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-exit-process-on-closetruefalse","content":" Overrides the close button's behavior. ","version":"Next","tagName":"h3"},{"title":"--window-enable-inspector=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-enable-inspectortruefalse","content":" Automatically opens the developer tools window. ","version":"Next","tagName":"h3"},{"title":"--window-use-saved-state=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-use-saved-statetruefalse","content":" Overrides the saved window state feature setting. ","version":"Next","tagName":"h3"},{"title":"--window-extend-user-agent-with=<suffix>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-extend-user-agent-withsuffix","content":" Overrides the custom user agent setting. ","version":"Next","tagName":"h3"},{"title":"Chrome mode​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#chrome-mode","content":" The following CLI arguments are used when the application runs with the chrome mode. ","version":"Next","tagName":"h2"},{"title":"--chrome-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--chrome-widthnumber","content":" Chrome window's width. ","version":"Next","tagName":"h3"},{"title":"--chrome-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--chrome-heightnumber","content":" Chrome window's height. ","version":"Next","tagName":"h3"},{"title":"--chrome-args=<arg_list>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--chrome-argsarg_list","content":" Additional arguments for the Chrome process. Read more about chrome mode from here tip The right hand value is optional for the for boolean type CLI arguments. Therefore, you can use --window-full-screeninstead of --window-full-screen=true. However, if you define window.fullScreen as true and you need to override it asfalse you have to use --window-full-screen=false. ","version":"Next","tagName":"h3"},{"title":"Neutralino.filesystem","type":0,"sectionRef":"#","url":"/docs/api/filesystem","content":"","keywords":"","version":"Next"},{"title":"filesystem.createDirectory(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemcreatedirectorypath","content":" Creates a directory or multiple directories recursively. Throws NE_FS_DIRCRER if directory creation is not possible. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters","content":" path String: New directory path. await Neutralino.filesystem.createDirectory('./newDirectory'); await Neutralino.filesystem.createDirectory(NL_PATH + '/myFolder/api/fs'); ","version":"Next","tagName":"h3"},{"title":"filesystem.remove(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemremovepath","content":" Removes a directory or file. If the given path is a directory, this function recursively removes all contents of the specific directory. Throws NE_FS_REMVERR if the removal is not possible. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-1","content":" path String: Directory or file path. await Neutralino.filesystem.remove('./tmpDirectory'); await Neutralino.filesystem.remove('./tmpFile.txt'); ","version":"Next","tagName":"h3"},{"title":"filesystem.writeFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemwritefilefilename-data","content":" Writes a text file. Throws NE_FS_FILWRER for file write errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-2","content":" filename String: Filename.data String: Content of the file. await Neutralino.filesystem.writeFile('./myFile.txt', 'Sample content'); ","version":"Next","tagName":"h3"},{"title":"filesystem.appendFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemappendfilefilename-data","content":" Appends text content to file. Throws NE_FS_FILWRER for file write errors. If the provided file doesn't exist, this function creates a new file with data. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-3","content":" filename String: Filename.data String: Content to append. await Neutralino.filesystem.appendFile('./myFile.txt', 'Sample '); await Neutralino.filesystem.appendFile('./myFile.txt', 'content'); ","version":"Next","tagName":"h3"},{"title":"filesystem.writeBinaryFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemwritebinaryfilefilename-data","content":" Writes a binary file. Throws NE_FS_FILWRER for file write errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-4","content":" filename String: Filename.data ArrayBuffer: Content of the binary file as anArrayBuffer. let rawBin = new ArrayBuffer(1); let view = new Uint8Array(rawBin); view[0] = 64; // Saves ASCII '@' to the binary file await Neutralino.filesystem.writeBinaryFile('./myFile.bin', rawBin); ","version":"Next","tagName":"h3"},{"title":"filesystem.appendBinaryFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemappendbinaryfilefilename-data","content":" Appends binary data to a file. Throws NE_FS_FILWRER for file write errors. If the provided file doesn't exist, this function creates a new file with data. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-5","content":" filename String: Filename.data ArrayBuffer: Binary content to append as anArrayBuffer. let rawBin = new ArrayBuffer(1); let view = new Uint8Array(rawBin); view[0] = 64; // Saves ASCII '@' to the binary file await Neutralino.filesystem.appendBinaryFile('./myFile.bin', rawBin); await Neutralino.filesystem.appendBinaryFile('./myFile.bin', rawBin); ","version":"Next","tagName":"h3"},{"title":"filesystem.readFile(filename)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemreadfilefilename","content":" Reads a text file. Throws NE_FS_FILRDER for file read errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-6","content":" filename String: Filename.pos Number (optional): File cursor position in bytes.size Number (optional): File reader buffer size in bytes. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-string-awaited","content":" File content. let data = await Neutralino.filesystem.readFile('./myFile.txt'); console.log(`Content: ${data}`); let data = await Neutralino.filesystem.readFile('./myFile.txt', { pos: 2, size: 10 }); console.log(`Content: ${data}`); ","version":"Next","tagName":"h3"},{"title":"filesystem.readBinaryFile(filename)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemreadbinaryfilefilename","content":" Reads binary files. Throws NE_FS_FILRDER for file read errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-7","content":" filename String: Filename.pos Number (optional): File cursor position in bytes.size Number (optional): File reader buffer size in bytes. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited","content":" Content of the binary file as anArrayBuffer. let data = await Neutralino.filesystem.readBinaryFile({ fileName: './myFile.bin' }); let view = new Uint8Array(data); console.log('Binary content: ', view); ","version":"Next","tagName":"h3"},{"title":"filesystem.openFile(filename)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemopenfilefilename","content":" Creates a readable file stream. Throws NE_FS_FILOPER for file open errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-8","content":" filename String: Filename. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-number-awaited","content":" File stream identifier. let fileId = await Neutralino.filesystem.openFile('./myFile.txt'); console.log(`ID: ${fileId}`); ","version":"Next","tagName":"h3"},{"title":"filesystem.updateOpenedFile(id, action, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemupdateopenedfileid-action-data","content":" Invokes file stream actions. Throws NE_FS_UNLTOUP if the framework can't update the stream. Call this method to read and seek an opened file (aka a readable stream). ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-9","content":" id Number: File stream identifier.action String: An action to take. Accepts only the following values: read: Reads a bytes segment from the file stream.readBinary: Behaves the same as read but uses the binary read mode.readAll: Triggers the read action until file stream cursor position reachesEOF.readAllBinary: Behaves the same as readAll but uses the binary read mode.seek: Sets the file cursor position.close: Closes and frees file handler resources. data Object (optional): Additional data for the action. Send the buffer size in bytes (default: 256 bytes) if the action is read, readBinary, readAll, or readAllBinary. Send the file stream cursor position if the action is seek. let fileId = await Neutralino.filesystem.openFile('./myFile.txt'); let content = ''; Neutralino.events.on('openedFile', (evt) => { if(evt.detail.id == fileId) { switch(evt.detail.action) { case 'data': content += evt.detail.data; break; case 'end': console.log(content); break; } } }); // Sets the file stream cursor to 10th byte await Neutralino.filesystem.updateOpenedFile(fileId, 'seek', 10); // Reads 2 bytes from the cursor position await Neutralino.filesystem.updateOpenedFile(fileId, 'read', 2); // Reads the next bytes until the cursor reaches EOF (buffer size: 2) await Neutralino.filesystem.updateOpenedFile(fileId, 'readAll', 2); ","version":"Next","tagName":"h3"},{"title":"filesystem.getOpenedFileInfo(id)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetopenedfileinfoid","content":" Returns file stream details. Throws NE_FS_UNLTFOP if the file stream identifier is not valid. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-10","content":" id Number: File stream identifier. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-1","content":" id Number: File stream identifier.eof Boolean: Becomes true if the stream reached EOF.pos Number: File stream cursor position.lastRead Number: Last read bytes. let info = await Neutralino.filesystem.getOpenedFileInfo(0); console.log(info); ","version":"Next","tagName":"h3"},{"title":"filesystem.createWatcher(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemcreatewatcherpath","content":" Creates a filesystem watcher. Throws NE_FS_UNLCWAT for watcher creation failures. If there is an existing active watcher for the given path, this function returns the existing watcher identifier. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-11","content":" path String: Directory path. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-number-awaited-1","content":" File watcher identifier. let watcherId = await Neutralino.filesystem.createWatcher(NL_PATH); Neutralino.events.on('watchFile', (evt) => { if(watcherId == evt.detail.id) { console.log(evt.detail); } }); console.log(`ID: ${watcherId}`); ","version":"Next","tagName":"h3"},{"title":"filesystem.removeWatcher(watcherId)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemremovewatcherwatcherid","content":" Removes a filesystem watcher. Throws NE_FS_NOWATID for watcher removal failures. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-12","content":" watcherId Number: File watcher identifier. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-number-awaited-2","content":" File watcher identifier. let watcherId = await Neutralino.filesystem.createWatcher(NL_PATH); console.log(`ID: ${watcherId}`); await Neutralino.filesystem.removeWatcher(watcherId); ","version":"Next","tagName":"h3"},{"title":"filesystem.getWatchers()​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetwatchers","content":" Returns information about created file watchers. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-2","content":" An array of FileWatcher objects. ","version":"Next","tagName":"h3"},{"title":"FileWatcher​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filewatcher","content":" id Number: Watcher identifier.path String: File watcher path. let watchers = await Neutralino.filesystem.getWatchers(); for(let watcher of watchers) { console.log(watcher); } ","version":"Next","tagName":"h3"},{"title":"filesystem.readDirectory(path, options)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemreaddirectorypath-options","content":" Reads directory contents. Throws NE_FS_NOPATHE if the path doesn't exist. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-13","content":" path String: File/directory path. ","version":"Next","tagName":"h3"},{"title":"options​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#options","content":" recursive Boolean: Read sub-directories recursively. The default value is false. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-3","content":" An array of DirectoryEntry objects. ","version":"Next","tagName":"h3"},{"title":"DirectoryEntry​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#directoryentry","content":" entry String: file name.type String: The type of the entry (FILE or DIRECTORY). let entries = await Neutralino.filesystem.readDirectory(NL_PATH); console.log('Content: ', entries); ","version":"Next","tagName":"h3"},{"title":"filesystem.copy(source, destination)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemcopysource-destination","content":" Copies a file or directory to a new destination. Throws NE_FS_COPYERR if the system cannot copy the path. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-14","content":" source String: Source path.destination String: Destination path. ","version":"Next","tagName":"h3"},{"title":"options​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#options-1","content":" recursive Boolean: Copy sub-directories recursively. The default value is true.overwrite Boolean: Overwrite an existing file with the same name. The default value is true.skip Boolean: Skip an existing file with the same name. The default value is false. await Neutralino.filesystem.copy('./source.txt', './destination.txt'); await Neutralino.filesystem.copy('./myDir', './myDirCopy'); ","version":"Next","tagName":"h3"},{"title":"filesystem.move(source, destination)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemmovesource-destination","content":" Moves a file or directory to a new destination. Throws NE_FS_MOVEERR if the system cannot rename the path. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-15","content":" source String: Source path.destination String: Destination path. await Neutralino.filesystem.move('./source.txt', './destination.txt'); await Neutralino.filesystem.move('./myDir', './myFolder'); ","version":"Next","tagName":"h3"},{"title":"filesystem.getStats(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetstatspath","content":" Returns file statistics for the given path. If the given path doesn't exist or is inaccessible,NE_FS_NOPATHE is thrown. Therefore, you can use this method to check for the existance of a file or directory. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-16","content":" path String: File or directory path. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-4","content":" size Number: Size in bytes.isFile Boolean: true if the path represents a normal file.isDirectory Boolean: true if the path represents a directory.createdAt Number: On Windows, returns Unix milliseconds of the file creation time — On Unix or Unix-like platforms, returns Unix milliseconds of the last inode modification time.modifiedAt Number: Unix milliseconds of the last file modification time. let stats = await Neutralino.filesystem.getStats('./sampleVideo.mp4'); console.log('Stats:', stats); ","version":"Next","tagName":"h3"},{"title":"filesystem.getAbsolutePath(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetabsolutepathpath","content":" Returns the absolute path for a given path. This function works with paths that don't exist on the system. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-17","content":" path String: Path. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-string-awaited-1","content":" Absolute path. let path = await Neutralino.filesystem.getAbsolutePath('./myFolder'); console.log(path); ","version":"Next","tagName":"h3"},{"title":"filesystem.getRelativePath(path, base)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetrelativepathpath-base","content":" Returns the relative path for a given path and base. This function works with paths that don't exist on the system. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-18","content":" path String: Path.base String (optional): Base path that is used for calculating the relative path with the path parameter. NL_CWD is used by default if this parameter is not provided. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-string-awaited-2","content":" Relative path. let path = await Neutralino.filesystem.getRelativePath('./myFolder'); console.log(path); path = await Neutralino.filesystem.getRelativePath('./myFolder', '/home/user'); console.log(path); ","version":"Next","tagName":"h3"},{"title":"filesystem.getPathParts(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetpathpartspath","content":" Parses a given path and returns its parts. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-19","content":" path String: Path. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-5","content":" rootName String: Root path name.rootDirectory String: Root path directory.rootPath String: Root path.relativePath String: Path relative to the root path.parentPath String: Parent path or the directory path without filename.filename String: Filename.extension String: File extension.stem String: Filename segment without extension. let pathParts = await Neutralino.filesystem.getPathParts('./myFolder/myFile.txt'); console.log('Parts:', pathParts); ","version":"Next","tagName":"h3"},{"title":"neu CLI","type":0,"sectionRef":"#","url":"/docs/cli/neu-cli","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#installation","content":" Run the following command on your terminal to install the CLI globally. npm i -g @neutralinojs/neu You can also use neu CLI via npx if you don't want a global installation. npx @neutralinojs/neu <command> ","version":"Next","tagName":"h2"},{"title":"Commands​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#commands","content":" ","version":"Next","tagName":"h2"},{"title":"neu create <binaryName>​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-create-binaryname","content":" Creates a new Neutralinojs app based on a template. Parameters​ <binaryName>: The name of your application's binary file. For example, if you used myapp, the final application binaries will become myapp-<platform>_<arch>. Options​ --template: Sets the application template via GitHub repository identifier with the <account>/<repo> format. The default value is neutralinojs/neutralinojs-minimal ","version":"Next","tagName":"h3"},{"title":"neu build​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-build","content":" This command will create the dist folder. Thereafter, it will produce the binaries for all supported platforms and resources.neu resource file from your application resources. Options​ --release: Creates a portable ZIP file of the application bundle.--copy-storage: Copies the current snapshot of the Neutralinojs storage to the application bundle. ","version":"Next","tagName":"h3"},{"title":"neu run​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-run","content":" Executes the current application (This will execute specific binary depending on your operating system). This command will change execution permissions (using the chmod command) of the binary files on Linux and macOS. Also, it enables auto-reload for the current application. In other words, when a modification happens to application resources, the Neutralinojs application will be reloaded automatically. You can see Neutralinojs process and extensions output streams while the application is running. If you use the cli.frontendLibrarykey in app configuration, the CLI enables both frontend library's development environment and Neutralinojs's development evironment at the same time. This option patches the main HTML file with the Neutralinojs client library global variables to expose the native API to the frontend library's development server. Learn how to setup this feature from this guide. Options​ --disable-auto-reload: Disables the auto-reloading feature.--arch=<arch>: Explicitly set the CPU architecture. This option is helpful if you use a 32-bit Node.js process on a 64-bit computer.-- <process-args>: Sets additional CLI arguments for the Neutralinojs application process. For example you can enable the browser mode by entering neu run -- --mode=browser. See all accepted arguments from here. ","version":"Next","tagName":"h3"},{"title":"neu update​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-update","content":" This command will update the existing Neutralinojs binaries and client library from the internet. You can use the nightly tag for the cli.binaryVersion and cli.clientVersion in the neutralino.config.json file to use experimental daily pre-releases. Options​ --latest: Fetches the latest framework version details via the GitHub API, downloads from official releases , and update the app configuration with fetched version details. warning Nightly builds refers to automatically generated daily builds, so these builds can contain experimental or incomplete features. Therefore, avoid using nightly versions in your production apps. Use nightly versions to try out latest features, but use a stable version for production apps. ","version":"Next","tagName":"h3"},{"title":"neu version​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-version","content":" Prints all version information. If this command is executed from a Neutralinojs application directory, you will see project-specific version details. Otherwise, you will see global version details. ","version":"Next","tagName":"h3"},{"title":"neu plugins [plugin]​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-plugins-plugin","content":" Parameters​ plugin: Plugin identifier. This value is usually the npm package identifer. Options​ --add: Registers a new plugin to neu CLI. neu CLI downloads plugins to the CLI's node_modulesdirectory and loads during the bootstrap process. Plugins can introduce new commands to the CLI.--remove: Unregisters an existing plugin. ","version":"Next","tagName":"h3"},{"title":"Plugins​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#plugins","content":" Neutralinojs app developers are able to write plugins to add their own commands to the neu CLI. You can develop CLI plugins with the folllowing steps. ","version":"Next","tagName":"h2"},{"title":"Developing a plugin​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#developing-a-plugin","content":" neu CLI will register plugins using index.js as an interface. Create a new npm package with index.js and add the following code snippet. // index.js module.exports = { command: 'commandname <action>', register: (command, modules) => { command.option('--option1 --option2') .action((action, command) => { //your logic goes here.. }); } } command is the CLI command string with actions. The register function will be called when plugin is being registered. Also, it has the command object andstandard modules objectas parameters. Please check commander package documentation for more information about commands and callback parameters. ","version":"Next","tagName":"h3"},{"title":"Publishing your plugin​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#publishing-your-plugin","content":" Once you publish your plugin to the npm registry as a public package, anyone will be able to install it using: neu plugins --add <package-name> and it can be removed using: neu plugins --remove <package-name> See the Appify plugin source for further implementation details. ","version":"Next","tagName":"h3"},{"title":"Changelog​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#changelog","content":" Please check the changelog from GitHub. ","version":"Next","tagName":"h2"},{"title":"Neutralino.window","type":0,"sectionRef":"#","url":"/docs/api/window","content":"","keywords":"","version":"Next"},{"title":"window.setTitle(title)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsettitletitle","content":" Sets the title of the native window. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters","content":" title String (optional): Title of the window. Clears the title, if the function was called without the parameter. await Neutralino.window.setTitle('New title'); ","version":"Next","tagName":"h3"},{"title":"window.getTitle()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowgettitle","content":" Returns the title of the native window. ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-string-awaited","content":" The current title of the native window instance. let title = await Neutralino.window.getTitle(); console.log(`title = ${title}`); ","version":"Next","tagName":"h3"},{"title":"window.minimize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowminimize","content":" Minimizes the native window. await Neutralino.window.minimize(); ","version":"Next","tagName":"h2"},{"title":"window.maximize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowmaximize","content":" Maximizes the native window. await Neutralino.window.maximize(); ","version":"Next","tagName":"h2"},{"title":"window.unmaximize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowunmaximize","content":" Restores the native window. await Neutralino.window.unmaximize(); ","version":"Next","tagName":"h2"},{"title":"window.isMaximized()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowismaximized","content":" Returns true if the native window is maximized. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited","content":" true or false based on current maximized status. let status = await Neutralino.window.isMaximized(); ","version":"Next","tagName":"h3"},{"title":"window.setFullScreen()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetfullscreen","content":" Enables the full screen mode. await Neutralino.window.setFullScreen(); ","version":"Next","tagName":"h2"},{"title":"window.exitFullScreen()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowexitfullscreen","content":" Exits from the full screen mode. await Neutralino.window.exitFullScreen(); ","version":"Next","tagName":"h2"},{"title":"window.isFullScreen()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowisfullscreen","content":" Returns true if the native window is in the full screen mode. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-1","content":" true or false based on current full screen status. let status = await Neutralino.window.isFullScreen(); ","version":"Next","tagName":"h3"},{"title":"window.show()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowshow","content":" Shows the native window. await Neutralino.window.show(); ","version":"Next","tagName":"h2"},{"title":"window.hide()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowhide","content":" Hides the native window. await Neutralino.window.hide(); ","version":"Next","tagName":"h2"},{"title":"window.isVisible()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowisvisible","content":" Returns true if the native window is visible. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-2","content":" true or false based on current visibility status. let status = await Neutralino.window.isVisible(); ","version":"Next","tagName":"h3"},{"title":"window.focus()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowfocus","content":" Focuses the native window. await Neutralino.window.focus(); ","version":"Next","tagName":"h2"},{"title":"window.setAlwaysOnTop(onTop)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetalwaysontopontop","content":" Activates or deactivates the always on top mode.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-1","content":" onTop Boolean (optional): Says whether the on top mode should be activated or not. The default value is true. await Neutralino.window.setAlwaysOnTop(true); // or setAlwaysOnTop(); await Neutralino.window.setAlwaysOnTop(false); ","version":"Next","tagName":"h3"},{"title":"window.move(x, y)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowmovex-y","content":" Moves the native window into given coordinates. Neutralinojs's cross-platform coordinate system starts from top-left corner of the screen. In other words, x=0,y=0 point refers to the top-left corner of the device's main screen. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-2","content":" x Number: An integer value for the horizontal position.y Number: An integer value for the vertical position. await Neutralino.window.move(200, 400); ","version":"Next","tagName":"h3"},{"title":"window.center()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowcenter","content":" Centers the native app window within the current display. await Neutralino.window.center(); ","version":"Next","tagName":"h2"},{"title":"window.setIcon(icon)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowseticonicon","content":" Sets an icon for the native window or Dock.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-3","content":" icon String: Path of the icon. A 200x200 PNG image file works fine on all supported operating systems. const icon = '/resources/icons/appIcon.png'; await Neutralino.window.setIcon(icon); ","version":"Next","tagName":"h3"},{"title":"window.setDraggableRegion(domId, options)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetdraggableregiondomid-options","content":" Converts a given DOM element to a draggable region. The user will be able to drag the native window by dragging the given DOM element. This feature is suitable to make custom window bars along with the borderless mode. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-4","content":" domId String | HTMLElement: A DOM element identifier.options DraggableRegionOptions (optional): Customize the behavior of the draggable region. ","version":"Next","tagName":"h3"},{"title":"DraggableRegionOptions​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#draggableregionoptions","content":" alwaysCapture Boolean (optional): If set to true, the region will always capture the pointer, ensuring that dragging is not interrupted when moving the pointer quickly. Note that it prevents child elements from receiving any pointer events. Defaults to false.dragMinDistance Number (optional): The minimum distance between cursor's starting and current position after which dragging is started. This helps prevent accidental dragging while interacting with child elements. Defaults to 10 and is measured in CSS pixels. await Neutralino.window.setDraggableRegion('myCustomTitleBar'); await Neutralino.window.setDraggableRegion('myCustomTitleBar', { alwaysCapture: true, dragMinDistance: 15 }); ","version":"Next","tagName":"h3"},{"title":"window.unsetDraggableRegion(domId)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowunsetdraggableregiondomid","content":" Converts a draggable region to a normal DOM elements by removing drag event handlers. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-5","content":" domId String | HTMLElement: A DOM element identifier. await Neutralino.window.unsetDraggableRegion('myCustomTitleBar'); ","version":"Next","tagName":"h3"},{"title":"window.setSize(Options)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetsizeoptions","content":" This method sets the size of the window. ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#options","content":" width Number (optional): Window width in pixels.height Number (optional): Window height in pixels.minWidth Number (optional): Minimum width of the window in pixels.minHeight Number (optional): Minimum height of the window in pixels.maxWidth Number (optional): Maximum width of the window in pixels.maxHeight Number (optional): Maximum height of the window in pixels.resizable Boolean (optional): A boolean value to make the window resizable or fixed. This method always expects width and height couples. For example, if you are setting minWidth, you should set minHeight too. await Neutralino.window.setSize({ width: 500, height: 200, maxWidth: 600, maxHeight: 400 }); await Neutralino.window.setSize({ resizable: false }); ","version":"Next","tagName":"h3"},{"title":"window.getSize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowgetsize","content":" Returns window size information. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-3","content":" width Number: Window width in pixels.height Number: Window height in pixels.minWidth Number Minimum width of the window in pixels.minHeight Number: Minimum height of the window in pixels.maxWidth Number: Maximum width of the window in pixels.maxHeight Number: Maximum height of the window in pixels.resizable Boolean: Says whether the window resizable or fixed. let sizeInfo = await Neutralino.window.getSize(); console.log(sizeInfo); ","version":"Next","tagName":"h3"},{"title":"window.getPosition()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowgetposition","content":" Returns window position coordinates. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-4","content":" x Number: Horizontal coordinate of the left edge of the window.y Number: Vertical coordinate of the top edge of the window. let position = await Neutralino.window.getPosition(); console.log(position); ","version":"Next","tagName":"h3"},{"title":"window.create(url, WindowOptions)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowcreateurl-windowoptions","content":" Creates a native window. You can use this method to create new window for your multi-window Neutralinojs app. Neutralinojs spawns a new process for each native window. Therefore, the new window works as an isolated app once the window is created. However, you can build communication streams between windows with the storage API. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-6","content":" url String: URL to be loaded. Eg: /resources/aboutWindow.html. Supports loading both local and remote app resources. Local resource paths need to begin with /.options (optional): an instance of WindowOptions type. ","version":"Next","tagName":"h3"},{"title":"WindowOptions​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowoptions","content":" title String: Window title.icon String: Window icon path.fullScreen Boolean: Sets full screen mode.alwaysOnTop Boolean: Activates the top-most mode.enableInspector Boolean: Activates developer tools and opens the web inspector window.borderless Boolean: Makes the window borderless.maximize Boolean: Launches the window maximized.hidden Boolean: Hides the window.maximizable Boolean: Makes the window maximizable or not.exitProcessOnClose Boolean: Exits the application process when the user clicks the window's close button.width Number: Window width.height Number: Window height.x Number: Window x position.y Number: Window y position.minWidth Number: Minimum width of the window.minHeight Number: Minimum height of the window.maxWidth Number: Maximum width of the window.maxHeight Number: Maximum height of the window.processArgs String: Additional command-line arguments for the new window process. Check all supported internal command-line arguments from here. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-object-awaited","content":" pid Number: Process identifier.stdOut String: Standard output. This value is always empty since the new window process starts asynchronously.stdErr String: Standard error. This value is always empty since the new window process starts asynchronously.exitCode Number: Exit code of the process. await Neutralino.window.create('/resources/aboutWindow.html', { icon: '/resources/icons/aboutIcon.png', enableInspector: false, width: 500, height: 300, maximizable: false, exitProcessOnClose: true, processArgs: '--window-id=W_ABOUT' }); ","version":"Next","tagName":"h3"},{"title":"Neutralino.os","type":0,"sectionRef":"#","url":"/docs/api/os","content":"","keywords":"","version":"Next"},{"title":"os.execCommand(command, options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osexeccommandcommand-options","content":" Executes a command and returns the output. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters","content":" command String: The command that is to be executed. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options","content":" background Boolean: Executes the command in background and resolve the Promise immediately if this is set to true. This option makes the process detached from the API function call, so if you need to connect with the newly created process later, consider using os.spawnProcess.stdIn String: Standard input as a string.cwd String: Current working directory. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited","content":" pid Number: Process identifier.stdOut String: Standard output.stdErr String: Standard error.exitCode Number: Exit code of the process. let info = await Neutralino.os.execCommand('python --version'); console.log(`Your Python version: ${info.stdOut}`); await Neutralino.os.execCommand('npm start', { background: true }); ","version":"Next","tagName":"h3"},{"title":"os.spawnProcess(command, cwd)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osspawnprocesscommand-cwd","content":" Spawns a process based on a command in background and let developers control it. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-1","content":" command String: The command that is to be executed in a new process.cwd String (optional): Current working directory. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-1","content":" id Number: A Neutralino-scoped process identifier. This value is used for controlling the process via the native API.pid Number: Process identifier from the operating system. let pingProc = await Neutralino.os.spawnProcess('ping neutralino.js.org'); Neutralino.events.on('spawnedProcess', (evt) => { if(pingProc.id == evt.detail.id) { switch(evt.detail.action) { case 'stdOut': console.log(evt.detail.data); break; case 'stdErr': console.error(evt.detail.data); break; case 'exit': console.log(`Ping process terminated with exit code: ${evt.detail.data}`); break; } } }); ","version":"Next","tagName":"h3"},{"title":"os.updateSpawnedProcess(id, action, data)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osupdatespawnedprocessid-action-data","content":" Updates a spawned process based on a provided action and data. Throws NE_OS_UNLTOUP if the process cannot be updated. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-2","content":" id Number: Neutralino-scoped process identifier.action String: An action to take. Accepts only the following values: stdIn: Sends data to the process via the standard input stream.stdInEnd: Closes the standard input stream file descriptor.exit: Terminates the process. data Object (optional): Additional data for the action. Send stardard input string if the actionis stdIn. let nodeProc = await Neutralino.os.spawnProcess('node'); Neutralino.events.on('spawnedProcess', (evt) => { if(nodeProc.id == evt.detail.id) { switch(evt.detail.action) { case 'stdOut': console.log(evt.detail.data); // 10 break; case 'stdErr': console.error(evt.detail.data); break; case 'exit': console.log(`Node.js process terminated with exit code: ${evt.detail.data}`); break; } } }); await Neutralino.os.updateSpawnedProcess(nodeProc.id, 'stdIn', 'console.log(5 + 5);'); await Neutralino.os.updateSpawnedProcess(nodeProc.id, 'stdInEnd'); ","version":"Next","tagName":"h3"},{"title":"os.getSpawnedProcesses()​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetspawnedprocesses","content":" Returns all spawned processes. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-2","content":" An array of SpawnedProcess objects. SpawnedProcess​ id Number: A Neutralino-scoped process identifier..pid Number: Process identifier from the operating system. await Neutralino.os.spawnProcess('ping neutralino.js.org'); await Neutralino.os.spawnProcess('ping codezri.org'); let processes = await Neutralino.os.getSpawnedProcesses(); console.log(processes); ","version":"Next","tagName":"h3"},{"title":"os.getEnv(key)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetenvkey","content":" Provides the value of a given environment variable. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-3","content":" key String: The name of the environment variable. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited","content":" Value of the given environment variable. Returns an empty string if the environment variable is not defined. let value = await Neutralino.os.getEnv('USER'); console.log(`USER = ${value}`); ","version":"Next","tagName":"h3"},{"title":"os.getEnvs()​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetenvs","content":" Returns all environment variables and their values. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-3","content":" Environment variables details in key-value pairs. let envs = await Neutralino.os.getEnvs(); console.log(envs); ","version":"Next","tagName":"h3"},{"title":"os.showOpenDialog(title, options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowopendialogtitle-options","content":" Shows the file open dialog. You can use this function to obtain paths of existing files. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-4","content":" title String (optional): Title of the dialog. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-1","content":" filters Filter[] (optional): An array of Filter objects to filter the files list.multiSelections (optional): Enables multi selections.defaultPath String (optional): Initial path/filename displayed by the dialog. Filter​ name String: Filter name.extensions String: Array of file extensions. Eg: ['jpg', 'png'] ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-4","content":" An array of selected entries. let entries = await Neutralino.os.showOpenDialog('Open a diagram', { defaultPath: '/home/my/directory/', filters: [ {name: 'Images', extensions: ['jpg', 'png']}, {name: 'All files', extensions: ['*']} ] }); console.log('You have selected:', entries); ","version":"Next","tagName":"h3"},{"title":"os.showSaveDialog(title, options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowsavedialogtitle-options","content":" Shows the file save dialog. You can use this function to obtain a path to create a new file. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-5","content":" title String (optional): Title of the dialog. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-2","content":" filters Filter[] (optional): An array of Filter objects to filter the files list.forceOverwrite Boolean (optional): Skips file overwrite warning message.defaultPath String (optional): Initial path/filename displayed by the dialog. Filter​ name String: Filter name.extensions String[]: Array of file extensions. Eg: ['jpg', 'png'] ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-1","content":" Selected filename. let entry = await Neutralino.os.showSaveDialog('Save to file', { defaultPath: 'untitled.jpg', filters: [ {name: 'Images', extensions: ['jpg', 'png']}, {name: 'All files', extensions: ['*']} ] }); console.log('You have selected:', entry); ","version":"Next","tagName":"h3"},{"title":"os.showFolderDialog(title)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowfolderdialogtitle","content":" Shows the folder open dialog. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-6","content":" title String (optional): Title of the dialog. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-3","content":" defaultPath String (optional): Initial path displayed by the dialog. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-2","content":" Selected folder. let entry = await Neutralino.os.showFolderDialog('Select installation directory', { defaultPath: '/home/my/directory/' }); console.log('You have selected:', entry); ","version":"Next","tagName":"h3"},{"title":"os.showNotification(title, content, icon)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshownotificationtitle-content-icon","content":" Displays a notification message. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-7","content":" title String: Notification title.content String: Content of the notification.icon String (optional): Icon name. Accpeted values are: INFO, WARNING, ERROR, and QUESTION. The default value isINFO await Neutralino.os.showNotification('Hello world', 'It works! Have a nice day'); await Neutralino.os.showNotification('Oops :/', 'Something went wrong', 'ERROR'); ","version":"Next","tagName":"h3"},{"title":"os.showMessageBox(title, content, choice, icon)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowmessageboxtitle-content-choice-icon","content":" Displays a message box. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-8","content":" title String: Title of the message box.content String: Content of the message box.choice String (optional): Message box buttons. Accpeted values are: OK, OK_CANCEL, YES_NO, YES_NO_CANCEL, RETRY_CANCEL, and ABORT_RETRY_IGNORE. The default value is OK.icon String (optional): Icon name. Accpeted values are: INFO, WARNING, ERROR, and QUESTION. The default value is INFO. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-3","content":" User's choice. await Neutralino.os.showMessageBox('Hello', 'Welcome'); let button = await Neutralino.os .showMessageBox('Confirm', 'Are you sure you want to quit?', 'YES_NO', 'QUESTION'); if(button == 'YES') { Neutralino.app.exit(); } ","version":"Next","tagName":"h3"},{"title":"os.setTray(options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#ossettrayoptions","content":" Creates/updates the tray icon and menu. ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-4","content":" icon String: Tray icon path. Eg: /resources/icons/trayIcon.png. A20x20-sized PNG image file works fine on all supported operating systems.menuItems TrayMenuItem[]: An array of TrayMenuItem objects. TrayMenuItem​ id String (optional): A unique identifier for each menu item.text String: Label of the menu item. This field is a mandatory field. Use - (hyphen) character for a menu separator.isDisabled Boolean (optional): A boolean flag to disable/enable a specific menu item.isChecked Boolean (optional): A boolean flag to mark a specific menu item as selected. let tray = { icon: '/resources/icons/trayIcon.png', menuItems: [ {id: "about", text: "About"}, {text: "-"}, {id: "quit", text: "Quit"} ] }; await Neutralino.os.setTray(tray); ","version":"Next","tagName":"h3"},{"title":"os.getPath(name)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetpathname","content":" Returns known platform-specific folders such as Downloads, Music, Videos, etc. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-9","content":" title String: Name of the folder. Accepted values are: config, data, cache, documents, pictures, music, video,downloads, saveGames1, saveGames2, and temp. Throws NE_OS_INVKNPT for invalid folder names. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-4","content":" Path. let downloadsPath = await Neutralino.os.getPath('downloads'); console.log(`Downloads folder: ${downloadsPath}`); ","version":"Next","tagName":"h3"},{"title":"os.open(url)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osopenurl","content":" Opens a URL with the default web browser. tip If your application is running in the default web browser, this method will open a new tab. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-10","content":" url String: URL to be opened. Neutralino.os.open('https://neutralino.js.org'); ","version":"Next","tagName":"h3"},{"title":"Project Structure","type":0,"sectionRef":"#","url":"/docs/configuration/project-structure","content":"","keywords":"","version":"Next"},{"title":"Developing apps with vanilla JS​","type":1,"pageTitle":"Project Structure","url":"/docs/configuration/project-structure#developing-apps-with-vanilla-js","content":" If you like to develop Neutralinojs applications with vanilla JavaScript, you can place all application resources in one directory. After that, you can update the neutralino.config.json file with the following values. ... "cli": { ... "resourcesPath": "/<resourcesDir>/", "clientLibrary": "/<resourcesDir>/neutralino.js" } You can choose a name for <resourceDir>. But, by default neu CLI will use resources. ","version":"Next","tagName":"h2"},{"title":"Developing apps with frontend frameworks​","type":1,"pageTitle":"Project Structure","url":"/docs/configuration/project-structure#developing-apps-with-frontend-frameworks","content":" Any frontend framework can be used to make Neutralinojs applications. You can use any pattern as you wish to include both Neutralinojs app and frontend app in one repository. You can check our recommended approach from this guide. ","version":"Next","tagName":"h2"},{"title":"Examples​","type":1,"pageTitle":"Project Structure","url":"/docs/configuration/project-structure#examples","content":" Please browse sample apps section. ","version":"Next","tagName":"h3"},{"title":"Modes","type":0,"sectionRef":"#","url":"/docs/configuration/modes","content":"","keywords":"","version":"Next"},{"title":"window​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#window","content":" Neutralinojs application will run on a native window. The window will use the user's operating system's theme. This mode is a good selection for cross-platform application development. ","version":"Next","tagName":"h2"},{"title":"browser​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#browser","content":" Neutralinojs application will use the user's default browser to load the application. Therefore, you can build web applications with native operations. You can't typically access operating system-level features via web browsers. But, the Neutralinojs browser mode helps you to make web apps that can access the operating system layer with required security controls. ","version":"Next","tagName":"h2"},{"title":"cloud​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#cloud","content":" This mode will run the Neutralinojs process as a background server. You will be able to expose your application to a public network or the internet. tip Example scenario: You can make a web application to control your computer via mobile phones. Besides, you can run the Neutralinojs server on bare-metal servers, virtual machines, and application containers as a lightweight message broker. You may find endless use-cases for this framework mode. danger Make sure that you are blocking or allowing critical native operations vianativeBlockList, nativeAllowList respectively. Also, if you started the application with administrator access, your web application will have the same permission level. ","version":"Next","tagName":"h2"},{"title":"chrome​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#chrome","content":" Neutralinojs app will run as a Chrome application. The framework uses the following Chrome command-line arguments to make the web application look more like a native app. --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-breakpad --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-infobars --disable-extensions --disable-features=site-per-process --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-sync --disable-translate --disable-windows10-custom-titlebar --metrics-recording-only --no-first-run --no-default-browser-check --safebrowsing-disable-auto-update --password-store=basic --use-mock-keychain --user-data-dir=${NL_PATH}/.tmp/chromedata Neutralinojs chrome mode works on a computer that has a pre-installed version of Google Chrome, Chromium, or Microsoft Edge browser. If no installation was detected, Neutralinojs displays an error message by asking the user to install a Chromium-based browser. You can provide additional arguments (Eg: --disable-web-security) to the Chrome process via argsconfiguration attribute. Browse all supported Chromium command-line arguments here ","version":"Next","tagName":"h2"},{"title":"About Neutralinojs","type":0,"sectionRef":"#","url":"/docs/contributing/about-neutralinojs","content":"","keywords":"","version":"Next"},{"title":"History​","type":1,"pageTitle":"About Neutralinojs","url":"/docs/contributing/about-neutralinojs#history","content":" In 2018, three Uva Wellassa University students, Shalitha Suranga,Deepal Samarakoon, and Chathumadhuri Hettiarachchi published a research paper about a theoretical way to build cross-platform apps using inbuilt platform-specific browser libraries. They initially planned to use "Neutrino" as the research project name, but it was already taken. So, they decided to use "Neutralinojs" as the project name (Neutralino refers to a hypothetical lightweight particle). For the research paper, Shalitha Suranga wrote a small POC project for GNU/Linux and Windows to demonstrate the theoretical idea and published it to GitHub as an experimental open-source project. In 2019, the research paper authors started working with the software development industry. But, Shalitha Suranga decided to maintain the POC project alone as a hobby project due to the positive feedback received from the developer communities. Later, Kasun Vithanage ported the POC project to the macOS platform. During 2020–2021, Shalitha Suranga rewrote the Neutralinojs POC project with a new WebSockets-based architecture. His goal was to make the project production-ready with a stable API, well-organized codebase, DevOps improvements, and developer-friendly documentation. Since this rewrite was so different compared to the original research project idea, he planned to re-brand "Neutralinojs" as "Neu.js". However, he decided to use the same name due to the existing Neutralinojs-related content on the internet. In 2022, Neutralinojs passed remarkable development milestones and became a popular open-source framework for building lightweight cross-platform desktop apps with JavaScript. During this journey, the developer community supported Neutralinojs with ideas and code contributions. ","version":"Next","tagName":"h2"},{"title":"Current development​","type":1,"pageTitle":"About Neutralinojs","url":"/docs/contributing/about-neutralinojs#current-development","content":" In 2022, Shalitha Suranga added the Neutralinojs project under the CodeZri non-profit organization to maintain the project, along with his other personal open-source projects. Nowadays, he releases a new framework version every two months with support from very supportive contributors. The project uses a community-driven development methodology. Developer community members and maintainers collaboratively work by writing code, reporting bugs, improving documentation, and discussing features. ","version":"Next","tagName":"h2"},{"title":"Financial perspective​","type":1,"pageTitle":"About Neutralinojs","url":"/docs/contributing/about-neutralinojs#financial-perspective","content":" Shalitha Suranga often donates his time to Neutralinojs by writing code, reviewing pull requests, and planning future of Neutralinojs. He integrated EthicalAds andGoogle Adsense with the Neutralinojs website to generate revenue for his work. Also, he accepts donations from the developer community via his personalPatreon and GitHub Sponsors accounts. Moreover, you can donate Neutralinojs via OpenCollective. Neutralinojs has no plans to monetize the framework with paid licensing/subscriptions, paid support, or courses. Also, Neutralinojs doesn't accept payments to deliver new custom features or solve bugs in apps. Our goal is to keep improving Neutralinojs as a pure FOSS project under the donation-based financial model. tip Read this articleto learn how to build a community-friendly revenue stream around your open-source project. We motivate everyone to build a community-friendly revenue stream around open-source projects! ","version":"Next","tagName":"h2"},{"title":"neutralino.config.json","type":0,"sectionRef":"#","url":"/docs/configuration/neutralino.config.json","content":"","keywords":"","version":"Next"},{"title":"Primary​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#primary","content":" The following configuraion values cannot be overridden in different Neutralinojs modes. ","version":"Next","tagName":"h2"},{"title":"applicationId: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#applicationid-string","content":" Unique string to identify your application. Eg: js.neutralino.sample ","version":"Next","tagName":"h3"},{"title":"version: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#version-string","content":" Application version. Eg: 2.4.22 ","version":"Next","tagName":"h3"},{"title":"defaultMode: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#defaultmode-string","content":" Mode of the application. Accepted values are window, browser, cloud, and chrome. ","version":"Next","tagName":"h3"},{"title":"General​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#general","content":" You can override the following configuration values from different modes. For example, you can use a specific URL in root-level and another URL in window-mode-level, as shown below. { "url": "/" "modes": { "window": { "url": "/#window-mode" } } } ","version":"Next","tagName":"h2"},{"title":"port: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#port-number","content":" The port of your application. If the value is 0, Neutralinojs will use a random available port. ","version":"Next","tagName":"h3"},{"title":"enableServer: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#enableserver-boolean","content":" Enables or disables the background server (Disables static file servering feature and native API messaging). If you load a remote URL to the webview, you can set this option to false. Make sure to set this option to true if you load resources from local sources. The default value is false. ","version":"Next","tagName":"h3"},{"title":"enableNativeAPI: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#enablenativeapi-boolean","content":" Enables or disables the native API. If you want to use any native API functions, you can set this option to true. The default value is false. ","version":"Next","tagName":"h3"},{"title":"singlePageServe: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#singlepageserve-boolean","content":" Activates SPA (Single Page App) serving. When this option is enabled, the static server module serves the primaryindex.html file for sub-directory requests only if another index.html doesn't exist in a specific sub-directory. The default value for this option is false. ","version":"Next","tagName":"h3"},{"title":"tokenSecurity: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#tokensecurity-string","content":" Neutralinojs uses a client-server communication pattern with a local WebSocket to handle native calls. This local server is protected with an auto-generated token. This option defines the security implementation for the token. Accepts the following values: one-time (Recommended) : Server sends the access token only once, and the client persists it in thesessionStorage. If another client (Eg: browser) tries to access the app, NE_RT_INVTOKN error message will be shown instead of the application. Using this option is recommended since it reduces security issues. none : Server sends the access token always, so any new client can see the application. The default value becomes one-time if this setting is not specified by the developer. danger If you are using native APIs that can access your computer's internals such as os, filesystem, modules, never use none option since any new client can use those APIs. ","version":"Next","tagName":"h3"},{"title":"url: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#url-string","content":" The entry URL of the application. Neutralinojs will initially load this URL. This property accepts both relative and absolute URLs. See following examples. "url": "/" The above config loads http://localhost:<port>/ URL initially (internally /index.html is loaded). You can use remote urls too. "url": "http://example.com" ","version":"Next","tagName":"h3"},{"title":"documentRoot: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#documentroot-string","content":" Sets the document root for the static server. For example, if you need to use resources directory as the document root, you can use setup documentRoot as follows. { "documentRoot": "/resources/", "url": "/" } Make sure to configure url properly with the document root. The following configuration is wrong, it instructs the static server to fetch resources from ./resources/resources. { "documentRoot": "/resources/", "url": "/resources/" } However, you can use a sub-directory in URL, as shown below. { "documentRoot": "/", "url": "/resources/" } ","version":"Next","tagName":"h3"},{"title":"exportAuthInfo: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#exportauthinfo-boolean","content":" Exports authentication details to the ${NL_PATH}/.tmp/auth_info.json file with the following JSON structure. { "port": "<port>", "accessToken": "<access_token>" } You can use the above authentication details to connect with Neutralinojs from external processes by using WebSocket as an IPC mechanism. ","version":"Next","tagName":"h3"},{"title":"enableExtensions: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#enableextensions-boolean","content":" Enables/disables extensions. Learn more about this option here ","version":"Next","tagName":"h3"},{"title":"extensions: object[]​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#extensions-object","content":" An array of extension definitions. Learn more about this option here ","version":"Next","tagName":"h3"},{"title":"nativeBlockList: string[]​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#nativeblocklist-string","content":" An array of native methods needs to be blocked from the frontend of the application. The wildcard character * is allowed inside entries. { "nativeBlockList": ["os.execCommand"], "nativeBlockList": ["app.*"] } ","version":"Next","tagName":"h3"},{"title":"nativeAllowList: string[]​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#nativeallowlist-string","content":" An array of native methods needs to be allowed from the frontend of the application. The wildcard character * is allowed inside entries. { "nativeAllowList": ["os.getEnv"], "nativeAllowList": ["storage.*"] } ","version":"Next","tagName":"h3"},{"title":"globalVariables: object​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#globalvariables-object","content":" A key-value-based JavaScript object of custom global variables. ","version":"Next","tagName":"h3"},{"title":"logging.enabled: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#loggingenabled-boolean","content":" Enables or disables the logging feature. ","version":"Next","tagName":"h3"},{"title":"logging.writeToLogFile: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#loggingwritetologfile-boolean","content":" Enables or disables log file. If this setting is false, the framework won't write log to neutralinojs.log, and it will write logs to standard streams. ","version":"Next","tagName":"h3"},{"title":"serverHeaders: object​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#serverheaders-object","content":" Custom headers for the static server and Websocket handshake process. For example, the following configuration sends a custom header with every outgoing HTTP response. { "serverHeaders": { "Test-Header-Option": "Value" } } ","version":"Next","tagName":"h3"},{"title":"Window mode​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#window-mode","content":" The following configuration values are used when the application runs with the window mode. ","version":"Next","tagName":"h2"},{"title":"modes.window.title: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowtitle-string","content":" Title of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.width: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowwidth-number","content":" Width of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.height: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowheight-number","content":" Height of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.minWidth: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowminwidth-number","content":" Minimum width of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.minHeight: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowminheight-number","content":" Minimum height of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.maxWidth: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowmaxwidth-number","content":" Maximum width of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.maxHeight: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowmaxheight-number","content":" Maximum height of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.x: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowx-number","content":" Left position (x) of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.y: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowy-number","content":" Right position (y) of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.center: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowcenter-boolean","content":" Centers the native app window initially. ","version":"Next","tagName":"h3"},{"title":"modes.window.transparent: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowtransparent-boolean","content":" Enables the transparent native window mode for the application instance. If the transparency mode is activated, users can see through the webview if the webpage background uses transparent background colors. Partial transparency can be activated using the rgba() CSS color function. You can use this feature to create semi-transparent windows, windows with custom shadows, and custom-shaped window frames. The default value is false for this option. info Unlike in other platforms, Windows native window becomes borderless (window controls will be hidden) with the activation of the transparent mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.fullScreen: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowfullscreen-boolean","content":" Activates the full-screen mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.icon: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowicon-string","content":" Application icon's file name. You can directly point to an image file in the resources directory. We recommend you to choose a transparent PNG file. ","version":"Next","tagName":"h3"},{"title":"modes.window.alwaysOnTop: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowalwaysontop-boolean","content":" Activates the top-most mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.enableInspector: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowenableinspector-boolean","content":" Automatically opens the developer tools window. ","version":"Next","tagName":"h3"},{"title":"modes.window.borderless: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowborderless-boolean","content":" Activates the borderless mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.maximize: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowmaximize-boolean","content":" Launches the application maximized. ","version":"Next","tagName":"h3"},{"title":"modes.window.resizable: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowresizable-boolean","content":" Make the window resizable or not. The default value is true. ","version":"Next","tagName":"h3"},{"title":"modes.window.hidden: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowhidden-boolean","content":" Make the window invisible. This setting can be used to develop background services. ","version":"Next","tagName":"h3"},{"title":"modes.window.exitProcessOnClose: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowexitprocessonclose-boolean","content":" If this setting is true, the app process will exit when the user clicks on the close button. Otherwise, the framework will dispatch the windowClose event. ","version":"Next","tagName":"h3"},{"title":"modes.window.useSavedState: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowusesavedstate-boolean","content":" Save and load the primary window state (width, height, x, y, values and maximized status) automatically. The default value is true. ","version":"Next","tagName":"h3"},{"title":"modes.window.extendUserAgentWith: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowextenduseragentwith-string","content":" Extends the default webview-specific user agent string with a custom suffix. If this value is not set, the webview sets the default user agent from the platform-specific rendering engine (i.e., WebKit on GNU/Linux). ","version":"Next","tagName":"h3"},{"title":"Chrome mode​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#chrome-mode","content":" The following configuration values are used when the application starts with the chrome mode. ","version":"Next","tagName":"h2"},{"title":"modes.chrome.width: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeschromewidth-number","content":" Width of the chrome window. ","version":"Next","tagName":"h3"},{"title":"modes.chrome.height: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeschromeheight-number","content":" Height of the chrome window. ","version":"Next","tagName":"h3"},{"title":"modes.chrome.args: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeschromeargs-string","content":" Additional command-line arguments for the Chrome process. Read more about chrome mode from here ","version":"Next","tagName":"h3"},{"title":"CLI​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cli","content":" The following configuration values are used for the neu CLI. ","version":"Next","tagName":"h2"},{"title":"cli.binaryName: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clibinaryname-string","content":" Binary file name of your application. If it is myapp, all binaries will usemyapp-<platform>_<arch> format. ","version":"Next","tagName":"h3"},{"title":"cli.resourcesPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliresourcespath-string","content":" Path of your application resources. ","version":"Next","tagName":"h3"},{"title":"cli.resourcesExclude: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliresourcesexclude-string","content":" Regex pattern to exclude files from final app bundle. For example, the following configuration will exclude all the TypeScript source files from the final build: { "resourcesExclude" : ".*\\\\.ts$|.*\\\\.tsx$" } ","version":"Next","tagName":"h3"},{"title":"cli.extensionsPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliextensionspath-string","content":" Path of your application extensions. ","version":"Next","tagName":"h3"},{"title":"cli.extensionsExclude: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliextensionsexclude-string","content":" Regex pattern to exclude files from the extensions directory of the final app package. For example, the following configuration will exclude .log and .info files: { "extensionsExclude" : ".*\\\\.log$|.*\\\\.info$" } ","version":"Next","tagName":"h3"},{"title":"cli.clientLibrary: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliclientlibrary-string","content":" Filename of the Neutralinojs JavaScript library. ","version":"Next","tagName":"h3"},{"title":"cli.binaryVersion: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clibinaryversion-string","content":" Neutralinojs server version. Get nightly builds by using the nightly tag. ","version":"Next","tagName":"h3"},{"title":"cli.clientVersion: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliclientversion-string","content":" Neutralinojs client version. Get nightly builds by using the nightly tag. ","version":"Next","tagName":"h3"},{"title":"cli.autoReloadExclude: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliautoreloadexclude-string","content":" A JavaScript regular expression to exclude files from the auto-reload file watcher. For example, the following configuration will disable auto-reloading for SASS stylesheets (.scss). { "autoReloadExclude": ".*\\\\.scss$" } Use | character to set multiple regular expressions, as shown below. { "autoReloadExclude": ".*\\\\.scss$|.*\\\\.less$" } ","version":"Next","tagName":"h3"},{"title":"cli.frontendLibrary: object​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clifrontendlibrary-object","content":" Enables frontend development tools (HMR, etc) for the neu run command. Learn more about frontend framework integration from here ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.projectPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectprojectpath-string","content":" Sets the project path of the host project. This path will be used as the current directory while executing the host-project-related commands. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.initCommand: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectinitcommand-string","content":" A command that gets executed after downloading an host app template with the neu create command. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.devCommand: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectdevcommand-string","content":" This command will run with the neu run command to start the host project. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.buildCommand: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectbuildcommand-string","content":" The neu build command will execute this command before generating the app bundle, so you can generate bundled version of host project code. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.buildPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectbuildpath-string","content":" Location where the final read-to-distribute host project files will be stored after the execution of buildCommand. Files in this folder are copied into the app bundle path after the execution of neu build command. ","version":"Next","tagName":"h3"},{"title":"cli.distributionPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clidistributionpath-string","content":" Sets the build path for neu CLI. For example, if you need to get the built binaries in build folder instead of dist, you can set the distributionPath as follows: { "distributionPath": "/build", } The default value for distributionPath is /dist. ","version":"Next","tagName":"h3"},{"title":"Windows-specific options​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#windows-specific-options","content":" There are additional configuration options that define metadata and appearance of executables for Windows platform. These fields must be placed in the root of neutralino.config.json. Every field is optional. ","version":"Next","tagName":"h2"},{"title":"applicationName: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#applicationname-string","content":" The human-readable application name. Fills in the ProductName field of the executable. ","version":"Next","tagName":"h3"},{"title":"applicationIcon: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#applicationicon-string","content":" The location of the executable's icon relative to neutralino.config.json. The icon must be in PNG format. If it is not set, an icon from modes.window.icon will be chosen instead. If modes.window.icon does not point to a PNG file, too, a default Neutralino.js icon will be used. ","version":"Next","tagName":"h3"},{"title":"author: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#author-string","content":" The developer of the application. Fills in the CompanyName field of the executable. ","version":"Next","tagName":"h3"},{"title":"description: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#description-string","content":" A description of the executable file. This usually describes the purpose of your application. Fills in the FileDescription field of the executable. ","version":"Next","tagName":"h3"},{"title":"copyright: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#copyright-string","content":" Copyright information. Fills in the LegalCopyright field of the executable. Example configuration: { "applicationId": "cook.pancake.bakery", "version": "1.2.0", "applicationName": "Pancake Bakery", "author": "Sweet Pancakes LLC", "description": "Digital recipe book for pancakes from all over the world", "copyright": "Copyright © Sweet Pancakes LLC 2042. All rights reserved.", "applicationIcon": "buildAssets/appIcon.png", "cli": { "binaryName": "pancakebakery" } } ","version":"Next","tagName":"h3"},{"title":"Architecture","type":0,"sectionRef":"#","url":"/docs/contributing/architecture","content":"Architecture The Neutralinojs framework core follows a single-process, monolithic, and layered architectural pattern with two-interconnected components: the framework core (C++) and the client library (JavaScript). Look at the following high-level architectural diagram: The framework core has two key components: the router and the native API. The router component is responsible for processing HTTP and WebSocket messages. Neutralinojs typically serve all web resources via HTTP like a normal HTTP web server. The Neutralinojs native API communication protocol uses the WebSocket messaging protocol. The router serves web resources and executes native API functions according to the incoming requests from the web context. Your JavaScript application needs to use the Neutralinojs client library functions to execute native API operations. The platform-specific webview runs the JavaScript code of the client library and your application. The webview component isn't a core framework component, so you can run Neutralinojs applications on any modern web browser with browser, chrome, and cloud modes. Because of this flexibility, you can write extensions with any programming language and connect to the framework core with authentication details. Even though an extension-less application follows a monolithic pattern, extensions make Neutralinojs applications non-monolithic with the process-based microservices architecture.","keywords":"","version":"Next"},{"title":"Code Style Guide","type":0,"sectionRef":"#","url":"/docs/contributing/code-style-guide","content":"","keywords":"","version":"Next"},{"title":"Programming best practices​","type":1,"pageTitle":"Code Style Guide","url":"/docs/contributing/code-style-guide#programming-best-practices","content":" First, make sure that your code change adheres to the following language-independent best practices: Neutralinojs codebases use a procedural and functional mixed coding style, so avoid adding classes and OOP concepts. However, it's okay to use class-based libraries, but make sure not to expose those classes from Neutralinojs internal procedures. Keep the source code simple even though the development requirement is somewhat complex.This articleexplains more about programming principles that you need to know. We stabilized the Neutralinojs codebase structure and have no plans to extend it further with new modules. In other words, please try to implement your code changes without changing the existing code structure. Please discuss first if your code suggestion needs to extend the code structure. Try to make new APIs and features consistent with the existing implementation. We decided not to expose any operating system-specific feature from the Neutralinojs API for the framework consistency across all operating systems. Therefore, make sure that your new feature will work on all supported operating systems. Write tests for new features and update the changelog file. Add comments only if a further explanation is required. Use self-explanatory identifiers for every code element by following the existing naming convention in the codebase. Use four spaces for indentation instead of tabs or two spaces. Inspect an existing source file and use the same formatting with new source files. ","version":"Next","tagName":"h2"},{"title":"C++ code style guide​","type":1,"pageTitle":"Code Style Guide","url":"/docs/contributing/code-style-guide#c-code-style-guide","content":" We are still composing a complete C++ code style guide. Make sure to follow the following points for C++ code submissions for now.  We don't use C++ exceptions. Use booleans to identify failures. For example, we use the following struct for the file read operation: struct FileReaderResult { bool hasError = false; string error; string data; }; We prefer single-line comments (i.e., // comment) over multi-line comments. Use pass-by-reference for complex data types, but use pass-by-value for atomics. Also, make sure to use theconst keyword properly if the parameter doesn't change within the procedure. For example, look at the following function definition: fs::FileReaderResult readFile(const string &filename); Avoid mixing old C-style syntax with modern C++ syntax.Use the __ prefix (double underscore) to declare module-only functions as shown in the following example: void __registerAllowList() { // implementation } Use getter and setter functions instead of shared global variables (defined with extern). ","version":"Next","tagName":"h2"},{"title":"JavaScript code style guide​","type":1,"pageTitle":"Code Style Guide","url":"/docs/contributing/code-style-guide#javascript-code-style-guide","content":" Use ES6 JavaScript syntax by avoiding legacy language syntax. Use template literals for somewhat complex string construction, but use the + operator for simple concatenation. Use the async/await syntax instead of the then/catch syntax for asynchronous operations. Avoid using too recent JavaScript APIs and language features since we need to support older Node.js and browser versions. But, think twice about readability with somewhat old JavaScript features. Don't use more than three parameters for a function—use a JSON object instead for better readability. If you work with some TypeScript codes, always strive to use the meaningful data types instead any orunknown broad data types. ","version":"Next","tagName":"h2"},{"title":"Committers","type":0,"sectionRef":"#","url":"/docs/contributing/committers","content":"","keywords":"","version":"Next"},{"title":"Become a committer​","type":1,"pageTitle":"Committers","url":"/docs/contributing/committers#become-a-committer","content":" You can actively submit patches, bug-reports, and ideas to become a Neutralinojs committer! ","version":"Next","tagName":"h2"},{"title":"Become a PMC member​","type":1,"pageTitle":"Committers","url":"/docs/contributing/committers#become-a-pmc-member","content":" PMC (Project Management Committee) members usually take decisions about project's future. Active committers will be added to the PMC list frequently by the existing PMC members according to their commitment. ","version":"Next","tagName":"h2"},{"title":"Developer Support","type":0,"sectionRef":"#","url":"/docs/contributing/developer-support","content":"","keywords":"","version":"Next"},{"title":"Bug reports and feature requests​","type":1,"pageTitle":"Developer Support","url":"/docs/contributing/developer-support#bug-reports-and-feature-requests","content":" There are no perfect software. But we can build good software. Help us to improve Neutralinojs by reporting bugs and submitting feature requests. Please create an issue on appropriate GitHub repository for feature requests and bug reporting. Neutralinojs native API: Create an issueNeutralinojs JavaScript API: Create an issueneu CLI: Create an issueStarter template: Create an issueDocumentaion: Create an issue: ","version":"Next","tagName":"h2"},{"title":"Security","type":0,"sectionRef":"#","url":"/docs/contributing/security","content":"","keywords":"","version":"Next"},{"title":"Port security and authentication​","type":1,"pageTitle":"Security","url":"/docs/contributing/security#port-security-and-authentication","content":" Once you study the Neutralinojs architecture, you will notice that the framework frontend communicates with the framework core via a WebSocket-based network port. Developers who know the operating system internals will argue that the Neutralinojs framework is vulnerable due to the local port-based IPC. Let's understand it this way. The network is undoubtedly vulnerable, but network security strategies make networks secure for every computer user—that's how we trust the internet today. Similarly, Neutralinojs uses the One-Time-Token (OTT) strategy to prevent possible port scanning attacks. Here is how the Neutralinojs local port is secured: The Neutralinojs framework's authentication module generates the OTT during the initialization process and a part of the OTT is saved as Connection Token (CT) for WebSocket clients.When the user loads the client-library script, the framework sends the OTT only once.The client library stores the OTT in the local storage for future usage—the framework never sends the OTT again to the frontend. Depending on the current application mode, the client library stores the OTT in either webview or web browser.The client library uses CT to establish a WebSocket connection with the framework.The OTT is used to verify every native API function call that comes from WebSocket clients (including the client-library).The framework blocks WebSocket connections from remote URLs within window, browser, and Chrome modes. The following criteria need to be satisfied for executing an arbitrary API function via a malicious webpage (local) or program: The specific malicious component needs to capture the OTT before the original application obtains the OTT from the framework core. This attacking strategy is not practical because of the fast application startup and lack of faster ways to access operating system-level process status. Even though someone manages to detect the application startup, the original application requests OTT before the malicious program (The framework sends OTT only once). On the other hand, malicious programs don't need Neutralinojs to damage your computer system, so use programs you trust. Even the OTT request process is not possible with modern web browsers via remote pages due to CORS-like security strategies. Also, we don't even enable the native API for remote pages due to strict application security. If there is a way (there is no proven approach yet) to crack OTT, native API access controls protect the user's computer. ","version":"Next","tagName":"h2"},{"title":"Native API access control and authorization​","type":1,"pageTitle":"Security","url":"/docs/contributing/security#native-api-access-control-and-authorization","content":" The OTT strategy provides authentication for native API access by preventing invalid/vulnerable client connections. The OTT grants access to the native API, but it doesn't give access to everything. Most modern popular application runtimes provide access to everything without proper access control. In the Neutralinojs native API model, developers need to mention the APIs they need explicitly for better security. Developers can define API permission requirements via the native allowlist or blocklist features. The Neutralinojs native API permission system provides authorization support by validating incoming requests with the pre-defined permission matrices. Look at the following authentication/authorization diagram for more details: Moreover, Neutralinojs extensions also securely receive WebSocket authentication details (OTT, CT, and port) via standard input streams, so malicious programs can't obtain connectivity secrets by scanning your process list. Read our security policyto learn how to handle security-related framework issues. ","version":"Next","tagName":"h2"},{"title":"Frequently Asked Questions","type":0,"sectionRef":"#","url":"/docs/contributing/frequently-asked-questions","content":"","keywords":"","version":"Next"},{"title":"Framework​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#framework","content":" ","version":"Next","tagName":"h2"},{"title":"Error Code 127: libayatana-appindicator3.so.1 cannot open shared object file: No such file or directory​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#error-code-127-libayatana-appindicator3so1-cannot-open-shared-object-file-no-such-file-or-directory","content":" We fixed this issue in v4.5.0, so please upgrade your framework version. If you need to use a lower framework version, you need to install the missing package with the following commands to start the app properly: apt update apt install -y libayatana-appindicator3-1 Make sure to run the above commands with sudo. Check the package information for further reference. ","version":"Next","tagName":"h3"},{"title":"CLI​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#cli","content":" ","version":"Next","tagName":"h2"},{"title":"What should I do when I get Missing permission to execute the native method: <namespace.func> error ?​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#what-should-i-do-when-i-get-missing-permission-to-execute-the-native-method-namespacefunc-error-","content":" This error occurs when permissions are not given to execute a specific native method. To be able to run this function, add the namespace.func to the nativeAllowList. To allow all functions of the particular namespace, use namespace.*. Check here to learn more about allowlists. ","version":"Next","tagName":"h3"},{"title":"yarn global add @neutralinojs/neu doesn't complete the installation process.​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#yarn-global-add-neutralinojsneu-doesnt-complete-the-installation-process","content":" When yarn is used to install neu, the output shows success Installed "@neutralinojs/neu". But, neu commands don't work even after installation, which neu outputs nothing. Check here for further information about the particular issue. This error is more of an yarn issue. To fix it, the developer needs to add the yarn global bin command output to $PATH. For example, we can add the following command to the .bashrc file (or other Shell interpreter initialization scripts): export PATH="$(yarn global bin):$PATH" For more information, check the official documentation of yarn here. ","version":"Next","tagName":"h3"},{"title":"Framework Developer Guide","type":0,"sectionRef":"#","url":"/docs/contributing/framework-developer-guide","content":"","keywords":"","version":"Next"},{"title":"Setup and build the framework​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#setup-and-build-the-framework","content":" ","version":"Next","tagName":"h2"},{"title":"Cloning the repository​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#cloning-the-repository","content":" First, clone the main repository. git clone https://github.com/neutralinojs/neutralinojs.git cd neutralinojs ","version":"Next","tagName":"h3"},{"title":"Installing compilation tools and dependencies​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#installing-compilation-tools-and-dependencies","content":" Linux​ No need for separate compilers because Linux distributions usually have GNU C/C++ compilers installed already. Install GTK, WebKit, other libraries with the following command. Debian​ sudo apt install \\ libgtk-3-dev \\ libwebkit2gtk-4.0-37 \\ libwebkit2gtk-4.0-dev Fedora​ sudo dnf install \\ @development-tools \\ gtk3 \\ webkit2gtk3.x86_64 \\ webkit2gtk3-devel.x86_64 \\ libgtk-3-dev \\ libwebkit2gtk-4.0-37 \\ libwebkit2gtk-4.0-dev \\ libglib2.0-dev \\ libxrandr-dev Arch​ sudo pacman -S \\ gtk3 \\ webkit2gtk Windows​ Install the latest Visual Studio IDE with Windows SDK. The Neutralinojs compilation process will use the MSVC C++ compiler (aka cl.exe). info How to activate Windows 10 SDK: While installing it in the Visual Studio Installer, go to tab Workloads, section "Desktop & Mobile" and select "Desktop development with C++". On the right in "Installation details" > "Desktop development with C++" > "Optional", make sure "Windows 10 SDK" is checked. macOS​ Install Xcode Command Line Tools. ","version":"Next","tagName":"h3"},{"title":"Compile the Neutralinojs framework.​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#compile-the-neutralinojs-framework","content":" Run the following script in order to build the framework binaries. python scripts/bz.py info You need to have the Python interpreter (version 3.x) installed to run this script. Neutralinojs uses BuildZri C++ build automation tool to generate binaries on local development computers and CI/CD servers. Read the BuildZri documentation to learn more about CLI options and configuration. ","version":"Next","tagName":"h3"},{"title":"Setup and build the client​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#setup-and-build-the-client","content":" Neutralinojs apps communicate with the Neutralinojs process via a WebSocket connection. This WebSocket connection gets initiated by the Neutralinojs client. Clone the client repository to the same directory where you downloaded the main repository. git clone https://github.com/neutralinojs/neutralino.js.git cd neutralino.js Install developer dependencies. npm install ","version":"Next","tagName":"h2"},{"title":"Executing the test app​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#executing-the-test-app","content":" The main repository has a simple test application that you can use during development related activities. You can enter the following command from the main repository to build and update the test app's client. bash ./scripts/update_client.sh Now run the newly compiled test app with the following command. LinuxmacOSWindows ./bin/neutralino-linux_x64 --load-dir-res ","version":"Next","tagName":"h2"},{"title":"Testing​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#testing","content":" Testing is a crucial part in every development activity. Every pull request in the main codebase will trigger the following automated tests. Builds on Linux, macOS, and Windows with x64 machines.Integration test suite. However, you can run our integration test suite from your local computer too with the following command from the main codebase's directory. cd spec npm install npm run test It's always good to run the test suite for the module you've updated with the following command. npm run test <module> # Eg: npm run test filesystem info If you need to run tests for the extensions module, make sure to enter npm install from./bin/extensions/sampleextension first. The above command will run test only for the given module. ","version":"Next","tagName":"h2"},{"title":"Adding a new test case​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#adding-a-new-test-case","content":" To add a test case simply add it to the spec/<module>.spec.js file. For example, if you need to add a new test case to the debug module, add the test case to the spec/debug.spec.js file. Next, run the test suite for that specific module, as shown in the following command snippet: cd spec npm i npm run test debug ","version":"Next","tagName":"h3"},{"title":"Project directory structure​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#project-directory-structure","content":" ","version":"Next","tagName":"h2"},{"title":"Framework​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#framework","content":" Source: github.com/neutralinojs/neutralinojs api: The native API implementation and controllers. Written in REST API style.auth: Authentication and permissions-related logic.bin: Test app source code.lib: Third-party libraries source files.server: WebSocket/HTTP communication endpoints.spec: Integration/API test suite.scripts: Contains automation scripts to build the framework, generate release notes, update the client library, and build resources.neu for the test app. ","version":"Next","tagName":"h3"},{"title":"Client library​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#client-library","content":" Source: github.com/neutralinojs/neutralino.js src/api: JavaScript API frontend and implementaion.src/browser: Browser-related API implementation.src/ws: WebSocket client implementaion.scripts: Contains automation scripts to generate release notes. ","version":"Next","tagName":"h3"},{"title":"Contribution guidelines​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#contribution-guidelines","content":" Before, contributing to the codebase, please check the following things. Discuss the feature/improvement/bug-fix with the Neutralinojs team via GitHub discussions.Get familiar with the code style. Write your code according to theNeutralinojs code style guide.Become familiar with all modules in the codebase.Avoid adding new features to only one platform. Thanks for helping us to make Neutralinojs better! ","version":"Next","tagName":"h2"},{"title":"Distribution Overview","type":0,"sectionRef":"#","url":"/docs/distribution/overview","content":"","keywords":"","version":"Next"},{"title":"Application build results​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#application-build-results","content":" The neu build command generates the following files on any supported operating system into the dist directory. Filename\tOS\tCPU architecture\tTypemyapp-linux_x64\tLinux\tx86_64\tApplication binary myapp-linux_armhf\tLinux\tarmhf\tApplication binary myapp-linux_arm64\tLinux\tarm64\tApplication binary myapp-mac_x64\tmacOS\tx86_64\tApplication binary (Intel) myapp-mac_universal\tmacOS\tx86_64 and arm64\tApplication binary myapp-mac_arm64\tmacOS\tarm64\tApplication binary (M1/M2/M3) myapp-win_x64\tWindows\tx86_64\tApplication binary resources.neu\tall\tN/A\tApplication resource file Neutralinojs officially offers only pre-built x64 and armhf/arm64 Linux-only binaries. If you need binaries for other CPU architectures, consider building binaries from the source with this guide. We are trying to officially support all CPU architectures soon! ","version":"Next","tagName":"h2"},{"title":"Selecting files for packaging​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#selecting-files-for-packaging","content":" The neu CLI generates application binaries for all supported platforms at once. These binaries are pre-built binaries. Therefore, please check oursecurity policy before you continue with the distribution process. As the first step for packaging, you can pick two files for each targeted operating system: application binary and the resource file. For example, if you need to make an application package for x64 Linux computers, pick myapp-linux_x64and the resources.neu file. The resources.neu contains all application resources, so, double click on the binary and check whether the resource file is not corrupted. ","version":"Next","tagName":"h2"},{"title":"Creating portable application packages using build scripts​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#creating-portable-application-packages-using-build-scripts","content":" The hschneider/neutralino-build-scripts community project offers pre-developed build scripts for generating platform-specific application bundles. For example, it generates a standard app structure on GNU/Linux by generating .desktop file with app icon by also providing a shell script to install the app. Clone the scripts to your root directory of your app folder to get started with Neutralinojs build scripts: git clone https://github.com/hschneider/neutralino-build-scripts.git build-scripts Install jq, which is required for parsing JSON files: # On macOS: brew install jq # On Linux or Windows/WSL: sudo apt-get install jq Update neutralino.config.json file with build scripts configuration as follows: "buildScript": { "mac": { "architecture": ["x64", "arm64", "universal"], "minimumOS": "10.13.0", "appName": "myapp", "appBundleName": "myapp", "appIdentifier": "com.marketmix.ext.bun.demo", "appIcon": "resources/icons/icon.icns" }, "win": { "architecture": ["x64"], "appName": "myapp", "appIcon": "resources/icons/icon.ico" }, "linux": { "architecture": ["x64", "arm64", "armhf"], "appName": "myapp", "appIcon": "resources/icons/icon.png", "appPath": "/usr/share/myapp", "appIconPath": "/usr/share/myapp/icon.png", "appIconLocation": "/usr/share/myapp/icon.png" } } ","version":"Next","tagName":"h2"},{"title":"Generating an application bundle for macOS​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#generating-an-application-bundle-for-macos","content":" You can generate a new application bundle for macOS by running the following command: ./build-mac.sh The build is created in the ./dist folder. The buildScript/mac JSON segment in the config-file contains the following fields: Key\tDescriptionarchitecture\tThis is an array of the architectures, you want to build. In our example we build all 3 architectures. minimumOS\tThe minimum macOS version. appName\tThe app-name as displayed in the Finder. appBundleName\tThe macOS app-bundle name. appIdentifier\tThe macOS app-identifier. appIcon\tPath to the app-icon in .icns format. If only the filename is submitted, the file is expected in the project's root. Visit the build scripts official documentation for more details. ","version":"Next","tagName":"h3"},{"title":"Generating an application bundle for Windows​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#generating-an-application-bundle-for-windows","content":" You can generate a new application bundle for Windows by running the following command: ./build-win.sh The build is created in the ./dist folder. You can now run install install-icon.cmd to set the app icon as specifed in config file. This script required you to have Resource Hacker installed on your machine. The buildScript/win JSON segment in the config-file contains the following fields: Key\tDescriptionarchitecture\tThis is an array of the architectures, you want to build. Because Neutralino currently only support 'x64', you should leave this untouched. appName\tThe app-name as displayed in the File Explorer, with or without .exe-suffix. appIcon\tPath to the app-icon in .ico format. If only the filename is submitted, the file is expected in the project's root. The icon is copied from this path into the app-bundle. To apply the icon to the executable file, you'll have to run Resource Hacker from a Windows machine. To do so, just double-click install-icon.cmd in the app-bundle. Visit the build scripts official documentation for more details. ","version":"Next","tagName":"h3"},{"title":"Generating an application bundle for Linux​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#generating-an-application-bundle-for-linux","content":" You can generate a new application bundle for GNU/Linux by running the following command: ./build-linux.sh All build targets are created in the ./dist folder. Calling sudo ./install.sh from your build folder automatically installs the app to the locations you defined. The buildScript/linux JSON segment in the config-file contains the following fields: Key\tDescriptionarchitecture\tThis is an array of the architectures, you want to build. In our example we build all 3 architectures. appName\tThe app-name as displayed in the File Explorer. appIcon\tPath to the app-icon in .png or .svg format. If only the filename is submitted, the file is expected in the project's root. The icon is copied from this path into the app-bundle. Example: resources/icons/icon.png appPath\tThe path of application directory in system where the source files will live after installing without the executable name and without ending slash. Example: /usr/share/myapp appIconPath\tThis is path to application icon after the application has been installed in the Linux system. This path is written to the .desktop-file. Example: /usr/share/myapp/icon.png appIconLocation\tSame as appIconPath. Visit the build scripts official documentation for more details. ","version":"Next","tagName":"h3"},{"title":"Creating application installers​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#creating-application-installers","content":" The following guides are not documented yet. Creating an application installer for LinuxCreating an application installer for macOSCreating an application installer for Windows ","version":"Next","tagName":"h2"},{"title":"Your First Neutralinojs App","type":0,"sectionRef":"#","url":"/docs/getting-started/your-first-neutralinojs-app","content":"","keywords":"","version":"Next"},{"title":"Introduction​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#introduction","content":" We are going to create a simple application using Neutralinojs. This sample application will display Hello with the current username of your operating system. For example, if the current username is John, it will show, Hello John. note This tutorial uses Vanilla JavaScript for building the app. If you would like to use a frontend library, check this guide. ","version":"Next","tagName":"h2"},{"title":"Step 0: Installing neu CLI​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-0-installing-neu-cli","content":" You need to install neu CLI to create Neutralinojs applications. However, you can develop applications without CLI as well. But, the CLI will make some hard stuff easy. Run the following command on your terminal to install neu CLI globally. npm install -g @neutralinojs/neu If you don't want a global installation, use neu CLI with npx. npx @neutralinojs/neu <command> ","version":"Next","tagName":"h2"},{"title":"Step 1: Creating a new app​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-1-creating-a-new-app","content":" Enter the following command to scaffold a new app. neu create myapp The above command will create a new app inside myapp directory. To make sure whether everything is fine, run your application. cd myapp neu run info If you are on Windows, you might get a blank white screen. The reason for this is, accessing localhost from a UWP context is disabled by default. Run the following command with administrative privileges on the command prompt to fix this. CheckNetIsolation.exe LoopbackExempt -a -n="Microsoft.Win32WebViewHost_cw5n1h2txyewy" You may include this in your Windows setup files (with the user's consent) because users also may get an empty white screen on Windows. For better developer experience, we recommend you to install the WebView2 runtime on Windows. ","version":"Next","tagName":"h2"},{"title":"Step 2: Writing JavaScript, HTML, and CSS​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-2-writing-javascript-html-and-css","content":" Insert the following content into your application resource files. index.htmlstyles.cssmain.js <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>NeutralinoJs</title> <link rel="stylesheet" href="styles.css"> </head> <body> <div id="neutralinoapp"> <h1 id="name"></h1> </div> <script src="js/neutralino.js"></script> <script src="js/main.js"></script> </body> </html> Neutralinojs prevents arbitary native API function execution unlike Node.js environments. Here we used the os.getEnv native function, so check whether your application configuration allows the application frontend to execute it. The default configuration already allows the entire os namespace with the following nativeAllowList permission setup: "nativeAllowList": [ "app.*", "os.*", "debug.log" ], We don't need to update anything in the permission setup since it already allows os.getEnv native function calls. ","version":"Next","tagName":"h2"},{"title":"Step 3: Running your application​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-3-running-your-application","content":" As mentioned above, you can use the run command to start your application. neu run Congrats! your application works. info The neu run command will reload your application when there is a change in application resources. Try to change your index.html while the application is running. ","version":"Next","tagName":"h2"},{"title":"Step 4: Building your application ​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-4-building-your-application","content":" To make portable binaries for your application, we can use the build command. Enter the following command on your terminal to make final binaries for all supported platforms.  neu build --release The above command will produce binaries for all platforms into the dist directory and the --release flag will also package your binaries into a .zip file. This command will do the work blazing fast because there is no compilation process behind. ","version":"Next","tagName":"h2"},{"title":"What's next?​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#whats-next","content":" Now you know how to create Neutralinojs applications. We will suggest you to look into the following topics next. neutralino.config.jsonProject structureneu CLIGlobal variablesApplication modesNative API overview We've built the above example application with vanilla JavaScript. However, you can use your favorite frontend framework to build Neutralinojs apps. Check more details about frontend framework support here. ","version":"Next","tagName":"h2"},{"title":"Using Frontend Libraries","type":0,"sectionRef":"#","url":"/docs/getting-started/using-frontend-libraries","content":"","keywords":"","version":"Next"},{"title":"React​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#react","content":" neu create myapp --template codezri/neutralinojs-react cd myapp # Start the React development server with Neutralinojs neu run # Build the React and Neutralinojs app neu build Repository: codezri/neutralinojs-react ","version":"Next","tagName":"h2"},{"title":"Using any frontend library​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#using-any-frontend-library","content":" The following tutorial guides you to set up any frontend library with Neutralinojs by explaining how we built the Neutralinojs React template: ","version":"Next","tagName":"h2"},{"title":"Initializing projects​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#initializing-projects","content":" First, you need to create a new empty Neutralinojs project. Use theneutralinojs/neutralinojs-zero template to create an empty project, as shown below. neu create myapp --template neutralinojs/neutralinojs-zero Now, create a new project with your favourite frontend framework's command-line tools. In this tutorial, we are going to use React, but you can use any frontend library as you wish. You need to create this project inside the myapp directory. cd myapp npx create-react-app react-src ","version":"Next","tagName":"h3"},{"title":"Configuring Neutralinojs project​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#configuring-neutralinojs-project","content":" The neutralinojs-zero template has a pre-included HTML file and icon, so delete the www directory since we don't need those files now. rm -rf www You need to configure the Neutralinojs project to support the frontend framework. First, you can set the document root with your frontend framework's build directory. React typically generates build outputs tobuild directory, so we can update documentRoot as follows. "documentRoot": "/react-src/build/" Now, our Neutralinojs app knows the application resource location, but it's missing an icon, so set an icon for the app. You can load an icon from your frontend framework's default resources directory. For demonstration purposes, let's use the React icon from the public directory. "modes": { "window": { // --- other options "icon": "/react-src/public/logo192.png" } } ","version":"Next","tagName":"h3"},{"title":"Configuring neu CLI​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#configuring-neu-cli","content":" By default, the zero template configuration asks the Neutralinojs CLI to download the Neutralinojs client (aka neutralino.js) from GitHub releases. Then, the CLI creates your app package by copying the neutralino.js file. However, you can download the client library from the NPM registry and bundle with your app frontend. Remove the clientLibrary property from the Neutralinojs configuration to avoid fetching the client from GitHub releases: We can configure CLI for React by using the following options. "cli": { // --- other options "resourcesPath": "/react-src/build/", // --- "clientLibrary": "/www/neutralino.js", // <--- Remove this option // --- } Now, you can build and run the React application as a Neutralinojs application — it's possible with the following steps. First, build the React application with the following command. cd react-src npm run build Finally, run the Neutralinojs application. cd .. neu run ","version":"Next","tagName":"h3"},{"title":"Initializing native API with @neutralinojs/lib​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#initializing-native-api-with-neutralinojslib","content":" You could run the application with the neu run command, but you cannot use the native API yet because it has not been initialized. To do that you need to install the Neutralinojs client with following command: cd react-src npm install @neutralinojs/lib The next step is to load Neutralinojs global variables. You can achieve that by including JavaScript script in the root HTML file of a framework of your choice. React typically holds the main HTML file content in the ./public/index.html file, so we can put the following HTML snippet there to load the client library. <script src="%PUBLIC_URL%/__neutralino_globals.js"></script> Now make sure to initialize the client library from your frontend application entry point file. React's application entry-point is typically ./src/index.js. Therefore, we can do the initialization process from there by calling the init function from @neutralinojs/lib package. import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; // Import init function from "@neutralinojs/lib" import { init } from "@neutralinojs/lib" ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById('root') ); init(); // Add this function call Let's validate if the client library loaded properly. To do that let's use filesystem API in order to read the current directory of Neutralinojs app. Firstly you need to update neutralino.config.json to allow what API your application can call. You can enable the whole namespace filesystem.* or just single function from a given namespace like in the snippet below. "nativeAllowList": [ "app.*", "filesystem.readDirectory" ], Now let's add following snippet in ./src/App.js file which will log the current directory or error message when App component is mounted. import { useEffect } from 'react' import './App.css'; // Import filesystem namespace import { filesystem } from "@neutralinojs/lib" function App() { // Log current directory or error after component is mounted useEffect(() => { filesystem.readDirectory('./').then((data) => { console.log(data) }).catch((err) => { console.log(err) }) }, []) return ( <div className="App"> My Neutralinojs App </div> ); } export default App; The last step is to run your Neutralinojs app with --window-enable-inspector argument which will allow you to open developer tools. cd react-src npm run build cd .. neu run -- --window-enable-inspector The current directory should be logged to the console. To open developer tools right click anywhere in the Neutralinojs application and press inspect element. ","version":"Next","tagName":"h3"},{"title":"Enabling hot-reload and configuration​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#enabling-hot-reload-and-configuration","content":" Building every code change and testing your application is undoubtedly time-consuming. Therefore, you can use your frontend framework's HMR (Hot Module Replacement) features to speed up your development activities. But, we have a small issue here. There are now two HTTP servers: the Neutralinojs resource server and the frontend framework's development server. How can we load the Neutralinojs client library from the frontend framework's development server? Don't worry — neu CLI provides a built-in feature to enable HMR by patching the main HTML file. You can add the following section to your configuration file for activating hot-reloading. "cli": { // --- other options "frontendLibrary": { "patchFile": "/react-src/public/index.html", "devUrl": "http://localhost:3000" } } } The above options tell neu CLI about the main HTML file and development server URL. Next, configure your project by adding frontend-library-specific development commands as follows: "cli": { // --- other options "frontendLibrary": { "patchFile": "/react-src/public/index.html", "devUrl": "http://localhost:3000", "projectPath": "/react-src/", "initCommand": "npm install", "devCommand": "BROWSER=none npm start", "buildCommand": "npm run build" } } } Finally, run the Neutralinojs application with the following command. neu run The above command executes the devCommand, starts the React development server, and run the Neutralinojs app in development mode. ","version":"Next","tagName":"h3"},{"title":"Packaging​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#packaging","content":" To produce the app binaries, you can use the following command, as usual: neu build --release The above command executes the buildCommand first, so the application bundle will use the currect React project source. See the full source code of this tutorial here. ","version":"Next","tagName":"h3"},{"title":"Auto Updater","type":0,"sectionRef":"#","url":"/docs/how-to/auto-updater","content":"","keywords":"","version":"Next"},{"title":"Creating the update manifest​","type":1,"pageTitle":"Auto Updater","url":"/docs/how-to/auto-updater#creating-the-update-manifest","content":" When you ask Neutralinojs to check for updates, it will check the update manifest via the network. Update manifest refers to a JSON document which has the following format. { "applicationId": "js.neutralino.sample", "version": "0.0.2", "resourcesURL": "http://example.com/updater_test/update_res.neu", "data": { } } applicationId String: Application identifier. You need to use the same name you used in neutralinojs.config.json. Otherwise, the update check operation will not proceed.version String: Application version.resourcesURL String: A link to download resources.neu. You can use any file name as you wish, but make sure to serve data with the Content-Type: application/octet-stream header.data Object (optional): Additional data about the update. Accepts any JSON value. ","version":"Next","tagName":"h2"},{"title":"Hosting the update manifest and resources​","type":1,"pageTitle":"Auto Updater","url":"/docs/how-to/auto-updater#hosting-the-update-manifest-and-resources","content":" Host the application manifest and resources file on the internet or a private network according to your access requirements. You can test auto updater locally by setting up a static server or placing update manifest and the resource file into your application's resources directory. Also, you can setup a DevOps pipeline to automate your application updates if you need. If you release a new application version by upgrading Neutralinojs server, users have to download/install the app again since the auto updater only update application resources (including Neutralinojs client). ","version":"Next","tagName":"h2"},{"title":"Writing code to update your app​","type":1,"pageTitle":"Auto Updater","url":"/docs/how-to/auto-updater#writing-code-to-update-your-app","content":" Call the following function whenever you need to check for updates. try { let url = "http://example.com/updater_test/update_manifest.json"; let manifest = await Neutralino.updater.checkForUpdates(url); } catch(err) { // Handle errors } Next, you can use the manifest object to compare versions. try { let url = "http://example.com/updater_test/update_manifest.json"; let manifest = await Neutralino.updater.checkForUpdates(url); if(manifest.version != NL_APPVERSION) { await Neutralino.updater.install(); await Neutralino.app.restartProcess(); } } catch(err) { // Handle errors } As shown in the above code snippet, you can call Neutralino.updater.install to perform the update based on the downloaded manifest. Later, restart the application with the app.restartProcess function. ","version":"Next","tagName":"h2"},{"title":"Extensions Overview","type":0,"sectionRef":"#","url":"/docs/how-to/extensions-overview","content":"","keywords":"","version":"Next"},{"title":"Defining the extensions​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#defining-the-extensions","content":" First, you need to define extensions you use in neutralinojs.config.json with the following structure. "extensions": [ { "id": "js.neutralino.sampleextension", "commandLinux": "${NL_PATH}/extensions/binary/linux/ext_bin", "commandDarwin": "${NL_PATH}/extensions/binary/mac/ext_bin", "commandWindows": "${NL_PATH}/extensions/binary/win/ext_bin.exe" }, { "id": "js.neutralino.binaryextension", "command": "node ${NL_PATH}/extensions/binary/main.js", } ] id String: A unique key to identify each extension. This id cannot contain any characters except for letters, numbers, and periods.command String (optional): A cross-platform command to start the extension. Eg: node ${NL_PATH}/extensions/binary/main.jswill work on every platform.commandLinux String (optional): Extension startup command for Linux.commandDarwin String (optional): Extension startup command for macOS.commandWindows String (optional): Extension startup command for Windows. ","version":"Next","tagName":"h2"},{"title":"Enable the extensions feature​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#enable-the-extensions-feature","content":" The extensions API is disabled by default. Enable extensions by adding the following setting to your app config. "enableExtensions": true ","version":"Next","tagName":"h2"},{"title":"Connecting an extension with Neutralinojs​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#connecting-an-extension-with-neutralinojs","content":" As you already noticed, an extension is just a separate process. Neutralinojs starts spawning extension instances during the framework bootstrap process and initiates each extension process by sending the following JSON object via standard input streams: { "nlPort": "", "nlToken": "", "nlConnectToken": "", "nlExtensionId": "" } The above JSON properties contains connectivity information as follows: nlPort: port of the Neutralinojs server.nlToken: Access token to use the native API.nlConnectToken: A token that extension should send during WebSocket connection initialization.nlExtensionId: Extension identifier. Now, you can connect with the Neutralinojs server with the above details. Use the following WebSocket URL to initiate a new WebSocket connection. ws://localhost:{port}?extensionId={extensionId}&connectToken={connectToken} ","version":"Next","tagName":"h2"},{"title":"Sending a message from app to an extension​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#sending-a-message-from-app-to-an-extension","content":" The extensions API uses an event-based messaging protocol. Every message uses the following JSON structure. { "event": "<event_name>", "data": {} } Use the built-in extensions API to send a message to any extension, as shown below. let extension = 'js.neutralino.sampleextension'; let event = 'helloExtension'; let data = { testValue: 10, }; await Neutralino.extensions.dispatch(extension, event, data); The above code snippet sends a message to the js.neutralino.sampleextension extension instance. You can send messages to extensions with the dispatch function anytime. If you send a message before the extension connects with the main process, the Neutralinojs client library queues and sends it when the target extension's connection is established. In other words, you don't need to worry about extensions' status when you send messages to extensions. ","version":"Next","tagName":"h2"},{"title":"Sending a message from the extension to app​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#sending-a-message-from-the-extension-to-app","content":" When you connect your extensions with the Neutralinojs main process, you can call the native API by sending WebSocket messages to the Neutralinojs process directly. Neutralinojs server processes messages based on the following format. { "id": "<id>", "method": "<method>", "accessToken": "<token>", "data": {} } id String: A UUID v4 string.method String: Native method name. Eg: window.setTitle.accessToken String: Access token generated by the Neutralinojs server.data Object (optional): Parameters for the native method. You can invoke the app.broadcast native method to send messages to all app instances. Register a callback with the events.on in the application code to receive the message send by the extension process. ","version":"Next","tagName":"h2"},{"title":"Terminating an extension instance​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#terminating-an-extension-instance","content":" When Neutralino exits, it does not send kill signals to all extension instances. Therefore, it is necessary to stop the extension process when the WebSocket-based IPC (Inter-Process Communication) closes. The following Node.js extension code shows how to do this: const fs = require('fs'); const process = require('process'); const WS = require('websocket').w3cwebsocket; const { v4: uuidv4 } = require('uuid'); const chalk = require('chalk'); // Obtain required params to start a WS connection from stdIn. const processInput = JSON.parse(fs.readFileSync(process.stdin.fd, 'utf-8')); const NL_PORT = processInput.nlPort; const NL_TOKEN = processInput.nlToken; const NL_CTOKEN = processInput.nlConnectToken; const NL_EXTID = processInput.nlExtensionId; const client = new WS( `ws://localhost:${NL_PORT}?extensionId=${NL_EXTID}&connectToken=${NL_CTOKEN}` ); client.onerror = () => log("Connection error!", "ERROR"); client.onopen = () => log("Connected"); client.onclose = () => process.exit(); client.onmessage = (e) => { const { event, data } = JSON.parse(e.data); if (event === "eventToExtension") { log(data); client.send( JSON.stringify({ id: uuidv4(), method: "app.broadcast", accessToken: NL_TOKEN, data: { event: "eventFromExtension", data: "Hello app!" }, }) ); } }; function log(message, type = "INFO") { const logLine = `[${NL_EXTID}]: ${chalk[ type === "INFO" ? "green" : "red" ](type)} ${message}`; console[type === "INFO" ? "log" : "error"](logLine); } This code implements a simple Node.js extension for Neutralinojs, which establishes a WebSocket connection to the Neutralinojs server and handles incoming messages from the server. It also sends a message to the server using the client.send method when it receives a specific event from the server. For more information on how to terminate an extension instance, you can refer to the sample extension source.https://github.com/neutralinojs/neutralinojs/tree/main/bin/extensions/sampleextension ","version":"Next","tagName":"h2"},{"title":"Using Neutralinojs from your source files​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#using-neutralinojs-from-your-source-files","content":" The above approach helps you to extend Neutralinojs API with a custom backend code. Neutralinojs process can spawn multiple extensions as child processes and communicate with the internal messaging protocol. On the other hand, you can spawn Neutralinojs processes from your own processes and communicate with the same messaging protocol. Using this approach, it's possible to write Neutralinojs apps with any backend language. You can obtain authentication details for the Neutralinojs process by setting your config as below. "exportAuthInfo": true The above setting exports authentication details to ${NL_PATH}/.tmp/auth_info.json with the following format. { "nlPort": "<port>", "nlToken": "<token>", "nlConnectToken": "<connect_token>" } Connect with the Neutralinojs process by using the extension API as usual with the extension identifier you used in the application configuration file. ","version":"Next","tagName":"h2"},{"title":"CLI","type":0,"sectionRef":"#","url":"/docs/release-notes/cli","content":"","keywords":"","version":"Next"},{"title":"Unreleased​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#unreleased","content":" ","version":"Next","tagName":"h2"},{"title":"v11.2.2​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1122","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements","content":" Fix initial loading issues with frontend library development file patching. ","version":"Next","tagName":"h3"},{"title":"v11.2.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1120","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler","content":" Introduce the --clean flag to the neu build command to clean previous build files.Add file excluding feature for the app bundle and extensions directory via cli.resourcesExclude and cli.extensionsExclude configuration properties. For example, now developers can use the "resourcesExclude": ".*\\\\.scss$|.*\\\\.d.ts$" configuration to exclude *.scss and *.d.ts files from the final app bundle.Let app developers customize the frontend library development server wait time using the cli.frontendLibrary.waitTimeout configuration property. ","version":"Next","tagName":"h2"},{"title":"Core: Version​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-version","content":" The neu version command now compares the installed CLI version and the framework version with the latest released versions and displays a warning messages if the users use an older versions.The neu version command now displays the (latest) tag with CLI, binary, client library version details. ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-1","content":" Check and validate neutralino.config.json file before executing app-specific commands.Check app template validity before downloading content from a specific GitHub repository using the official GitHub API.Add the app icon to the final app bundle only the specific project uses an app icon.Fix the port waiting timeout issue with frontend library-based development workflow. ","version":"Next","tagName":"h3"},{"title":"v11.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1110","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-1","content":" Add cli.distributionPath into the neutralino.config.json file to customize the default dist distribution directory. ","version":"Next","tagName":"h3"},{"title":"v11.0.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1101","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-2","content":" Clean existing app build files before creating another build using the neu build command.Support older Node versions by removing the optional chaining feature usage.Fix the endless port waiting issue with the --frontend-lib-dev option. ","version":"Next","tagName":"h3"},{"title":"v11.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1100","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner","content":" Change the WebSocket connection based on the v5 framework APIs. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-3","content":" Fixed issues with the frontend library command execution. ","version":"Next","tagName":"h3"},{"title":"v10.1.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1011","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-4","content":" Fixed app development issues with the Vite server. ","version":"Next","tagName":"h3"},{"title":"v10.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1010","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-5","content":" Fixed several issues in the frontend-library-based development flow (i.e., removed the hardcoded port number, fixed double devCommand execution, etc.,). ","version":"Next","tagName":"h3"},{"title":"v10.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1000","content":" ","version":"Next","tagName":"h2"},{"title":"Core: frontend-library-based development​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-frontend-library-based-development","content":" Added new configuration options to the cli.frontendLibrary key of the neutralino.config.json: projectPath: Sets the project path of the frontend-library project. This path will be used as the current directory while executing the frontend-app-related commands.initCommand: A command that gets executed after downloading an app template with the neu create command.devCommand: This command will run with the neu run command to start the frontend development server. The CLI doesn't wait for devCommand completion, instead, it will wait for the frontend development server via the tcp-port-used package.buildCommand: The neu build command will execute this command before generating the app bundle, so you can generate static resources of your frontend app using this command. ","version":"Next","tagName":"h3"},{"title":"v9.8.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v980","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Downloader​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloader","content":" Download the latest Neutralinojs framework resources with the --latest option in the neu update command.If framework versions are not present in the app/template configuration, download the latest framework resources automatically. The CLI will download nightly releases if it can't fetch the latest release tag because of an GitHub API-related issue (i.e., Exceeded rate limits). ","version":"Next","tagName":"h3"},{"title":"v9.7.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v970","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Downloader/bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloaderbundler","content":" Download the TypeScript definition file for standalone client library mode. This won't include the TypeScript definition file to the final application bundle. ","version":"Next","tagName":"h3"},{"title":"v9.6.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v961","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/Improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-6","content":" Fix the hot-reloading issue that occurs with newer Node runtime versions. ","version":"Next","tagName":"h3"},{"title":"v9.6.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v960","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-2","content":" Avoid copying the WebView2Loader.dll file to the final app package since it was removed from the Neutralinojs framework. ","version":"Next","tagName":"h3"},{"title":"v9.5.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v951","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/Improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-7","content":" Use the decompress library instead of unzipper to fix issues with latest Node.js runtime versions.Generate the Mac universal binary with the neu build command. ","version":"Next","tagName":"h3"},{"title":"v9.5.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v950","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#devops","content":" Implement a way to test plugins locally. ","version":"Next","tagName":"h3"},{"title":"v9.4.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v940","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps: new test suite​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#devops-new-test-suite","content":" Initiate a new Node.js-based test suite. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/Improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-8","content":" Clean project files if the neu create command wan't successful.Display an error message if the neu build --copy-storage fails due to missing .storage directory.Support Darwin arm64 binaries natively without binary translation (x64 -> arm64).Make the client library downloading process optional and support importing the client library via @neutralinojs/lib.Download the module version of the client library based on the app configuration. ","version":"Next","tagName":"h3"},{"title":"v9.3.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v931","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Plugins​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-plugins","content":" Automatically re-install plugins when the neu CLI version is upgraded/downgraded via package managers. ","version":"Next","tagName":"h3"},{"title":"Core: downloader/builder​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloaderbuilder","content":" Support ARM (armhf/arm64) binaries. ","version":"Next","tagName":"h3"},{"title":"v9.3.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v930","content":" ","version":"Next","tagName":"h2"},{"title":"General​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#general","content":" Add short descriptions for each command.Support to download nightly build versions. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-9","content":" Fix plugin listing issue. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#devops-1","content":" Add a simple test-suite for testing CLI commands with a Bash script. ","version":"Next","tagName":"h3"},{"title":"v9.2.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v920","content":" ","version":"Next","tagName":"h2"},{"title":"General​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#general-1","content":" Improve log messages and styles ","version":"Next","tagName":"h3"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-1","content":" Display Neutralinojs process's STDIN and STDERR streams directly on the console.Remove --verbose option from the run command. ","version":"Next","tagName":"h3"},{"title":"v9.1.2​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v912","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-2","content":" Fix client library path issue with hot-reload workaround on Windows. ","version":"Next","tagName":"h3"},{"title":"v9.1.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v911","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixes","content":" Fix browser mode exit issue with neu run. ","version":"Next","tagName":"h3"},{"title":"v9.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v910","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-3","content":" Add a workaround to use hot module reloading from the app developer's existing frontend library/framework. ","version":"Next","tagName":"h3"},{"title":"v9.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v900","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Creator​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-creator","content":" Allow downloading any community template via neu create myapp --template <template>. <template> accepts valid GitHub repo identifiers. The default value is neutralinojs/neutralinojs-minimal. ","version":"Next","tagName":"h3"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-4","content":" Add --verbose option to identify framework initialization crashes. It will show STDERR and STDOUT of the framework once the process was terminated.Support sending any internal CLI argument to the Neutralinojs process via neu run -- <additional_args>.Remove --mode=<mode> option from run since the same work can be done with neu run -- --mode=<mode>. ","version":"Next","tagName":"h3"},{"title":"Bugfixes and improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixes-and-improvements","content":" Fix the infinite retry issue with the neu run command.Show an error message for download failures. ","version":"Next","tagName":"h3"},{"title":"v8.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v810","content":" ","version":"Next","tagName":"h2"},{"title":"Core: File watcher​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-file-watcher","content":" Exclude auto-reload files via cli.autoReloadExclude.Watch only the cli.resourcesDir to avoid many unwanted reloads. ","version":"Next","tagName":"h3"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-3","content":" Add new --copy-storage flag to automatically copy storage data to the app bundle. ","version":"Next","tagName":"h3"},{"title":"v8.0.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v801","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-4","content":" Make cli.extensionsDir optional for bundling process. ","version":"Next","tagName":"h3"},{"title":"Bugfixes​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixes-1","content":" Fix an issue in websocket error log. ","version":"Next","tagName":"h3"},{"title":"v8.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v800","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-5","content":" Copy extensions to the app bundle.Rename res.neu to resources.neu. ","version":"Next","tagName":"h3"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-5","content":" Use websocket connection to auto reload app. ","version":"Next","tagName":"h3"},{"title":"v7.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v710","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Downloader​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloader-1","content":" Use server/client versions from config ","version":"Next","tagName":"h3"},{"title":"neu version​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#neu-version","content":" Removed global Neutralino version details ","version":"Next","tagName":"h3"},{"title":"Client Library","type":0,"sectionRef":"#","url":"/docs/release-notes/client-library","content":"","keywords":"","version":"Next"},{"title":"Unreleased​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#unreleased","content":" ","version":"Next","tagName":"h2"},{"title":"v5.3.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v530","content":" ","version":"Next","tagName":"h2"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem","content":" Expose filesystem.getAbsolutePath(path), filesystem.getRelativePath(path, ?base), and filesystem.getPathParts(path) functions. ","version":"Next","tagName":"h3"},{"title":"v5.2.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v520","content":" ","version":"Next","tagName":"h2"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-1","content":" Accept overwrite, skip, and recursive options for the filesystem.copy() function. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#bugfixesimprovements","content":" Improve the window.create() function's option-to-CLI argument mapping logic. ","version":"Next","tagName":"h3"},{"title":"v5.1.1​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v511","content":" ","version":"Next","tagName":"h2"},{"title":"NPM​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#npm","content":" Fix the NPM package import issue. ","version":"Next","tagName":"h3"},{"title":"v5.1.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v510","content":" ","version":"Next","tagName":"h2"},{"title":"API: clipboard​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-clipboard","content":" Export new framework functions: clipboard.getFormat(), clipboard.readImage(), and clipboard.writeImage(image). ","version":"Next","tagName":"h3"},{"title":"TypeScript​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#typescript","content":" Separate type definitions into a new directory to improve project structure.Add missing type definitions. ","version":"Next","tagName":"h3"},{"title":"v5.0.1​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v501","content":" ","version":"Next","tagName":"h2"},{"title":"TypeScript​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#typescript-1","content":" Fix type declaration issues with the window global object. Now, window.NL_VERSION, etc. won't display errors on code editors or with the TypeScript compiler. ","version":"Next","tagName":"h3"},{"title":"v5.0.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v500","content":" ","version":"Next","tagName":"h2"},{"title":"API: app​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-app","content":" Expose app.readProcessInput(readAll=false), app.writeProcessOutput(), and app.writeProcessError() functions. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-2","content":" Export/deprecate functions based on framework's v5 release. See framework changelog for more details. ","version":"Next","tagName":"h3"},{"title":"v3.13.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3130","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window","content":" Add extendUserAgentWith and exitProcessOnClose options to window.create TypeScript definition. ","version":"Next","tagName":"h3"},{"title":"v3.12.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3120","content":" ","version":"Next","tagName":"h2"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#improvementsbugfixes","content":" Improved the performance of the draggable regions API by throttling Neutralino framework function calls.Fix the restarting issue that happens when the app path contains spaces. ","version":"Next","tagName":"h3"},{"title":"v3.11.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3110","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-1","content":" Avoid saving the window state for child windows in the window.create function by using the --window-use-saved-state=false internal CLI argument. ","version":"Next","tagName":"h3"},{"title":"v3.10.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3100","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-2","content":" Export the window.center function. ","version":"Next","tagName":"h3"},{"title":"v3.9.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v390","content":" ","version":"Next","tagName":"h2"},{"title":"API: file watchers​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-file-watchers","content":" Export filesystem.createWatcher and filesystem.removeWatcher functions. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#devops","content":" Publish to NPM only if there are unreleased changes in changelog. ","version":"Next","tagName":"h3"},{"title":"v3.8.2​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v382","content":" ","version":"Next","tagName":"h2"},{"title":"NPM/ESM support​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#npmesm-support","content":" Add ESM support for the client library via neutralino.mjs.Publish (and automate) the client library as an NPM package,@neutralinojs/lib. ","version":"Next","tagName":"h3"},{"title":"v3.8.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v380","content":" ","version":"Next","tagName":"h2"},{"title":"API: custom methods and file streams​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-custom-methods-and-file-streams","content":" Expose functions in framework's custom methods and file streams implementations. ","version":"Next","tagName":"h3"},{"title":"v3.7.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v370","content":" ","version":"Next","tagName":"h2"},{"title":"API: os, filesystem, storage, and computer​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-os-filesystem-storage-and-computer","content":" Expose new framework functions: os.getEnvs, storage.getKeys, and computer.getMousePosition.Add size and pos options to filesystem.readFile and filesystem.readBinaryFile functions. ","version":"Next","tagName":"h3"},{"title":"v3.6.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v360","content":" ","version":"Next","tagName":"h2"},{"title":"API: System information API​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-system-information-api","content":" Expose the new system information API functions: computer.getArch, computer.getKernelInfo, computer.getOSInfo, computer.getCPUInfo, and computer.getDisplays. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-os","content":" Add the defaultPath option to set the default file path for all file dialogs. ","version":"Next","tagName":"h3"},{"title":"v3.5.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v350","content":" ","version":"Next","tagName":"h2"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-3","content":" Expose createdAt and modifiedAt JavaScript timestamps with the filesystem.getStats function. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-os-1","content":" Add new functions for spawning processes. spawnProcess, getSpawnedProcesses, and updateSpawnedProcess. ","version":"Next","tagName":"h3"},{"title":"v3.4.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v340","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#devops-1","content":" Add nightly builds support. Developers can download the nightly builds by setting cli.clientVersion to nightly. ","version":"Next","tagName":"h3"},{"title":"Core: global variables​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-global-variables","content":" Add NL_CCOMMIT to hold the release commit of the client library. ","version":"Next","tagName":"h3"},{"title":"v3.3.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v330","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-3","content":" Add window.getPosition to get the current window coordinates. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-4","content":" Add filesystem.appendFile to append text content to a file. Thrown errors are similar to the filesystem.writeFile function.Add filesystem.appendBinaryFile to append binary content to a file. Thrown errors are similar to the filesystem.writeBinaryFile function. ","version":"Next","tagName":"h3"},{"title":"v3.2.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v320","content":" ","version":"Next","tagName":"h2"},{"title":"API: init​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-init","content":" Store NL_TOKEN in sessionStorage and handle native API calls after page reload.Show a message to the user via HTML if NL_TOKEN is not valid (Eg: when the user tries to open the app from another client with one-time token). ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-4","content":" Add window.setAlwaysOnTop(bool).Add window.getSize. ","version":"Next","tagName":"h3"},{"title":"v3.1.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v310","content":" ","version":"Next","tagName":"h2"},{"title":"API: clipboard​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-clipboard-1","content":" clipboard.readText and clipboard.writeText functions added. ","version":"Next","tagName":"h3"},{"title":"v3.0.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v300","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Extensions​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-extensions","content":" Extension API functions. Queue messages dispatched to extensions and send when the extension is ready. ","version":"Next","tagName":"h3"},{"title":"Core: Init​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-init","content":" Reload app based on --neu-dev-auto-reload (--debug-mode removed) with the neuDev_reloadApp event. ","version":"Next","tagName":"h3"},{"title":"API: window.create​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-windowcreate","content":" Return process information with the promise. ","version":"Next","tagName":"h3"},{"title":"API: window.setDraggableRegion​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-windowsetdraggableregion","content":" Allow passing DOM element as the param. ","version":"Next","tagName":"h3"},{"title":"API: window.unsetDraggableRegion​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-windowunsetdraggableregion","content":" Newly introduced method to remove draggable region handlers from an element. ","version":"Next","tagName":"h3"},{"title":"API: Updater​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-updater","content":" Updater API functions. ","version":"Next","tagName":"h3"},{"title":"Improvements​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#improvements","content":" Make return values of events namespace functions consistent.Rename res.neu to resources.neu. ","version":"Next","tagName":"h3"},{"title":"Core: Ping on browsers​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-ping-on-browsers","content":" Polling action to the server was removed and replaced by the server process's internal idle check. app.keepAlive was removed. ","version":"Next","tagName":"h3"},{"title":"Events​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#events","content":" Client-side implementaion of extensionReady.Allow developers to call native APIs without depending on the ready event (it's not removed becuase of the internal usage). ","version":"Next","tagName":"h3"},{"title":"Framework","type":0,"sectionRef":"#","url":"/docs/release-notes/framework","content":"","keywords":"","version":"Next"},{"title":"Unreleased​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#unreleased","content":" ","version":"Next","tagName":"h2"},{"title":"v5.3.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v530","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: window transparency on Windows​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-window-transparency-on-windows","content":" Window transparency support was added on the Windows version of the Neutralinojs framework. This can be activated with modes.window.transparent configuration property or --window-transparent command-line option. Unlike in other platforms, Windows native window becomes borderless (window controls will be hidden) with the activation of the transparent mode. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os","content":" Add the temp key for the supported directory list of the os.getPath(pathKey) function. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem","content":" Add the filesystem.getAbsolutePath(path) function to let developers get a full path string from a relative path string.Add the filesystem.getRelativePath(path, ?base) function to get a relative path from a path and a base path.Add the filesystem.getPathParts(path) to parse and get path segments like filename, extension, root path, etc. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes","content":" Fix Unicode issues in the Windows version with filesystem, storage, and general modules.Fix standard output/error data display issues on Windows ","version":"Next","tagName":"h3"},{"title":"v5.2.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v520","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: Configless framework initialization​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-configless-framework-initialization","content":" Now, developers can load the Neutralinojs framework without creating a neutralino.config.json file. Now, there is no mandatory configuration properties since Neutralinojs set reasonable defaults. Developers can launch the framework using the following methods without a configuration file: # Loading a remote URL ./framework-bin --url=https://neutralino.js.org/docs # Launches a local static web app ./framework-bin --url="/resources/" --window-title="My web app" --enable-server ","version":"Next","tagName":"h3"},{"title":"Configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration","content":" New internal CLI arguments added: --single-page-serve, --enable-native-api and --document-root=<string> ","version":"Next","tagName":"h3"},{"title":"Core: Static server SPA (Single Page App) serving​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-static-server-spa-single-page-app-serving","content":" Earlier, Neutralinojs app developers had to use hash routing with their frontend-library-based apps since the internal static server didn't offer an inbuilt URL rewrite logic for SPAs (Single Page Apps). Now, they can use the singlePageServe: true option in the app configuration file to activate SPA routing. If this setting is on, the static server will serve the main index.html file when it receives directory requests that possibly send HTTP 404 status. For example, the /invoices path serves the main index.html file if there is no directory named invoices which holds an index.html file. ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window","content":" Improve the behaviour of the window.show() function on Windows. Now, this function flashes the window if it's already in foreground and activates the window properly if it's minimized. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-1","content":" Fix path issues with the defaultPath option in system file dialogs on Windows. ","version":"Next","tagName":"h3"},{"title":"v5.1.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v510","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: window transparency​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-window-transparency","content":" Neutralinojs offers the inbuilt borderless mode and draggable region API to create custom window frames using HTML and CSS. Earlier, Neutralinojs used a default opaque color (usually white) for the window and webview layer, so app developers couldn't make custom CSS-styled window frames transparent or implement custom window frame shapes (i.e., rounded edges). Now, it offers the window.transparent boolean flag to activate window transparency. If the transparency mode is on, the Neutralinojs window and webview use an alpha color layer and become transparent, so developers can use the rgba CSS color function on body background to handle the transparency level of the app. The transparency mode can be activated using the --window-transparent=<bool> internal command-line option too. Note: This feature is not implemented for the Windows operating system yet. ","version":"Next","tagName":"h3"},{"title":"API: clipboard​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-clipboard","content":" Implement clipboard.readImage() and clipboard.writeImage(image) functions to work with clipboard image data.Expose the clipboard.clear() function to clear system clipboard.Expose the clipboard.getFormat() function to check the system clipboard data format. This function returns text, image, and unknown enum values based on existing data on the clipboard. ","version":"Next","tagName":"h3"},{"title":"v5.0.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v500","content":" ","version":"Next","tagName":"h2"},{"title":"API: Reading, writing with standard streams​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-reading-writing-with-standard-streams","content":" Implement app.readProcessInput(readAll=false) for reading string data from the standard input stream. This function can read a single line or multiple lines at once.Implement app.writeProcessOutput and app.writeProcessError for sending string data to standard output and error streams accordingly. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-1","content":" Enable default recursive behavior in the filesystem.createDirectory function.Add filesystem.copy, filesystem.move, and filesystem.remove functions.Add {recursive} options object to filesystem.readDirectory(path, options) activate recursive directory listing. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os-1","content":" Accept stdin with the background mode of the os.execCommand function. ","version":"Next","tagName":"h3"},{"title":"Core: security​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-security","content":" Now, all app clients and extensions require a valid connect token (A part of the NL_TOKEN) to connect to the Neutralinojs framework WebSocket server to receive app events.The framework now sends the access token, connect token, port, and extension identifier to extension processes via the standard input, so other processes can't read them by scanning the process list.The WebSocket client connection origin is checked during the HTTP/WS handshake to make sure that only local clients connect with a specific Neutralinojs app that runs on window, browser, or Chrome mode. Any URL origin is allowed for the cloud mode.The above security enhancements fix two security advisories on GitHub. ","version":"Next","tagName":"h3"},{"title":"Global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#global-variables","content":" Now the NL_ARCH global variable returns the same value that computer.getArch returns. ","version":"Next","tagName":"h3"},{"title":"Deprecations​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#deprecations","content":" Removed filesystem.removeFile, filesystem.removeDirectory, filesystem.copyFile, and filesystem.moveFile functions.Extensions won't receive --nl-port, --nl-token, and --nl-extension-id as command-line arguments. Now the framework sends these via stdin as a JSON string. ","version":"Next","tagName":"h3"},{"title":"v4.15.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4150","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: custom user agent string​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-custom-user-agent-string","content":" Developers sometimes use the user agent string to indentify the client in server-side and client-side source codes. Now, Neutralinojs lets app developers extend the default user agent string with a custom string via the window.extendUserAgentWith configuration property and the --window-extend-user-agent-with=<string> command-line option, as shown in the following example: "window": { // --- "extendUserAgentWith": "MyAppClient" } The above configuration extends the user agent string: console.log(navigator.userAgent) // <Default UA> MyAppClient ","version":"Next","tagName":"h3"},{"title":"Configuration: custom configuration files​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-custom-configuration-files","content":" The Neutralinojs framework typically loads the application configuration content from the neutralino.config.json file, but sometimes app developers need to use a custom configuration filename during development (i.e., For separating production and development environments). Now, you can use the --config-file=<filename> internal command-line parameter to use a custom app configuration, as shown in the following example: ./myapp-linux_x64 --load-dir-res --config-file=neutralino-dev.config.json ","version":"Next","tagName":"h3"},{"title":"v4.14.1​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4141","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops","content":" Use Windows 2019 server and macOS 11 (Big Sur) to compile framework release artifacts.Set minimum supported macOS version via MACOSX_DEPLOYMENT_TARGET=10.7 ","version":"Next","tagName":"h3"},{"title":"v4.14.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4140","content":" ","version":"Next","tagName":"h2"},{"title":"Filesystem API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#filesystem-api","content":" Introduce the filesystem.getWatchers function to get all created watchers.Add binary file reading support for the filesystem.updateOpenedFile(id, action, data) function. This function implements readBinary and readAllBinary actions and dataBinary output action in the openedFile global event.Return the existing watcher identifier from filesystem.createWatcher if there is an existing active watcher for the given path. ","version":"Next","tagName":"h3"},{"title":"OS API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#os-api","content":" Add a way to set current working directory for process creation functions: os.execCommand(command, options) now supports cwd via the options object and os.spawnProcess(command, cwd) accepts currently working directory via the second string parameter. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-2","content":" Fix Unicode charactor issues in the tray menu on Windows.Avoid including null bytes to file reader events initiated by the filesystem.openFile function.Discard window method executions on non-window modes. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-1","content":" Update external GitHub Action packages to their latest versions.Fix issues of the failing test cases ","version":"Next","tagName":"h3"},{"title":"v4.13.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4130","content":" ","version":"Next","tagName":"h2"},{"title":"Core: persistent window state​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-persistent-window-state","content":" Now the framework stores the primary window state in a temporary file (JSON formatted) and loads during the startup process. This feature stores and sets the window position (x, y coordinates), size (width and height), and maximized status. This feature is enabled by default in all platforms, but app developers can turn it off by using false for the window.useSavedState configuration attribute or --window-use-saved-state internal CLI argument. Also, the window state loading status is available via the NL_WSAVSTLOADED global variable. The framework sets true for this boolean variable if the window state was loaded from the saved configuration. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-3","content":" Fix several issues in the webview Windows code (i.e., Wait for the window close event, window style fixes, etc.). ","version":"Next","tagName":"h3"},{"title":"v4.12.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4120","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-1","content":" Add window.center to center the application window programmatically. ","version":"Next","tagName":"h3"},{"title":"Core: configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-configuration","content":" Setting the initial window position via modes.window.x and modes.window.y integer config props.Centering the window at startup via modes.window.center boolean config props.Add config overrides for the startup window position: --window-center=<true|false>, --window-x=<int> and --window-y=<int> ","version":"Next","tagName":"h3"},{"title":"Core: webview​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-webview","content":" Statically link the Webview2 loader library on Windows, so app developers can package their apps without including the WebView2Loader.dll file. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-4","content":" Added Unicode characters support for Neutralinojs Windows. ","version":"Next","tagName":"h3"},{"title":"v4.11.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4110","content":" ","version":"Next","tagName":"h2"},{"title":"API: File watchers​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-file-watchers","content":" In some scenarios, Neutralinojs app developers need to implement file watchers in their apps. Earlier, Neutralinojs API didn't offer a native file watcher API and developers had to use less-performant workarounds, such as making recursive filesystem.readDirectory calls. The new file watchers API lets you create native, cross-platform, event-based file watchers for filesystem paths with the following functions: filesystem.createWatcher(path): Creates a new file watcher for a given path and returns the watcher identifier.filesystem.removeWatcher(watcherId): Removes a files watcher based on a file watcher identifier. Whenever a filesystem change occurs, file watcher instances dispatch the watchFile event with the following data: id: Watcher identifieraction: Filesystem change: add, delete, modified, and moveddir: Directory pathfilename: Modified file ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-5","content":" Fix the initial window flashing and hidden window state issues on Windows.Fix data corruption in binary file appending.Apply dark/light themes based on system preferences on Windows. ","version":"Next","tagName":"h3"},{"title":"v4.10.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4100","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-2","content":" Generate official macOS arm64 (For Apple M1 and higher devices) and universal binaries with the GitHub workflow. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-6","content":" Add a JSON schema definition for the neutralino.config.json file.Fix source code compilation issues on macOS arm64 systems. ","version":"Next","tagName":"h3"},{"title":"ESM/NPM support​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#esmnpm-support","content":" Neutralinojs typically stores the client library implementation in a separate file (neutralino.js). This approach makes Neutralinojs app development process easier with a globally exposed JavaScript object, Neutralino. But, modern web developers use ES modules and they usually like to fetch dependencies from NPM. So, now, developers can load the __neutralino_globals.js internal script (i.e., <script src="__neutralino_globals.js"></script>) to load only globals. Then, they can use the client library implementation via neutralino.mjs with the neu CLI or from @neutralinojs/lib with a Node package manager. ","version":"Next","tagName":"h3"},{"title":"v4.9.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v490","content":" ","version":"Next","tagName":"h2"},{"title":"API: Custom methods​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-custom-methods","content":" Neutralinojs offers the extensions API to write custom backend code with any programming language, but extensions come with the following drawbacks that affect apps in several scenarios: Extensions use a shared WebSocket for communication, so using direct C++ references (i.e., the window handler) is impossible within extensions.The developer is responsible for packaging their extension binaries.A C++-based extension is not fast as native C++-based code due to the WebSockets-based IPC. Alternatively, a developer can download the framework C++ code, modify it, and re-compile it. But, the developer may face issues while synching upstream code modifications. So, Neutralinojs offers a separate namespace, a function template, inbuilt helper functions (i.e., to get the window handler, validation, etc.), and a developer guide to add custom APIs to the Neutralinojs framework without updating the framework core. Example: let res = await Neutralino.custom.fetch('https://neutralino.js.org'); If developers make a custom API that others can use, we motivate them to contribute to the Neutralinojs framework by adding it to the main codebase. Example: let res = await Neutralino.net.fetch('https://neutralino.js.org'); If the developer adds a new custom method to the framework, the client library will automatically export it to the Neutralino.custom namespace by using the NL_CMETHODS internal global variable. The Neutralino.custom.getMethods function returns an array of custom methods similar to NL_CMETHODS. ","version":"Next","tagName":"h3"},{"title":"API: File streams​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-file-streams","content":" The current Neutralinojs API offers non-stream-based (Promise-based but synchronous-like) functions for working with files. For example, the filesystem.readFile function reads the file content and retrieves data synchronously even though the WebSocket communication mechanism supports asynchronous patterns. However, the synchronous API lets developers work with files in a simple way, but they face the following issues in some scenarios: Reading large files is not performance-friendly (The whole file content gets loaded into the memory).Unable to work with dynamic file objects (i.e., Device files).File descriptors are not persistent within the app lifecycle as they get destroyed after native API calls. To solve this issue, we offer an event-based file stream API with the following functions/events: Functions​ filesystem.openFile: Creates a file stream by openning a file.filesystem.updateOpenedFile: Triggers a file read/readAll event or sets the file cursor.filesystem.getOpenedFileInfo: Returns (awaited) information about the file stream (Props: id, eof, pos, and lastRead) Events​ openedFile: Occurs per each file read event and whenever the file stream reaches EOF. ","version":"Next","tagName":"h3"},{"title":"v4.8.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v480","content":" ","version":"Next","tagName":"h2"},{"title":"API: os.getEnvs​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-osgetenvs","content":" os.getEnv returns a value for a given environment variable key. Developers had to use alternative methods to retrieve a list of all environment variables with values. The os.getEnvs returns all environment variables as a JavaScript object similar to Node's process.env. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-2","content":" Added pos and size options for readFile and readBinaryFile methods to set the file cursor position and buffer size respectively. ","version":"Next","tagName":"h3"},{"title":"API: storage.getKeys​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-storagegetkeys","content":" Added the storage.getKeys function to get an array of Neutralinojs storage keys. Now, developers don't need to write their own functions to retrieve storage keys with the filesystem API. ","version":"Next","tagName":"h3"},{"title":"API: computer.getMousePosition​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-computergetmouseposition","content":" Returns the current mouse cursor position via a JavaScript object that has x and y props. This function is helpful for develping interactive desktop widgets on all supported platforms. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements","content":" Replaced string error codes with enums in the C++ source code.Some refactorings done in C++ struct definitions and return values. ","version":"Next","tagName":"h3"},{"title":"v4.7.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v470","content":" ","version":"Next","tagName":"h2"},{"title":"API: System information API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-system-information-api","content":" Ealier, we had the getMemoryInfo function in the computer namespace to retrieve system memory statistics. Now, we have added more functions to get details about the CPU, operating system, kernel, and connected displays: computer.getArch: Returns the CPU architecture. i.e, x64, arm, etc.computer.getKernelInfo: Returns the operating system's kernel details.computer.getOSInfo: Returns the operating system details.computer.getCPUInfo: Returns the CPU details.computer.getDisplays: Returns an array of all connected displays with the resolution, frequency-like information. ","version":"Next","tagName":"h3"},{"title":"API: os dialogs​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os-dialogs","content":" Add the defaultPath option to showSaveDialog, showOpenDialog, and showFolderDialog functions to set the initial path/filename of system dialogs. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-3","content":" Run the test suite on Windows GitHub Actions instance.Fix the armhf framework binary generation issue in the GitHub Actions workflow. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-1","content":" Hide the automation info bar from the Chrome mode by default -- Developers can add the --enable-automation flag to the config file if they need the particular command-line switch. ","version":"Next","tagName":"h3"},{"title":"v4.6.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v460","content":" ","version":"Next","tagName":"h2"},{"title":"API: Process spawning API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-process-spawning-api","content":" We have os.execCommand for launching processes, but it's synchronous, meaning, the developer has to wait unti process completion to receive pid, stdOut and stdErr. execCommand is not suitable for long-running processes. The new spawning API offers API functions for handling long-running processes in a multi-threaded way. os.spawnProcess(command): Spawns a process and returns id (A virtual Neutralino-scoped pid) and pid (Operating system-level pid).os.getSpawnedProcesses(): Returns a list of spawned processes.os.updateSpawnedProcess(id, action, data): Sends an action event for the spawned process. Supports the following actions: stdIn: Sends a string via the standard input stream. data is the input string.stdInEnd: Closes the standard input stream.exit: Terminates the spawned process. ","version":"Next","tagName":"h3"},{"title":"Core: events​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-events","content":" spawnedProcess: Dispatched when there is a change in the spawned process. CustomEvent gets triggered with the following object: { id: <id>, pid: <pid>, action: <action>, data: <data> } Available actions: stdOut: Outputs standard output data. data contains the standard output payload.stdErr: Outputs standard error data. data contains the standard error payload.exit: Notified when the process terminates. data contains the process exit code. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-4","content":" Add official Linux ARM (armhf and arm64) binary build support for the standard release workflow and nightly build. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-3","content":" Expose createdAt and modifiedAt JavaScript timestamps via the filesystem.getStats function. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-2","content":" Hide the .storage directory (Neutralinojs storage location) on Windows.Support using query parameters in resources URLs. i.e., index.html?v=2.0 is supported, but caching is not yet implemented.Show a user-friendly error message for Neutralinojs server initialization failures. ","version":"Next","tagName":"h3"},{"title":"v4.5.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v450","content":" ","version":"Next","tagName":"h2"},{"title":"Core: events​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-events-1","content":" Added windowFocus and windowBlur native events. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-5","content":" Use BuildZri for C++ build automation.Implement a new workflow for nightly releases. Developers can get the nightly release binaries via the nightly version tag. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-3","content":" Search and dynamically load app indicator libraries on Linux. This enhancement supports Neutralinojs to start without a crash when there is no app indicator library present on the system.Throw NE_OS_TRAYIER from the os.setTray function for initialization failures.Fix binary file write error on Windows with the filesystem.writeBinaryFile function. This was fixed by using LF as the line breaker on all platforms as a portable solution. If the developer needs CRLF on Windows (or CR on Darwin), the developer needs to handle it explicitly with NL_OS. ","version":"Next","tagName":"h3"},{"title":"Core: global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-global-variables","content":" Add NL_COMMIT to hold framework's release commit. This is helpful to find the nightly release's code snapshot. ","version":"Next","tagName":"h3"},{"title":"v4.4.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v440","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-2","content":" Add window.getPosition to get the current window coordinates. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-4","content":" Add filesystem.appendFile to append text content to a file. Thrown errors are similar to the filesystem.writeFile function.Add filesystem.appendBinaryFile to append binary content to a file. Thrown errors are similar to the filesystem.writeBinaryFile function. ","version":"Next","tagName":"h3"},{"title":"Dependencies​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#dependencies","content":" Use ayatana-appindicator3-0.1 instead of appindicator3-0.1 (Marked as obsolete in Debian packages) ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-4","content":" Dynamically call SetProcessDpiAwarenessContext function to support previous Windows versions.Display the native method name with the NE_RT_NATPRME error payload. ","version":"Next","tagName":"h3"},{"title":"v4.3.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v430","content":" ","version":"Next","tagName":"h2"},{"title":"Core: auth​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-auth","content":" Added tokenSecurity to the configuration to improve the security of NL_TOKEN. Accepted values are none and one-time. If none is set, Neutralinojs server will always expose NL_TOKEN for any application instance, so you can open Neutralinojs apps from browser directly. If one-time (recommended) is set, Neutralinojs server expose NL_TOKEN only once and client persists the token in sessionStorage, so all other clients that acces the app after the initial client will get an auth error message (Displayed to the user via HTML). ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-3","content":" window.setAlwaysOnTop(bool) was added.window.getSize was added. ","version":"Next","tagName":"h3"},{"title":"Core: global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-global-variables-1","content":" Added NL_EXTENABLED which returns true if extensions are enabled. It is used to check extensions status faster during initialization process. ","version":"Next","tagName":"h3"},{"title":"Bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixes","content":" Fixed the file dialog order issue on Windows.Removed tray icon when the application exits. ","version":"Next","tagName":"h3"},{"title":"v4.2.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v420","content":" ","version":"Next","tagName":"h2"},{"title":"API: clipboard​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-clipboard-1","content":" Add clipboard API for all platforms. Supports reading and writing text in the system clipboard. ","version":"Next","tagName":"h3"},{"title":"Core: configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-configuration-1","content":" Accept chrome-related CLI args: --chrome-width, --chrome-height, and --chrome-args.Accept --neu-dev-extension to enable devtools connections (For internal usages with CLI).Accept custom HTTP headers via serverHeaders option. ","version":"Next","tagName":"h3"},{"title":"API: global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-global-variables","content":" Added NL_RESMODE to get details about application resources source. Returns bundle if resources are loaded from resources.neu. Otherwise, returns directory. ","version":"Next","tagName":"h3"},{"title":"Bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixes-1","content":" Fix chrome mode user data dir issue (Support paths with spaces).Fix browser mode's shutdown issue with neu CLI. ","version":"Next","tagName":"h3"},{"title":"v4.1.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v410","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-4","content":" window.getTitle returns the current native window title. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os-2","content":" Remove NE_OS_ENVNOEX from os.getEnv and return an empty string if environment variable is not defined. ","version":"Next","tagName":"h3"},{"title":"Core: Chrome mode​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-chrome-mode","content":" Now you can run Neutralinojs apps as Chrome apps via the chrome mode. ","version":"Next","tagName":"h3"},{"title":"Core: configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-configuration-2","content":" Getting chrome mode config from modes.chrome. Added height, width, and args specially for the chrome mode. ","version":"Next","tagName":"h3"},{"title":"v4.0.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v400","content":" ","version":"Next","tagName":"h2"},{"title":"API: os.execCommand​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-osexeccommand","content":" Renamed shouldRunInBackground option to background.Supports stdIn as an optional input.Returns multiple values: stdOut, stdErr, pid, and exitCode. ","version":"Next","tagName":"h3"},{"title":"Core: API extensions​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-api-extensions","content":" Config file supports new extensions array globally or in a specific mode.Neutralino spawns extension processes based on extensions array.Neutralino doesn't send kill signals to extension processes. The extension developer needs to stop processes properly.extension setting has 4 fields: id, command, commandLinux,commandDarwin, and commandWindows.The command's (platform-specific command's) value accepts ${NL_PATH} global variable.Each extension process instance is called with three CLI args: --nl-port={}, --nl-extension-id={} and --nl-token={}Enable/disable extensions with enableExtensions config. ","version":"Next","tagName":"h3"},{"title":"Core: Static server​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-static-server","content":" Supports setting document root (with documentRoot) via config. Now, it's possible to launch app without a subdirectory in the URL. ","version":"Next","tagName":"h3"},{"title":"Core: Community driver processes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-community-driver-processes","content":" Now developers can use Neutralinojs as a part of their software with any programming language by spawning Neutralinojs as a child process. Use exportAuthInfo to write auth details to ${NL_PATH}/.tmp/auth_info.json. Then the parent process can pickup access details there. Note that WebSocket communication needs to be initiated via extensions API/loader. ","version":"Next","tagName":"h3"},{"title":"API: app.broadcast​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-appbroadcast","content":" Sends an event to all app clients. This method is for extension developers. ","version":"Next","tagName":"h3"},{"title":"API: events.broadcast​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-eventsbroadcast","content":" Sends an event to all clients (apps and extensions). Useful for notifying important general events. ","version":"Next","tagName":"h3"},{"title":"API: extensions​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-extensions","content":" dispatch: Sends an event to a specific extension.broadcast: Sends an event to all connected extensions. Useful for sending shutdown signals.getStats: Returns details about loaded extensions and connected extensions. ","version":"Next","tagName":"h3"},{"title":"API: updater​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-updater","content":" checkForUpdates: Send a request to a seed URL (JSON) and fetch update details.install: Install updates based on the currently downloaded manifest. ","version":"Next","tagName":"h3"},{"title":"Events​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#events-1","content":" appClientConnect and appClientDisconnect: Occurs when a new app instance is launched and closed respectively.extClientConnect and extClientDisconnect: Occurs when a new extension is connected and disconnected respectively.extensionReady can be used to implement immediate extension calls. This is implemented from the client-side with extensions.getStats and extClientConnect. This event gurantees that it will be triggered regardless of the extension's start time. ","version":"Next","tagName":"h3"},{"title":"Error codes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#error-codes","content":" NE_EX_EXTNOTC: Thrown by extensions.dispatch if the target extension is not connected.NE_UP_CUPDMER: Thrown by updater.checkForUpdates if the JSON update manifest is invalid or applicationId is not matching.NE_UP_CUPDERR: Thrown by updater.checkForUpdates if the updater API cannot fetch the manifest.NE_UP_UPDNOUF: Thrown by updater.install when the update manifest is not loaded.NE_UP_UPDINER: Thrown by updater.install for update installation errors. ","version":"Next","tagName":"h3"},{"title":"Bug fixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bug-fixes","content":" Fix port 0 issue with modes. Earlier, if the developer sets port as 0 from a specific mode, the NL_PORT also becomes 0.Fix an issue with writeToLogFile config option. Earlier, the log file was created even this option is set to false. ","version":"Next","tagName":"h3"},{"title":"Global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#global-variables-1","content":" NL_APPVERSION: Value of the version key in the config file. ","version":"Next","tagName":"h3"}],"options":{"id":"default"}} \ No newline at end of file +{"searchDocs":[{"title":"Neutralino.app","type":0,"sectionRef":"#","url":"/docs/api/app","content":"","keywords":"","version":"Next"},{"title":"app.exit(exitCode)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appexitexitcode","content":" Terminates the running application. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters","content":" exitCode Number: Process's exit code. The default value is always 0 (success). await Neutralino.app.exit(130); await Neutralino.app.exit(); ","version":"Next","tagName":"h3"},{"title":"app.killProcess()​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appkillprocess","content":" Kills the application process. If the application becomes unresponsive, you can use this to terminate the process instantly. It is recommended to use the exit() method to close your application properly. await Neutralino.app.killProcess(); ","version":"Next","tagName":"h2"},{"title":"app.restartProcess(options)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#apprestartprocessoptions","content":" Restarts the current application instance. ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#options","content":" args String: Additional command-line arguments that need to be passed to the new application instance's process. await Neutralino.app.restartProcess(); await Neutralino.app.restartProcess({ args: '--restarted' }); ","version":"Next","tagName":"h3"},{"title":"app.getConfig()​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appgetconfig","content":" Returns the current application configuration as a JSON object. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#return-object-awaited","content":" The current application configuration. Sometimes, this configuration object is not identical to your configuration file because the framework updates the configuration during several situations such as config overriding via CLI arguments and using 0 as the port. let config = await Neutralino.app.getConfig(); console.log('URL = ', config.url); ","version":"Next","tagName":"h3"},{"title":"app.broadcast(eventName, data)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appbroadcasteventname-data","content":" Dispatches a new event to all app instances. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-1","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.app.broadcast('myTestEvent', 'Hello'); await Neutralino.app.broadcast('myTestEvent', {myData: 'Test data'}); await Neutralino.app.broadcast('myTestEvent'); ","version":"Next","tagName":"h3"},{"title":"app.readProcessInput(readAll)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appreadprocessinputreadall","content":" Reads string data from the standard input stream of the application process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-2","content":" readAll Boolean (optional): If this is set to true, the framework will read the entire standard stream. Otherwise, only one line will be returned. The default value for this option is false. let name = await Neutralino.app.readProcessInput(); console.log(`Hello ${name}`); ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#return-string-awaited","content":" Standard input stream data. ","version":"Next","tagName":"h3"},{"title":"app.writeProcessOutput(data)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appwriteprocessoutputdata","content":" Writes string data to the standard output stream of the application process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-3","content":" data String: Data to be written. await Neutralino.app.writeProcessOutput('Enter your name: '); let name = await Neutralino.app.readProcessInput(); await Neutralino.app.writeProcessOutput(`Hello ${name}\\n`); ","version":"Next","tagName":"h3"},{"title":"app.writeProcessError(data)​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#appwriteprocesserrordata","content":" Writes string data to the standard error stream of the application process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.app","url":"/docs/api/app#parameters-4","content":" data String: Data to be written. await Neutralino.app.writeProcessError('This message goes to stderr'); ","version":"Next","tagName":"h3"},{"title":"Neutralino.clipboard","type":0,"sectionRef":"#","url":"/docs/api/clipboard","content":"","keywords":"","version":"Next"},{"title":"clipboard.getFormat()​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardgetformat","content":" Returns the current data format of the system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#return-string-awaited","content":" Clipboard format: text, image, or unknown. let format = await Neutralino.clipboard.getFormat(); console.log(`Format: ${format}`); ","version":"Next","tagName":"h3"},{"title":"clipboard.writeText(text)​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardwritetexttext","content":" Writes text into the system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#parameters","content":" text String: Text to store into the system clipboard. await Neutralino.clipboard.writeText('Test value'); ","version":"Next","tagName":"h3"},{"title":"clipboard.writeImage(image)​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardwriteimageimage","content":" Writes image into the system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Input Object: ClipboardImage​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#input-object-clipboardimage","content":" width: Number: Image width.height: Number: Image height.bpp: Number: Bits per pixel (BPP).bpr: Number: Bytes Per Row (BPR).redMask: Number: Red mask.greenMask: Number: Green mask.blueMask: Number: Blue mask.redShift: Number: Red shift.greeShift: Number: Green shift.blueShift: Number: Blue shift.data: ArrayBuffer: Raw RGBA binary data of the image in an array buffer. let image = prepareClipboardImage(); await Neutralino.clipboard.writeImage(image); ","version":"Next","tagName":"h3"},{"title":"clipboard.readText()​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardreadtext","content":" Reads and returns text from system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#return-string-awaited-1","content":" Stored text from the system clipboard. let clipboardText = await Neutralino.clipboard.readText(); console.log(`Text: ${clipboardText}`); ","version":"Next","tagName":"h3"},{"title":"clipboard.readImage()​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#clipboardreadimage","content":" Reads and returns an image from system clipboard.  ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.clipboard","url":"/docs/api/clipboard#return-object-awaited","content":" Returns ClipboardImage object that has the same properties as in the writeImage() function. let clipboardImage = await Neutralino.clipboard.readImage(); console.log(`Image: ${clipboardImage}`); ","version":"Next","tagName":"h3"},{"title":"Introduction","type":0,"sectionRef":"#","url":"/docs/","content":"","keywords":"","version":"Next"},{"title":"What is Neutralinojs?​","type":1,"pageTitle":"Introduction","url":"/docs/#what-is-neutralinojs","content":" Neutralinojs is a lightweight and portable desktop application development framework. It lets you develop lightweight cross-platform desktop applications using JavaScript, HTML and CSS. You can extend Neutralinojs with any programming language (via extensions IPC) and use Neutralinojs as a part of any source file (via child processes IPC). ","version":"Next","tagName":"h2"},{"title":"Why Neutralinojs?​","type":1,"pageTitle":"Introduction","url":"/docs/#why-neutralinojs","content":" In Electron and NWjs, you have to install Node.js and hundreds of dependency libraries. Embedded Chromium and Node make simple apps bloaty. Neutralinojs offers a lightweight and portable SDK which is an alternative for Electron and NW.js. Neutralinojs doesn't bundle Chromium and uses the existing web browser library in the operating system (Eg: gtk-webkit2 on Linux). Neutralinojs implements a WebSocket connection for native operations and embeds a static web server to serve the web content. Also, it offers a built-inJavaScript client library for developers. See comparisons: Neutralinojs vs Electron vs NW.JS vs Tauri vs NodeGui vs Flutter vs .Net MAUINeutralinojs vs Electron vs NW.js (2018) When you start learning Neutralinojs, you will realize that Neutralinojs answers endless use cases. For example, you can use Neutralinojs for the following scenarios. Cross-platform desktop app development.Building web apps with native operations.Using as a cloud message broker.Connecting multiple processes by using as an IPC broker.and more... ","version":"Next","tagName":"h2"},{"title":"Highlighted features​","type":1,"pageTitle":"Introduction","url":"/docs/#highlighted-features","content":" Portable development kit.No compilation required for application developers.No additional dependencies required for users.Native functions support: Read files, run system commands, etc.Less resource intensive compared to chromium-node-based frameworks.Cross-platform: Neutralinojs apps work on Linux, Windows, macOS, and Web.Simple and flexible development environment. ","version":"Next","tagName":"h2"},{"title":"Supported platforms and CPU architectures​","type":1,"pageTitle":"Introduction","url":"/docs/#supported-platforms-and-cpu-architectures","content":" neu CLI provides you pre-built x64 binaries for Linux, macOS, and Windows. Additionally, it provides ARM (armhf/arm64) Linux binaries with the Neutralinojs framework v4.6.0 or newer versions and ARM (arm64) Darwin binaries with v4.10.0 or newer framework versions. We are trying to officially support all popular CPU architectures with the CLI soon! However, you can build Neutralinojs binaries from the source on almost all desktop operating systems and CPU architectures out there. If you need Neutralinojs binaries for non-x64 CPU, learn how to build Neutralinojs from source with this guide. ","version":"Next","tagName":"h2"},{"title":"Neutralino.custom","type":0,"sectionRef":"#","url":"/docs/api/custom","content":"","keywords":"","version":"Next"},{"title":"custom.getMethods()​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#customgetmethods","content":" Returns all custom methods added by the app developer. ","version":"Next","tagName":"h2"},{"title":"Return Array (awaited):​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#return-array-awaited","content":" A string array of all custom method identifiers. let methods = await Neutralino.custom.getMethods(); console.log(methods); ","version":"Next","tagName":"h3"},{"title":"custom.add(num1, num2, options)​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#customaddnum1-num2-options","content":" info This is a sample method and official Neutralinojs framework builds don't include this method by default. So, you have to download the Neutralinojs framework source code and uncomment the add method in thecustom namespace androuter.cpp. This method returns the sum of two numbers for demonstration purposes of custom methods. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#parameters","content":" num1 Number: The first number for the summation process.num2 Number: The second number for the summation process. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#options","content":" addExtraFive Boolean: Adds extra five to the numerical result.addExtraTen Boolean: Adds extra ten to the numerical result. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.custom","url":"/docs/api/custom#return-number-awaited","content":" The sum of input numerical parameters with extra value additions based on options. let sum; sum = await Neutralino.custom.add(10, 10); // 20 sum = await Neutralino.custom.add(1, 1, { addExtraFive: true, addExtraTen: true }); // 17 Check the add method implementation and learn how to capture, validate, and process parameters in C++. For compiling your Neutralinojs fork, you can use the existingGitHub Actions workflows. ","version":"Next","tagName":"h3"},{"title":"Neutralino.debug","type":0,"sectionRef":"#","url":"/docs/api/debug","content":"","keywords":"","version":"Next"},{"title":"debug.log(message, type)​","type":1,"pageTitle":"Neutralino.debug","url":"/docs/api/debug#debuglogmessage-type","content":" Writes messages to neutralinojs.log file or/and standard output streams.  tip If your application is running via neu run, you can see log messages on your terminal. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.debug","url":"/docs/api/debug#parameters","content":" message String: Content to be logged.type String (optional): Type of the message. Accepted values are INFO, WARNING, and ERROR. The default value is INFO. await Neutralino.debug.log('Hello Neutralinojs'); await Neutralino.debug.log('An error occured', 'ERROR'); await Neutralino.debug.log('A warning message', 'WARNING'); ","version":"Next","tagName":"h3"},{"title":"Neutralino.events","type":0,"sectionRef":"#","url":"/docs/api/events","content":"","keywords":"","version":"Next"},{"title":"Event types​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#event-types","content":" Event id\tDescription\tAvailable modes\tAdditional dataready\tOccurs when the client library connects with the Neutralino server.\tall\tnull trayMenuItemClicked\tOccurs when the user clicks on a tray menu item.\tall\tTrayMenuItem windowClose\tOccurs when the user closes the window.\twindow\tnull windowFocus\tOccurs when the window gets focused.\twindow\tnull windowBlur\tOccurs when the window focus state is gone.\twindow\tnull serverOffline\tOccurs when the Neutralino server is offline\tall\tnull clientConnect\tOccurs when a new client access the application.\tall\tTotal clients clientDisconnect\tOccurs when a connected client leaves the application.\tall\tTotal clients appClientConnect\tOccurs when a new application instance starts.\tall\tTotal app clients appClientDisconnect\tOccurs when an application instance ends.\tall\tTotal app clients extClientConnect\tOccurs when a new extension connects.\tall\tExtension identifier extClientDisconnect\tOccurs when an extension disconnects.\tall\tExtension identifer extensionReady\tOccurs when an extension is ready to communicate with the app.\tall\tExtension identifier spawnedProcess\tOccurs then there is an update in the spawned process.\tall\tSpawnedProcess with action (stdOut, stdErr, and exit) and data (STDOUT, STDERR or exit code) openedFile\tOccurs for each read action and whenever stream cursor reaches EOF.\tall\tFile stream identifier with action (data, dataBinary, and end) and data (stream block content) watchFile\tOccurs for each filesystem change events based on watchers.\tall\tFile watcher identifier with action (add, delete, modified, and moved), dir, and filename ","version":"Next","tagName":"h2"},{"title":"events.on(eventName, handler)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsoneventname-handler","content":" Registers a new event handler.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters","content":" eventName String: Name of the event.handler Function: A function that will be called when the given event occurs. Neutralinojs will call the handler with aCustomEvent instance by attaching additional data to the detail key. function onTrayMenuItemClicked(event) { console.log(`Event data: ${event.detail}`); } await Neutralino.events.on('trayMenuItemClicked', onTrayMenuItemClicked); ","version":"Next","tagName":"h3"},{"title":"events.off(eventName, handler)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsoffeventname-handler","content":" Unregisters an event handler.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters-1","content":" eventName String: Name of the event.handler Function: A function reference. await Neutralino.events.off('trayMenuItemClicked', onTrayMenuItemClicked); ","version":"Next","tagName":"h3"},{"title":"events.dispatch(eventName, data)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsdispatcheventname-data","content":" Dispatches a new event to the current app instance. Neutralinojs client uses this JavaScript function call internally to dispatch native events.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters-2","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.events.dispatch('myTestEvent', {myData: 'Test data'}); ","version":"Next","tagName":"h3"},{"title":"events.broadcast(eventName, data)​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#eventsbroadcasteventname-data","content":" Dispatches a new event to all clients (both app and extension clients). ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.events","url":"/docs/api/events#parameters-3","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.events.broadcast('myTestEvent', 'Hello'); await Neutralino.events.broadcast('myTestEvent', {myData: 'Test data'}); await Neutralino.events.broadcast('myTestEvent'); // without any data payload ","version":"Next","tagName":"h3"},{"title":"Neutralino.extensions","type":0,"sectionRef":"#","url":"/docs/api/extensions","content":"","keywords":"","version":"Next"},{"title":"extensions.dispatch(extensionId, eventName, data)​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#extensionsdispatchextensionid-eventname-data","content":" Dispatches a new event to an extension instance. If the targeted extension is not connected yet, Neutralino client library will queue the function call and send whenever the extension comes online. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#parameters","content":" extensionId String: Extension identifier.eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.extensions.dispatch('js.neutralino.sampleextension', 'myTestEvent', {myData: 'Test data'}); await Neutralino.extensions.dispatch('js.neutralino.sampleextension', 'myTestEvent'); ","version":"Next","tagName":"h3"},{"title":"extensions.broadcast(eventName, data)​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#extensionsbroadcasteventname-data","content":" Dispatches a new event to all connected extensions. If an extension is loaded but not connected yet, the particular extension won't get the new event. Use extensions.dispatchto send messages even if the extension is not connected to the main process. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#parameters-1","content":" eventName String: Name of the event.data Object (optional): Additional data for the event. await Neutralino.extensions.broadcast('myTestEvent', 'Hello'); await Neutralino.extensions.broadcast('myTestEvent', {myData: 'Test data'}); await Neutralino.extensions.broadcast('myTestEvent'); ","version":"Next","tagName":"h3"},{"title":"extensions.getStats()​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#extensionsgetstats","content":" Returns details about connected and loaded extensions. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.extensions","url":"/docs/api/extensions#return-object-awaited","content":" loaded String[]: An array of loaded extensions.connected String[]: An array of connected extensions. These extensions have an active WebSocket-based IPC connection with the main process. let stats = await Neutralino.extensions.getStats(); console.log('stats: ', stats); ","version":"Next","tagName":"h3"},{"title":"Neutralino.computer","type":0,"sectionRef":"#","url":"/docs/api/computer","content":"","keywords":"","version":"Next"},{"title":"computer.getMemoryInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetmemoryinfo","content":" Returns system memory statistics in bytes. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited","content":" physical Object: Physical memory information. total Number: Total physical memory.available Number: Available physical memory. virtual Object: Virtual memory information. total Number: Total virtual memory.available Number: Available virtual memory. let memoryInfo = await Neutralino.computer.getMemoryInfo(); console.log(`RAM size: ${memoryInfo.physical.total}B`); ","version":"Next","tagName":"h3"},{"title":"computer.getArch()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetarch","content":" Returns the CPU architecture identifier: x64 (x86 64bit/arm64), ia32 (x86 32bit), arm, itanium, or unknown. ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-string-awaited","content":" CPU architecture. let arch = await Neutralino.computer.getArch(); console.log(arch); ","version":"Next","tagName":"h3"},{"title":"computer.getKernelInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetkernelinfo","content":" Returns operating system kernel information. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-1","content":" variant String: Kernel type: Linux, Darwin, Windows NT, or Unknown.version String: Version in the <major>.<minor>.<patch>-<build_number> format. let kernelInfo = await Neutralino.computer.getKernelInfo(); console.log(`Kernel: ${kernelInfo.variant}`); ","version":"Next","tagName":"h3"},{"title":"computer.getOSInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetosinfo","content":" Returns operating system information. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-2","content":" name String: Operating system name.description String: Operating system description.version String: Version in the <major>.<minor>.<patch>-<build_number> format. let osInfo = await Neutralino.computer.getOSInfo(); console.log(`OS: ${osInfo.name}`); ","version":"Next","tagName":"h3"},{"title":"computer.getCPUInfo()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetcpuinfo","content":" Returns the CPU information. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-3","content":" vendor String: Vendor name.model String: Model name.frequency Number: The current CPU frequency in hertz (Hz).architecture String: CPU architecture name. Returns the same value as the getArch function.logicalThreads Number: Number of logical threads in the parallelism model.physicalCores Number: Number of physical cores in the CPU.physicalUnits Number: Number of physical CPU hardware units in the motherboard. let cpuInfo = await Neutralino.computer.getCPUInfo(); console.log(`CPU model: ${cpuInfo.model}`); ","version":"Next","tagName":"h3"},{"title":"computer.getDisplays()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetdisplays","content":" Returns information about all connected displays. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-4","content":" An array of Display objects. ","version":"Next","tagName":"h3"},{"title":"Display​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#display","content":" id Number: A virtual display identifier.resolution Object: Display resolution information. width Number: Display width.height Number: Display height. dpi Number: DPI (Dots Per Inch) value.bpp Number: BPP (Bits Per Pixel) value (also known as the color depth).refreshRate Number: Refresh rate in hertz (Hz). let displays = await Neutralino.computer.getDisplays(); for(let display of displays) { console.log(display); } ","version":"Next","tagName":"h3"},{"title":"computer.getMousePosition()​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#computergetmouseposition","content":" Returns the current mouse cursor position. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.computer","url":"/docs/api/computer#return-object-awaited-5","content":" x Number: Distance from the left edge of the screen in pixels.y Number: Distance from the top edge of the screen in pixels. let pos = await Neutralino.computer.getMousePosition(); console.log(`Pos: ${pos.x}, ${pos.y}`); ","version":"Next","tagName":"h3"},{"title":"Error Codes","type":0,"sectionRef":"#","url":"/docs/api/error-codes","content":"","keywords":"","version":"Next"},{"title":"Native API error codes​","type":1,"pageTitle":"Error Codes","url":"/docs/api/error-codes#native-api-error-codes","content":" Error code\tMessage\tThrown byNE_FS_DIRCRER\tUnable to create directory.\tos.createDirectory NE_FS_REMVERR\tUnable to remove path.\tos.remove NE_OS_TRAYIER\tUnable to initialize the tray menu. This error is typically thrown when GNU/Linux systems don't contain an app indicator library.\tos.setTray NE_FS_FILRDER\tFile read error.\tfilesystem.readFile, filesystem.readBinaryFile NE_FS_FILWRER\tFile write error.\tfilesystem.writeFile, filesystem.writeBinaryFile NE_FS_FILOPER\tFile open error.\tfilesystem.openFile NE_FS_UNLTOUP\tUnable to update opened file id.\tfilesystem.updateOpenedFile NE_FS_UNLTFOP\tUnable to find opened file id.\tfilesystem.getOpenedFileInfo NE_FS_NOPATHE\tNo file or directory.\tfilesystem.getStats, filesystem.readDirectory NE_FS_COPYERR\tCopy error.\tfilesystem.copy NE_FS_MOVEERR\tMove error.\tfilesystem.move NE_FS_UNLCWAT\tUnable to create watcher.\tfilesystem.createWatcher NE_FS_NOWATID\tUnable to find watcher.\tfilesystem.removeWatcher NE_OS_UNLTOUP\tUnable to update the spawned process due to an invalid process identifier or action.\tos.updateSpawnedProcess NE_OS_INVMSGA\tInvalid message box arguments.\tos.showMessageBox NE_OS_INVKNPT\tInvalid platform path name.\tos.getPath NE_ST_INVSTKY\tInvalid storage key.\tstorage.getData, storage.setData NE_ST_STKEYWE\tStorage write error.\tstorage.setData NE_RT_INVTOKN\tInvalid access token.\t* NE_RT_NATPRME\tNo permission to execute the provided native method.\t* NE_RT_APIPRME\tNo permission to use the native API.\t* NE_RT_NATRTER\tNative method runtime error. Mostly occured due to missing parameters.\t* NE_RT_NATNTIM\tNative method is not implemented.\tinternal NE_CL_NSEROFF\tNeutralino server is not reachable.\t* NE_EX_EXTNOTC\tExtension is not connected yet\textensions.dispatch NE_UP_CUPDMER\tInvalid update manifest or mismatching applicationId\tupdater.checkForUpdates NE_UP_CUPDERR\tUnable to fetch update manifest\tupdater.checkForUpdates NE_UP_UPDNOUF\tNo update manifest loaded\tupdater.install NE_UP_UPDINER\tUpdate installation error\tupdater.install NE_RS_APIRQRF\tThe resources API works only if the resource file is loaded\tresources.* NE_RS_FILNOTF\tUnable to find the requested path in the resources bundle\tresources.readFile, resources.readBinaryFile, resources.extractFile ","version":"Next","tagName":"h2"},{"title":"Neutralino.init","type":0,"sectionRef":"#","url":"/docs/api/init","content":"","keywords":"","version":"Next"},{"title":"init()​","type":1,"pageTitle":"Neutralino.init","url":"/docs/api/init#init","content":" The application developer needs to call this method explicitly via a JavaScript source file before using any native API function. The init function does the following tasks when it's called. Starts a WebSocket connection with the Neutralinojs server asynchronously.Registers auto-reload event handler if the --neu-dev-auto-reload flag (the neu run command sets this flag) is provided.Defines NL_CVERSION with the client libary version in the window scope. You can call native API calls right after the init function call, as shown below. Neutralino.init(); Neutralino.os.showMessageBox('Welcome', 'Hello Neutralinojs'); Also, you can wrap immediate native calls with the ready event callback if you like. Neutralino.init(); Neutralino.events.on('ready', () => { Neutralino.os.showMessageBox('Welcome', 'Hello Neutralinojs'); }); info Neutralinojs client library typically queues and sends native API calls to the server when the WebSocket connection is established. Therefore, you don't need to use the ready event callback always. ","version":"Next","tagName":"h2"},{"title":"Native API Overview","type":0,"sectionRef":"#","url":"/docs/api/overview","content":"","keywords":"","version":"Next"},{"title":"Native API namespaces​","type":1,"pageTitle":"Native API Overview","url":"/docs/api/overview#native-api-namespaces","content":" Neutralino.appNeutralino.clipboardNeutralino.computerNeutralino.customNeutralino.debugNeutralino.eventsNeutralino.extensionsNeutralino.filesystemNeutralino.initNeutralino.osNeutralino.storageNeutralino.updaterNeutralino.windowNeutralino.resources ","version":"Next","tagName":"h2"},{"title":"Global Variables","type":0,"sectionRef":"#","url":"/docs/api/global-variables","content":"","keywords":"","version":"Next"},{"title":"Predefined global variables​","type":1,"pageTitle":"Global Variables","url":"/docs/api/global-variables#predefined-global-variables","content":" Variable\tDescriptionNL_OS\tOperating system name: Linux, Windows, or Darwin NL_ARCH\tCPU architecture: x64, arm, itanium, ia32, or unknown NL_APPID\tApplication identifier NL_APPVERSION\tApplication version NL_PORT\tApplication port NL_MODE\tMode of the application: window, browser, cloud, or chrome NL_VERSION\tNeutralinojs framework version NL_CVERSION\tNeutralinojs client version NL_CWD\tCurrent working directory NL_PATH\tApplication path NL_ARGS\tCommand-line arguments NL_PID\tIdentifier of the current process NL_RESMODE\tSource of application resources: bundle or directory NL_EXTENABLED\tReturns true if extensions are enabled NL_COMMIT\tFramework binary's release commit hash NL_CCOMMIT\tClient librar's release commit hash NL_CMETHODS\tCustom method identifiers (Returns the same output that custom.getMethods returns). NL_WSAVSTLOADED\tReturns true if the initial window state was loaded from the saved configuration tip You can use NL_COMMIT and NL_CCOMMIT values to identify the codebase snapshot if you use nightly releases. ","version":"Next","tagName":"h2"},{"title":"Custom global variables​","type":1,"pageTitle":"Global Variables","url":"/docs/api/global-variables#custom-global-variables","content":" You can make custom global variables too via neutralino.config.json, as shown below. "globalVariables": { "TEST": "Test Value" } The above custom global variable's value can be accessed with NL_TEST. You can set any data type for custom global variables. Look at the following examples. "globalVariables": { "TEST_1": 1, "TEST_2": null, "TEST_3": 3.5, "TEST_4": [3, 5, 4, 5], "TEST_5": { "key": "value", "anotherKey": 100 } } Avoid overriding predefined global variables. ","version":"Next","tagName":"h2"},{"title":"Neutralino.storage","type":0,"sectionRef":"#","url":"/docs/api/storage","content":"","keywords":"","version":"Next"},{"title":"storage.setData(key, data)​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#storagesetdatakey-data","content":" Writes data into Neutralinojs shared storage.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#parameters","content":" key String: A unique identifier.data Object (optional): Data as a string. If this value is null or undefined, the specific data record will be erased from the disk. await Neutralino.storage.setData('userDetails', JSON.stringify({ username: 'TestValue'}) ); ","version":"Next","tagName":"h3"},{"title":"storage.getData(key)​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#storagegetdatakey","content":" Reads and returns data for a given Neutralinojs shared storage key.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#parameters-1","content":" key String: Storage data record identifier. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#return-string-awaited","content":" Data string of the storage record. let data = await Neutralino.storage.getData('userDetails'); console.log(`Data: ${data}`); ","version":"Next","tagName":"h3"},{"title":"storage.getKeys()​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#storagegetkeys","content":" Returns all storage keys. ","version":"Next","tagName":"h2"},{"title":"Return Array (awaited):​","type":1,"pageTitle":"Neutralino.storage","url":"/docs/api/storage#return-array-awaited","content":" A string array of existing storage keys. let keys = await Neutralino.storage.getKeys(); console.log('Keys: ', keys); ","version":"Next","tagName":"h3"},{"title":"Neutralino.resources","type":0,"sectionRef":"#","url":"/docs/api/resources","content":"","keywords":"","version":"Next"},{"title":"resources.getFiles()​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#resourcesgetfiles","content":" Returns all files and directories embedded in the resource bundle. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#return-object-awaited","content":" An array of path strings. let files = await Neutralino.resources.getFiles(); console.log('Files: ', files); ","version":"Next","tagName":"h3"},{"title":"resources.extractFile(path, destination)​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#resourcesextractfilepath-destination","content":" Extracts a file from the resources bundle to a preferred path. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#parameters","content":" path String: Resource file path, i.e., /resources/icons/appIcon.png, starts with / similar to all Neutralinojs app resources.destination String: Path where the extract file should be created. await Neutralino.resources.extractFile('/resources/scripts/run.sh', './scripts/run.sh'); ","version":"Next","tagName":"h3"},{"title":"resources.readFile(path)​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#resourcesreadfilepath","content":" Reads a text file from resources. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#parameters-1","content":" path: Resource path. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#return-string-awaited","content":" File content. let data = await Neutralino.resources.readFile(); console.log(data); ","version":"Next","tagName":"h3"},{"title":"resources.readBinaryFile(path)​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#resourcesreadbinaryfilepath","content":" Reads a binary file from resources. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#parameters-2","content":" path: Resource path. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.resources","url":"/docs/api/resources#return-object-awaited-1","content":" Content of the binary file as anArrayBuffer. let data = await Neutralino.resources.readBinaryFile('/resources/images/myImage.png'); let view = new Uint8Array(data); console.log('Binary content: ', view); ","version":"Next","tagName":"h3"},{"title":"Neutralino.updater","type":0,"sectionRef":"#","url":"/docs/api/updater","content":"","keywords":"","version":"Next"},{"title":"updater.checkForUpdates(url)​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#updatercheckforupdatesurl","content":" Checks latest updates from the given URL. The URL should return a valid Neutralinojs update manifest withContent-Type: application/json header. Throws NE_UP_CUPDMER for invalid manifests and NE_UP_CUPDERRfor network connectivity issues. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#parameters","content":" url String: URL to fetch update manifest. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#return-object-awaited","content":" Update manifest. let url = 'https://example.com/updates/manifest.json'; let manifest = await Neutralino.updater.checkForUpdates(url); ","version":"Next","tagName":"h3"},{"title":"updater.install()​","type":1,"pageTitle":"Neutralino.updater","url":"/docs/api/updater#updaterinstall","content":" Installs updates from the downloaded update manifest. Throws NE_UP_UPDNOUF if the manifest isn't loaded. If the update installation process fails, this function will throw NE_UP_UPDINER. let url = 'https://example.com/updates/manifest.json'; let manifest = await Neutralino.updater.checkForUpdates(url); if(manifest.version != NL_APPVERSION) { await Neutralino.updater.install(); } else { console.log('You are using the latest version!'); } ","version":"Next","tagName":"h2"},{"title":"Internal CLI Arguments","type":0,"sectionRef":"#","url":"/docs/cli/internal-cli-arguments","content":"","keywords":"","version":"Next"},{"title":"General​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#general","content":" ","version":"Next","tagName":"h2"},{"title":"--load-dir-res​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--load-dir-res","content":" Notifies Neutralinojs server to fetch files from the resources directory. If this flag is not provided, Neutralinojs server will load resources from the resources.neu file. tip If Neutralinojs fails to load resources resources.neu, this flag is automatically enabled internally to find resources from the app directory. Therefore, you can double click on the binary instead of neu run while developing apps. ","version":"Next","tagName":"h3"},{"title":"--config-file=<filename>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--config-filefilename","content":" Uses a custom configuration file instead of the default neutralino.config.json file for loading the app configuration JSON. This CLI option is helpful for setting a development-only configuration file (i.e., --config-file=neutralino-dev.config.json). info The neu build command won't typically include custom configuration files for the final application bundle — it only embeds the defaultneutralino.config.json file allowing you to store production app configuration. ","version":"Next","tagName":"h3"},{"title":"--path=<path>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--pathpath","content":" Overrides the resources path with a relative path or absolute path. This will change the NL_PATH global variable. ","version":"Next","tagName":"h3"},{"title":"--mode=<mode>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--modemode","content":" Overrides the default mode. Accepted values are: window, browser, and cloud. ","version":"Next","tagName":"h3"},{"title":"--neu-dev-auto-reload​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--neu-dev-auto-reload","content":" Listens to the neuDev_reloadApp event. When this CLI argument is provided, each modification done to the resources will automatically reload the application. The neu run command executes Neutralinojs with this flag by default. --neu-dev- is a reserved CLI argument prefix for Neutralinojs process. Therefore, avoid adding custom arguments with --neu-dev- prefix. Feel free to use the --dev- prefix for your development-related CLI flags. ","version":"Next","tagName":"h3"},{"title":"--neu-dev-extension​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--neu-dev-extension","content":" Loads js.neutralino.devtools extension internally for development purposes. The neu CLI uses this CLI argument to establish an IPC with the application process. This option only works if application resources are loaded from a directory (won't work for end-users). ","version":"Next","tagName":"h3"},{"title":"--url=<url>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--urlurl","content":" Overrides the URL on the application. ","version":"Next","tagName":"h3"},{"title":"--document-root=<url>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--document-rooturl","content":" Overrides the document root of the static server. ","version":"Next","tagName":"h3"},{"title":"--port=<port>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--portport","content":" Overrides the application port and will change the NL_PORT global variable. If 0 is given, Neutralino will use a random available port. ","version":"Next","tagName":"h3"},{"title":"--logging-enabled=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--logging-enabledtruefalse","content":" Overrides the logging feature status. ","version":"Next","tagName":"h3"},{"title":"--logging-write-to-log-file=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--logging-write-to-log-filetruefalse","content":" Overrides the log file feature status. ","version":"Next","tagName":"h3"},{"title":"--export-auth-info=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--export-auth-infotruefalse","content":" Overrides auth details export setting. ","version":"Next","tagName":"h3"},{"title":"--enable-extensions=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--enable-extensionstruefalse","content":" Overrides extensions feature's availability. ","version":"Next","tagName":"h3"},{"title":"--enable-server=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--enable-servertruefalse","content":" Enables or disables the background server (Disables static file servering feature and native API messaging). If you load a remote URL to the webview, you can set this option to true. ","version":"Next","tagName":"h3"},{"title":"--enable-native-api=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--enable-native-apitruefalse","content":" Overrides the primary native API execution permission. ","version":"Next","tagName":"h3"},{"title":"--single-page-serve=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--single-page-servetruefalse","content":" Overrides the single page serving option. ","version":"Next","tagName":"h3"},{"title":"Window mode​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#window-mode","content":" The following CLI arguments are used when the application runs with the window mode. ","version":"Next","tagName":"h2"},{"title":"--window-title=<title>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-titletitle","content":" Overrides the window title. ","version":"Next","tagName":"h3"},{"title":"--window-icon=<icon_path>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-iconicon_path","content":" Overrides the window icon. ","version":"Next","tagName":"h3"},{"title":"--window-full-screen=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-full-screentruefalse","content":" Overrides the window's initial full screen status. ","version":"Next","tagName":"h3"},{"title":"--window-always-on-top=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-always-on-toptruefalse","content":" Overrides the window's initial top-most mode. ","version":"Next","tagName":"h3"},{"title":"--window-borderless=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-borderlesstruefalse","content":" Overrides the window's borderless mode. ","version":"Next","tagName":"h3"},{"title":"--window-maximize=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-maximizetruefalse","content":" Overrides the window's initial maximize status. ","version":"Next","tagName":"h3"},{"title":"--window-hidden=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-hiddentruefalse","content":" Overrides the window's initial visibility status. ","version":"Next","tagName":"h3"},{"title":"--window-maximizable=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-maximizabletruefalse","content":" Overrides the window's initial maximizable status. ","version":"Next","tagName":"h3"},{"title":"--window-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-widthnumber","content":" Overrides the window width. ","version":"Next","tagName":"h3"},{"title":"--window-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-heightnumber","content":" Overrides the window height. ","version":"Next","tagName":"h3"},{"title":"--window-min-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-min-widthnumber","content":" Overrides the window's minimum width. ","version":"Next","tagName":"h3"},{"title":"--window-min-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-min-heightnumber","content":" Overrides the window's minimum height. ","version":"Next","tagName":"h3"},{"title":"--window-max-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-max-widthnumber","content":" Overrides the window's maximum width. ","version":"Next","tagName":"h3"},{"title":"--window-max-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-max-heightnumber","content":" Overrides the window's maximum height. ","version":"Next","tagName":"h3"},{"title":"--window-x=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-xnumber","content":" Overrides the window left (x) position. ","version":"Next","tagName":"h3"},{"title":"--window-y=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-ynumber","content":" Overrides the window top (y) position. ","version":"Next","tagName":"h3"},{"title":"--window-center=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-centertruefalse","content":" Overrides the window's initial center positioning setup. ","version":"Next","tagName":"h3"},{"title":"--window-transparent=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-transparenttruefalse","content":" Overrides the window transparency mode. ","version":"Next","tagName":"h3"},{"title":"--window-resizable=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-resizabletruefalse","content":" Overrides the window's initial resizability status. ","version":"Next","tagName":"h3"},{"title":"--window-exit-process-on-close=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-exit-process-on-closetruefalse","content":" Overrides the close button's behavior. ","version":"Next","tagName":"h3"},{"title":"--window-enable-inspector=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-enable-inspectortruefalse","content":" Automatically opens the developer tools window. ","version":"Next","tagName":"h3"},{"title":"--window-use-saved-state=<true|false>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-use-saved-statetruefalse","content":" Overrides the saved window state feature setting. ","version":"Next","tagName":"h3"},{"title":"--window-extend-user-agent-with=<suffix>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--window-extend-user-agent-withsuffix","content":" Overrides the custom user agent setting. ","version":"Next","tagName":"h3"},{"title":"Chrome mode​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#chrome-mode","content":" The following CLI arguments are used when the application runs with the chrome mode. ","version":"Next","tagName":"h2"},{"title":"--chrome-width=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--chrome-widthnumber","content":" Chrome window's width. ","version":"Next","tagName":"h3"},{"title":"--chrome-height=<number>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--chrome-heightnumber","content":" Chrome window's height. ","version":"Next","tagName":"h3"},{"title":"--chrome-args=<arg_list>​","type":1,"pageTitle":"Internal CLI Arguments","url":"/docs/cli/internal-cli-arguments#--chrome-argsarg_list","content":" Additional arguments for the Chrome process. Read more about chrome mode from here tip The right hand value is optional for the for boolean type CLI arguments. Therefore, you can use --window-full-screeninstead of --window-full-screen=true. However, if you define window.fullScreen as true and you need to override it asfalse you have to use --window-full-screen=false. ","version":"Next","tagName":"h3"},{"title":"Neutralino.window","type":0,"sectionRef":"#","url":"/docs/api/window","content":"","keywords":"","version":"Next"},{"title":"window.setTitle(title)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsettitletitle","content":" Sets the title of the native window. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters","content":" title String (optional): Title of the window. Clears the title, if the function was called without the parameter. await Neutralino.window.setTitle('New title'); ","version":"Next","tagName":"h3"},{"title":"window.getTitle()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowgettitle","content":" Returns the title of the native window. ","version":"Next","tagName":"h2"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-string-awaited","content":" The current title of the native window instance. let title = await Neutralino.window.getTitle(); console.log(`title = ${title}`); ","version":"Next","tagName":"h3"},{"title":"window.minimize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowminimize","content":" Minimizes the native window. await Neutralino.window.minimize(); ","version":"Next","tagName":"h2"},{"title":"window.unminimize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowunminimize","content":" Restores the native window from the minimized state. await Neutralino.window.unminimize(); ","version":"Next","tagName":"h2"},{"title":"window.isMinimized()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowisminimized","content":" Returns true if the native window is minimized. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited","content":" true or false based on current minimized status. let status = await Neutralino.window.isMinimized(); ","version":"Next","tagName":"h3"},{"title":"window.maximize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowmaximize","content":" Maximizes the native window. await Neutralino.window.maximize(); ","version":"Next","tagName":"h2"},{"title":"window.unmaximize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowunmaximize","content":" Restores the native window. await Neutralino.window.unmaximize(); ","version":"Next","tagName":"h2"},{"title":"window.isMaximized()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowismaximized","content":" Returns true if the native window is maximized. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-1","content":" true or false based on current maximized status. let status = await Neutralino.window.isMaximized(); ","version":"Next","tagName":"h3"},{"title":"window.setFullScreen()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetfullscreen","content":" Enables the full screen mode. await Neutralino.window.setFullScreen(); ","version":"Next","tagName":"h2"},{"title":"window.exitFullScreen()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowexitfullscreen","content":" Exits from the full screen mode. await Neutralino.window.exitFullScreen(); ","version":"Next","tagName":"h2"},{"title":"window.isFullScreen()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowisfullscreen","content":" Returns true if the native window is in the full screen mode. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-2","content":" true or false based on current full screen status. let status = await Neutralino.window.isFullScreen(); ","version":"Next","tagName":"h3"},{"title":"window.show()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowshow","content":" Shows the native window. await Neutralino.window.show(); ","version":"Next","tagName":"h2"},{"title":"window.hide()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowhide","content":" Hides the native window. await Neutralino.window.hide(); ","version":"Next","tagName":"h2"},{"title":"window.isVisible()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowisvisible","content":" Returns true if the native window is visible. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-3","content":" true or false based on current visibility status. let status = await Neutralino.window.isVisible(); ","version":"Next","tagName":"h3"},{"title":"window.focus()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowfocus","content":" Focuses the native window. await Neutralino.window.focus(); ","version":"Next","tagName":"h2"},{"title":"window.setAlwaysOnTop(onTop)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetalwaysontopontop","content":" Activates or deactivates the always on top mode.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-1","content":" onTop Boolean (optional): Says whether the on top mode should be activated or not. The default value is true. await Neutralino.window.setAlwaysOnTop(true); // or setAlwaysOnTop(); await Neutralino.window.setAlwaysOnTop(false); ","version":"Next","tagName":"h3"},{"title":"window.move(x, y)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowmovex-y","content":" Moves the native window into given coordinates. Neutralinojs's cross-platform coordinate system starts from top-left corner of the screen. In other words, x=0,y=0 point refers to the top-left corner of the device's main screen. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-2","content":" x Number: An integer value for the horizontal position.y Number: An integer value for the vertical position. await Neutralino.window.move(200, 400); ","version":"Next","tagName":"h3"},{"title":"window.center()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowcenter","content":" Centers the native app window within the current display. await Neutralino.window.center(); ","version":"Next","tagName":"h2"},{"title":"window.setIcon(icon)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowseticonicon","content":" Sets an icon for the native window or Dock.  ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-3","content":" icon String: Path of the icon. A 200x200 PNG image file works fine on all supported operating systems. const icon = '/resources/icons/appIcon.png'; await Neutralino.window.setIcon(icon); ","version":"Next","tagName":"h3"},{"title":"window.setDraggableRegion(domId, options)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetdraggableregiondomid-options","content":" Converts a given DOM element to a draggable region. The user will be able to drag the native window by dragging the given DOM element. This feature is suitable to make custom window bars along with the borderless mode. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-4","content":" domId String | HTMLElement: A DOM element identifier.options DraggableRegionOptions (optional): Customize the behavior of the draggable region. ","version":"Next","tagName":"h3"},{"title":"DraggableRegionOptions​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#draggableregionoptions","content":" alwaysCapture Boolean (optional): If set to true, the region will always capture the pointer, ensuring that dragging is not interrupted when moving the pointer quickly. Note that it prevents child elements from receiving any pointer events. Defaults to false.dragMinDistance Number (optional): The minimum distance between cursor's starting and current position after which dragging is started. This helps prevent accidental dragging while interacting with child elements. Defaults to 10 and is measured in CSS pixels. await Neutralino.window.setDraggableRegion('myCustomTitleBar'); await Neutralino.window.setDraggableRegion('myCustomTitleBar', { alwaysCapture: true, dragMinDistance: 15 }); ","version":"Next","tagName":"h3"},{"title":"window.unsetDraggableRegion(domId)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowunsetdraggableregiondomid","content":" Converts a draggable region to a normal DOM elements by removing drag event handlers. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-5","content":" domId String | HTMLElement: A DOM element identifier. await Neutralino.window.unsetDraggableRegion('myCustomTitleBar'); ","version":"Next","tagName":"h3"},{"title":"window.setSize(Options)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowsetsizeoptions","content":" This method sets the size of the window. ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#options","content":" width Number (optional): Window width in pixels.height Number (optional): Window height in pixels.minWidth Number (optional): Minimum width of the window in pixels.minHeight Number (optional): Minimum height of the window in pixels.maxWidth Number (optional): Maximum width of the window in pixels.maxHeight Number (optional): Maximum height of the window in pixels.resizable Boolean (optional): A boolean value to make the window resizable or fixed. This method always expects width and height couples. For example, if you are setting minWidth, you should set minHeight too. await Neutralino.window.setSize({ width: 500, height: 200, maxWidth: 600, maxHeight: 400 }); await Neutralino.window.setSize({ resizable: false }); ","version":"Next","tagName":"h3"},{"title":"window.getSize()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowgetsize","content":" Returns window size information. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-4","content":" width Number: Window width in pixels.height Number: Window height in pixels.minWidth Number Minimum width of the window in pixels.minHeight Number: Minimum height of the window in pixels.maxWidth Number: Maximum width of the window in pixels.maxHeight Number: Maximum height of the window in pixels.resizable Boolean: Says whether the window resizable or fixed. let sizeInfo = await Neutralino.window.getSize(); console.log(sizeInfo); ","version":"Next","tagName":"h3"},{"title":"window.getPosition()​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowgetposition","content":" Returns window position coordinates. ","version":"Next","tagName":"h2"},{"title":"Return Boolean (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-boolean-awaited-5","content":" x Number: Horizontal coordinate of the left edge of the window.y Number: Vertical coordinate of the top edge of the window. let position = await Neutralino.window.getPosition(); console.log(position); ","version":"Next","tagName":"h3"},{"title":"window.create(url, WindowOptions)​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowcreateurl-windowoptions","content":" Creates a native window. You can use this method to create new window for your multi-window Neutralinojs app. Neutralinojs spawns a new process for each native window. Therefore, the new window works as an isolated app once the window is created. However, you can build communication streams between windows with the storage API. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#parameters-6","content":" url String: URL to be loaded. Eg: /resources/aboutWindow.html. Supports loading both local and remote app resources. Local resource paths need to begin with /.options (optional): an instance of WindowOptions type. ","version":"Next","tagName":"h3"},{"title":"WindowOptions​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#windowoptions","content":" title String: Window title.icon String: Window icon path.fullScreen Boolean: Sets full screen mode.alwaysOnTop Boolean: Activates the top-most mode.enableInspector Boolean: Activates developer tools and opens the web inspector window.borderless Boolean: Makes the window borderless.maximize Boolean: Launches the window maximized.hidden Boolean: Hides the window.maximizable Boolean: Makes the window maximizable or not.exitProcessOnClose Boolean: Exits the application process when the user clicks the window's close button.width Number: Window width.height Number: Window height.x Number: Window x position.y Number: Window y position.minWidth Number: Minimum width of the window.minHeight Number: Minimum height of the window.maxWidth Number: Maximum width of the window.maxHeight Number: Maximum height of the window.processArgs String: Additional command-line arguments for the new window process. Check all supported internal command-line arguments from here. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.window","url":"/docs/api/window#return-object-awaited","content":" pid Number: Process identifier.stdOut String: Standard output. This value is always empty since the new window process starts asynchronously.stdErr String: Standard error. This value is always empty since the new window process starts asynchronously.exitCode Number: Exit code of the process. await Neutralino.window.create('/resources/aboutWindow.html', { icon: '/resources/icons/aboutIcon.png', enableInspector: false, width: 500, height: 300, maximizable: false, exitProcessOnClose: true, processArgs: '--window-id=W_ABOUT' }); ","version":"Next","tagName":"h3"},{"title":"Neutralino.filesystem","type":0,"sectionRef":"#","url":"/docs/api/filesystem","content":"","keywords":"","version":"Next"},{"title":"filesystem.createDirectory(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemcreatedirectorypath","content":" Creates a directory or multiple directories recursively. Throws NE_FS_DIRCRER if directory creation is not possible. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters","content":" path String: New directory path. await Neutralino.filesystem.createDirectory('./newDirectory'); await Neutralino.filesystem.createDirectory(NL_PATH + '/myFolder/api/fs'); ","version":"Next","tagName":"h3"},{"title":"filesystem.remove(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemremovepath","content":" Removes a directory or file. If the given path is a directory, this function recursively removes all contents of the specific directory. Throws NE_FS_REMVERR if the removal is not possible. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-1","content":" path String: Directory or file path. await Neutralino.filesystem.remove('./tmpDirectory'); await Neutralino.filesystem.remove('./tmpFile.txt'); ","version":"Next","tagName":"h3"},{"title":"filesystem.writeFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemwritefilefilename-data","content":" Writes a text file. Throws NE_FS_FILWRER for file write errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-2","content":" filename String: Filename.data String: Content of the file. await Neutralino.filesystem.writeFile('./myFile.txt', 'Sample content'); ","version":"Next","tagName":"h3"},{"title":"filesystem.appendFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemappendfilefilename-data","content":" Appends text content to file. Throws NE_FS_FILWRER for file write errors. If the provided file doesn't exist, this function creates a new file with data. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-3","content":" filename String: Filename.data String: Content to append. await Neutralino.filesystem.appendFile('./myFile.txt', 'Sample '); await Neutralino.filesystem.appendFile('./myFile.txt', 'content'); ","version":"Next","tagName":"h3"},{"title":"filesystem.writeBinaryFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemwritebinaryfilefilename-data","content":" Writes a binary file. Throws NE_FS_FILWRER for file write errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-4","content":" filename String: Filename.data ArrayBuffer: Content of the binary file as anArrayBuffer. let rawBin = new ArrayBuffer(1); let view = new Uint8Array(rawBin); view[0] = 64; // Saves ASCII '@' to the binary file await Neutralino.filesystem.writeBinaryFile('./myFile.bin', rawBin); ","version":"Next","tagName":"h3"},{"title":"filesystem.appendBinaryFile(filename, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemappendbinaryfilefilename-data","content":" Appends binary data to a file. Throws NE_FS_FILWRER for file write errors. If the provided file doesn't exist, this function creates a new file with data. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-5","content":" filename String: Filename.data ArrayBuffer: Binary content to append as anArrayBuffer. let rawBin = new ArrayBuffer(1); let view = new Uint8Array(rawBin); view[0] = 64; // Saves ASCII '@' to the binary file await Neutralino.filesystem.appendBinaryFile('./myFile.bin', rawBin); await Neutralino.filesystem.appendBinaryFile('./myFile.bin', rawBin); ","version":"Next","tagName":"h3"},{"title":"filesystem.readFile(filename)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemreadfilefilename","content":" Reads a text file. Throws NE_FS_FILRDER for file read errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-6","content":" filename String: Filename.pos Number (optional): File cursor position in bytes.size Number (optional): File reader buffer size in bytes. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-string-awaited","content":" File content. let data = await Neutralino.filesystem.readFile('./myFile.txt'); console.log(`Content: ${data}`); let data = await Neutralino.filesystem.readFile('./myFile.txt', { pos: 2, size: 10 }); console.log(`Content: ${data}`); ","version":"Next","tagName":"h3"},{"title":"filesystem.readBinaryFile(filename, options)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemreadbinaryfilefilename-options","content":" Reads binary files. Throws NE_FS_FILRDER for file read errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-7","content":" filename String: Filename. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#options","content":" pos Number (optional): File cursor position in bytes.size Number (optional): File reader buffer size in bytes. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited","content":" Content of the binary file as anArrayBuffer. let data = await Neutralino.filesystem.readBinaryFile('./myFile.bin'); let view = new Uint8Array(data); console.log('Binary content: ', view); ","version":"Next","tagName":"h3"},{"title":"filesystem.openFile(filename)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemopenfilefilename","content":" Creates a readable file stream. Throws NE_FS_FILOPER for file open errors. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-8","content":" filename String: Filename. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-number-awaited","content":" File stream identifier. let fileId = await Neutralino.filesystem.openFile('./myFile.txt'); console.log(`ID: ${fileId}`); ","version":"Next","tagName":"h3"},{"title":"filesystem.updateOpenedFile(id, action, data)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemupdateopenedfileid-action-data","content":" Invokes file stream actions. Throws NE_FS_UNLTOUP if the framework can't update the stream. Call this method to read and seek an opened file (aka a readable stream). ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-9","content":" id Number: File stream identifier.action String: An action to take. Accepts only the following values: read: Reads a bytes segment from the file stream.readBinary: Behaves the same as read but uses the binary read mode.readAll: Triggers the read action until file stream cursor position reachesEOF.readAllBinary: Behaves the same as readAll but uses the binary read mode.seek: Sets the file cursor position.close: Closes and frees file handler resources. data Object (optional): Additional data for the action. Send the buffer size in bytes (default: 256 bytes) if the action is read, readBinary, readAll, or readAllBinary. Send the file stream cursor position if the action is seek. let fileId = await Neutralino.filesystem.openFile('./myFile.txt'); let content = ''; Neutralino.events.on('openedFile', (evt) => { if(evt.detail.id == fileId) { switch(evt.detail.action) { case 'data': content += evt.detail.data; break; case 'end': console.log(content); break; } } }); // Sets the file stream cursor to 10th byte await Neutralino.filesystem.updateOpenedFile(fileId, 'seek', 10); // Reads 2 bytes from the cursor position await Neutralino.filesystem.updateOpenedFile(fileId, 'read', 2); // Reads the next bytes until the cursor reaches EOF (buffer size: 2) await Neutralino.filesystem.updateOpenedFile(fileId, 'readAll', 2); ","version":"Next","tagName":"h3"},{"title":"filesystem.getOpenedFileInfo(id)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetopenedfileinfoid","content":" Returns file stream details. Throws NE_FS_UNLTFOP if the file stream identifier is not valid. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-10","content":" id Number: File stream identifier. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-1","content":" id Number: File stream identifier.eof Boolean: Becomes true if the stream reached EOF.pos Number: File stream cursor position.lastRead Number: Last read bytes. let info = await Neutralino.filesystem.getOpenedFileInfo(0); console.log(info); ","version":"Next","tagName":"h3"},{"title":"filesystem.createWatcher(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemcreatewatcherpath","content":" Creates a filesystem watcher. Throws NE_FS_UNLCWAT for watcher creation failures. If there is an existing active watcher for the given path, this function returns the existing watcher identifier. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-11","content":" path String: Directory path. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-number-awaited-1","content":" File watcher identifier. let watcherId = await Neutralino.filesystem.createWatcher(NL_PATH); Neutralino.events.on('watchFile', (evt) => { if(watcherId == evt.detail.id) { console.log(evt.detail); } }); console.log(`ID: ${watcherId}`); ","version":"Next","tagName":"h3"},{"title":"filesystem.removeWatcher(watcherId)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemremovewatcherwatcherid","content":" Removes a filesystem watcher. Throws NE_FS_NOWATID for watcher removal failures. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-12","content":" watcherId Number: File watcher identifier. ","version":"Next","tagName":"h3"},{"title":"Return Number (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-number-awaited-2","content":" File watcher identifier. let watcherId = await Neutralino.filesystem.createWatcher(NL_PATH); console.log(`ID: ${watcherId}`); await Neutralino.filesystem.removeWatcher(watcherId); ","version":"Next","tagName":"h3"},{"title":"filesystem.getWatchers()​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetwatchers","content":" Returns information about created file watchers. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-2","content":" An array of FileWatcher objects. ","version":"Next","tagName":"h3"},{"title":"FileWatcher​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filewatcher","content":" id Number: Watcher identifier.path String: File watcher path. let watchers = await Neutralino.filesystem.getWatchers(); for(let watcher of watchers) { console.log(watcher); } ","version":"Next","tagName":"h3"},{"title":"filesystem.readDirectory(path, options)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemreaddirectorypath-options","content":" Reads directory contents. Throws NE_FS_NOPATHE if the path doesn't exist. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-13","content":" path String: File/directory path. ","version":"Next","tagName":"h3"},{"title":"options​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#options-1","content":" recursive Boolean: Read sub-directories recursively. The default value is false. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-3","content":" An array of DirectoryEntry objects. ","version":"Next","tagName":"h3"},{"title":"DirectoryEntry​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#directoryentry","content":" entry String: file name.type String: The type of the entry (FILE or DIRECTORY). let entries = await Neutralino.filesystem.readDirectory(NL_PATH); console.log('Content: ', entries); ","version":"Next","tagName":"h3"},{"title":"filesystem.copy(source, destination)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemcopysource-destination","content":" Copies a file or directory to a new destination. Throws NE_FS_COPYERR if the system cannot copy the path. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-14","content":" source String: Source path.destination String: Destination path. ","version":"Next","tagName":"h3"},{"title":"options​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#options-2","content":" recursive Boolean: Copy sub-directories recursively. The default value is true.overwrite Boolean: Overwrite an existing file with the same name. The default value is true.skip Boolean: Skip an existing file with the same name. The default value is false. await Neutralino.filesystem.copy('./source.txt', './destination.txt'); await Neutralino.filesystem.copy('./myDir', './myDirCopy'); ","version":"Next","tagName":"h3"},{"title":"filesystem.move(source, destination)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemmovesource-destination","content":" Moves a file or directory to a new destination. Throws NE_FS_MOVEERR if the system cannot rename the path. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-15","content":" source String: Source path.destination String: Destination path. await Neutralino.filesystem.move('./source.txt', './destination.txt'); await Neutralino.filesystem.move('./myDir', './myFolder'); ","version":"Next","tagName":"h3"},{"title":"filesystem.getStats(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetstatspath","content":" Returns file statistics for the given path. If the given path doesn't exist or is inaccessible,NE_FS_NOPATHE is thrown. Therefore, you can use this method to check for the existance of a file or directory. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-16","content":" path String: File or directory path. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-4","content":" size Number: Size in bytes.isFile Boolean: true if the path represents a normal file.isDirectory Boolean: true if the path represents a directory.createdAt Number: On Windows, returns Unix milliseconds of the file creation time — On Unix or Unix-like platforms, returns Unix milliseconds of the last inode modification time.modifiedAt Number: Unix milliseconds of the last file modification time. let stats = await Neutralino.filesystem.getStats('./sampleVideo.mp4'); console.log('Stats:', stats); ","version":"Next","tagName":"h3"},{"title":"filesystem.getAbsolutePath(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetabsolutepathpath","content":" Returns the absolute path for a given path. This function works with paths that don't exist on the system. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-17","content":" path String: Path. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-string-awaited-1","content":" Absolute path. let path = await Neutralino.filesystem.getAbsolutePath('./myFolder'); console.log(path); ","version":"Next","tagName":"h3"},{"title":"filesystem.getRelativePath(path, base)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetrelativepathpath-base","content":" Returns the relative path for a given path and base. This function works with paths that don't exist on the system. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-18","content":" path String: Path.base String (optional): Base path that is used for calculating the relative path with the path parameter. NL_CWD is used by default if this parameter is not provided. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-string-awaited-2","content":" Relative path. let path = await Neutralino.filesystem.getRelativePath('./myFolder'); console.log(path); path = await Neutralino.filesystem.getRelativePath('./myFolder', '/home/user'); console.log(path); ","version":"Next","tagName":"h3"},{"title":"filesystem.getPathParts(path)​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#filesystemgetpathpartspath","content":" Parses a given path and returns its parts. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#parameters-19","content":" path String: Path. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.filesystem","url":"/docs/api/filesystem#return-object-awaited-5","content":" rootName String: Root path name.rootDirectory String: Root path directory.rootPath String: Root path.relativePath String: Path relative to the root path.parentPath String: Parent path or the directory path without filename.filename String: Filename.extension String: File extension.stem String: Filename segment without extension. let pathParts = await Neutralino.filesystem.getPathParts('./myFolder/myFile.txt'); console.log('Parts:', pathParts); ","version":"Next","tagName":"h3"},{"title":"Neutralino.os","type":0,"sectionRef":"#","url":"/docs/api/os","content":"","keywords":"","version":"Next"},{"title":"os.execCommand(command, options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osexeccommandcommand-options","content":" Executes a command and returns the output. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters","content":" command String: The command that is to be executed. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options","content":" background Boolean: Executes the command in background and resolve the Promise immediately if this is set to true. This option makes the process detached from the API function call, so if you need to connect with the newly created process later, consider using os.spawnProcess.stdIn String: Standard input as a string.cwd String: Current working directory. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited","content":" pid Number: Process identifier.stdOut String: Standard output.stdErr String: Standard error.exitCode Number: Exit code of the process. let info = await Neutralino.os.execCommand('python --version'); console.log(`Your Python version: ${info.stdOut}`); await Neutralino.os.execCommand('npm start', { background: true }); ","version":"Next","tagName":"h3"},{"title":"os.spawnProcess(command, cwd)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osspawnprocesscommand-cwd","content":" Spawns a process based on a command in background and let developers control it. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-1","content":" command String: The command that is to be executed in a new process.cwd String (optional): Current working directory. ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-1","content":" id Number: A Neutralino-scoped process identifier. This value is used for controlling the process via the native API.pid Number: Process identifier from the operating system. let pingProc = await Neutralino.os.spawnProcess('ping neutralino.js.org'); Neutralino.events.on('spawnedProcess', (evt) => { if(pingProc.id == evt.detail.id) { switch(evt.detail.action) { case 'stdOut': console.log(evt.detail.data); break; case 'stdErr': console.error(evt.detail.data); break; case 'exit': console.log(`Ping process terminated with exit code: ${evt.detail.data}`); break; } } }); ","version":"Next","tagName":"h3"},{"title":"os.updateSpawnedProcess(id, action, data)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osupdatespawnedprocessid-action-data","content":" Updates a spawned process based on a provided action and data. Throws NE_OS_UNLTOUP if the process cannot be updated. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-2","content":" id Number: Neutralino-scoped process identifier.action String: An action to take. Accepts only the following values: stdIn: Sends data to the process via the standard input stream.stdInEnd: Closes the standard input stream file descriptor.exit: Terminates the process. data Object (optional): Additional data for the action. Send stardard input string if the actionis stdIn. let nodeProc = await Neutralino.os.spawnProcess('node'); Neutralino.events.on('spawnedProcess', (evt) => { if(nodeProc.id == evt.detail.id) { switch(evt.detail.action) { case 'stdOut': console.log(evt.detail.data); // 10 break; case 'stdErr': console.error(evt.detail.data); break; case 'exit': console.log(`Node.js process terminated with exit code: ${evt.detail.data}`); break; } } }); await Neutralino.os.updateSpawnedProcess(nodeProc.id, 'stdIn', 'console.log(5 + 5);'); await Neutralino.os.updateSpawnedProcess(nodeProc.id, 'stdInEnd'); ","version":"Next","tagName":"h3"},{"title":"os.getSpawnedProcesses()​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetspawnedprocesses","content":" Returns all spawned processes. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-2","content":" An array of SpawnedProcess objects. SpawnedProcess​ id Number: A Neutralino-scoped process identifier..pid Number: Process identifier from the operating system. await Neutralino.os.spawnProcess('ping neutralino.js.org'); await Neutralino.os.spawnProcess('ping codezri.org'); let processes = await Neutralino.os.getSpawnedProcesses(); console.log(processes); ","version":"Next","tagName":"h3"},{"title":"os.getEnv(key)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetenvkey","content":" Provides the value of a given environment variable. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-3","content":" key String: The name of the environment variable. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited","content":" Value of the given environment variable. Returns an empty string if the environment variable is not defined. let value = await Neutralino.os.getEnv('USER'); console.log(`USER = ${value}`); ","version":"Next","tagName":"h3"},{"title":"os.getEnvs()​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetenvs","content":" Returns all environment variables and their values. ","version":"Next","tagName":"h2"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-3","content":" Environment variables details in key-value pairs. let envs = await Neutralino.os.getEnvs(); console.log(envs); ","version":"Next","tagName":"h3"},{"title":"os.showOpenDialog(title, options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowopendialogtitle-options","content":" Shows the file open dialog. You can use this function to obtain paths of existing files. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-4","content":" title String (optional): Title of the dialog. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-1","content":" filters Filter[] (optional): An array of Filter objects to filter the files list.multiSelections (optional): Enables multi selections.defaultPath String (optional): Initial path/filename displayed by the dialog. Filter​ name String: Filter name.extensions String: Array of file extensions. Eg: ['jpg', 'png'] ","version":"Next","tagName":"h3"},{"title":"Return Object (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-object-awaited-4","content":" An array of selected entries. let entries = await Neutralino.os.showOpenDialog('Open a diagram', { defaultPath: '/home/my/directory/', filters: [ {name: 'Images', extensions: ['jpg', 'png']}, {name: 'All files', extensions: ['*']} ] }); console.log('You have selected:', entries); ","version":"Next","tagName":"h3"},{"title":"os.showSaveDialog(title, options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowsavedialogtitle-options","content":" Shows the file save dialog. You can use this function to obtain a path to create a new file. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-5","content":" title String (optional): Title of the dialog. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-2","content":" filters Filter[] (optional): An array of Filter objects to filter the files list.forceOverwrite Boolean (optional): Skips file overwrite warning message.defaultPath String (optional): Initial path/filename displayed by the dialog. Filter​ name String: Filter name.extensions String[]: Array of file extensions. Eg: ['jpg', 'png'] ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-1","content":" Selected filename. let entry = await Neutralino.os.showSaveDialog('Save to file', { defaultPath: 'untitled.jpg', filters: [ {name: 'Images', extensions: ['jpg', 'png']}, {name: 'All files', extensions: ['*']} ] }); console.log('You have selected:', entry); ","version":"Next","tagName":"h3"},{"title":"os.showFolderDialog(title)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowfolderdialogtitle","content":" Shows the folder open dialog. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-6","content":" title String (optional): Title of the dialog. ","version":"Next","tagName":"h3"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-3","content":" defaultPath String (optional): Initial path displayed by the dialog. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-2","content":" Selected folder. let entry = await Neutralino.os.showFolderDialog('Select installation directory', { defaultPath: '/home/my/directory/' }); console.log('You have selected:', entry); ","version":"Next","tagName":"h3"},{"title":"os.showNotification(title, content, icon)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshownotificationtitle-content-icon","content":" Displays a notification message. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-7","content":" title String: Notification title.content String: Content of the notification.icon String (optional): Icon name. Accpeted values are: INFO, WARNING, ERROR, and QUESTION. The default value isINFO await Neutralino.os.showNotification('Hello world', 'It works! Have a nice day'); await Neutralino.os.showNotification('Oops :/', 'Something went wrong', 'ERROR'); ","version":"Next","tagName":"h3"},{"title":"os.showMessageBox(title, content, choice, icon)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osshowmessageboxtitle-content-choice-icon","content":" Displays a message box. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-8","content":" title String: Title of the message box.content String: Content of the message box.choice String (optional): Message box buttons. Accpeted values are: OK, OK_CANCEL, YES_NO, YES_NO_CANCEL, RETRY_CANCEL, and ABORT_RETRY_IGNORE. The default value is OK.icon String (optional): Icon name. Accpeted values are: INFO, WARNING, ERROR, and QUESTION. The default value is INFO. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-3","content":" User's choice. await Neutralino.os.showMessageBox('Hello', 'Welcome'); let button = await Neutralino.os .showMessageBox('Confirm', 'Are you sure you want to quit?', 'YES_NO', 'QUESTION'); if(button == 'YES') { Neutralino.app.exit(); } ","version":"Next","tagName":"h3"},{"title":"os.setTray(options)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#ossettrayoptions","content":" Creates/updates the tray icon and menu. ","version":"Next","tagName":"h2"},{"title":"Options​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#options-4","content":" icon String: Tray icon path. Eg: /resources/icons/trayIcon.png. A20x20-sized PNG image file works fine on all supported operating systems.menuItems TrayMenuItem[]: An array of TrayMenuItem objects. TrayMenuItem​ id String (optional): A unique identifier for each menu item.text String: Label of the menu item. This field is a mandatory field. Use - (hyphen) character for a menu separator.isDisabled Boolean (optional): A boolean flag to disable/enable a specific menu item.isChecked Boolean (optional): A boolean flag to mark a specific menu item as selected. let tray = { icon: '/resources/icons/trayIcon.png', menuItems: [ {id: "about", text: "About"}, {text: "-"}, {id: "quit", text: "Quit"} ] }; await Neutralino.os.setTray(tray); ","version":"Next","tagName":"h3"},{"title":"os.getPath(name)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osgetpathname","content":" Returns known platform-specific folders such as Downloads, Music, Videos, etc. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-9","content":" title String: Name of the folder. Accepted values are: config, data, cache, documents, pictures, music, video,downloads, saveGames1, saveGames2, and temp. Throws NE_OS_INVKNPT for invalid folder names. ","version":"Next","tagName":"h3"},{"title":"Return String (awaited):​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#return-string-awaited-4","content":" Path. let downloadsPath = await Neutralino.os.getPath('downloads'); console.log(`Downloads folder: ${downloadsPath}`); ","version":"Next","tagName":"h3"},{"title":"os.open(url)​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#osopenurl","content":" Opens a URL with the default web browser. tip If your application is running in the default web browser, this method will open a new tab. ","version":"Next","tagName":"h2"},{"title":"Parameters​","type":1,"pageTitle":"Neutralino.os","url":"/docs/api/os#parameters-10","content":" url String: URL to be opened. Neutralino.os.open('https://neutralino.js.org'); ","version":"Next","tagName":"h3"},{"title":"neu CLI","type":0,"sectionRef":"#","url":"/docs/cli/neu-cli","content":"","keywords":"","version":"Next"},{"title":"Installation​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#installation","content":" Run the following command on your terminal to install the CLI globally. npm i -g @neutralinojs/neu You can also use neu CLI via npx if you don't want a global installation. npx @neutralinojs/neu <command> ","version":"Next","tagName":"h2"},{"title":"Commands​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#commands","content":" ","version":"Next","tagName":"h2"},{"title":"neu create <binaryName>​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-create-binaryname","content":" Creates a new Neutralinojs app based on a template. Parameters​ <binaryName>: The name of your application's binary file. For example, if you used myapp, the final application binaries will become myapp-<platform>_<arch>. Options​ --template: Sets the application template via GitHub repository identifier with the <account>/<repo> format. The default value is neutralinojs/neutralinojs-minimal ","version":"Next","tagName":"h3"},{"title":"neu build​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-build","content":" This command will create the dist folder. Thereafter, it will produce the binaries for all supported platforms and resources.neu resource file from your application resources. Options​ --release: Creates a portable ZIP file of the application bundle.--copy-storage: Copies the current snapshot of the Neutralinojs storage to the application bundle. ","version":"Next","tagName":"h3"},{"title":"neu run​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-run","content":" Executes the current application (This will execute specific binary depending on your operating system). This command will change execution permissions (using the chmod command) of the binary files on Linux and macOS. Also, it enables auto-reload for the current application. In other words, when a modification happens to application resources, the Neutralinojs application will be reloaded automatically. You can see Neutralinojs process and extensions output streams while the application is running. If you use the cli.frontendLibrarykey in app configuration, the CLI enables both frontend library's development environment and Neutralinojs's development evironment at the same time. This option patches the main HTML file with the Neutralinojs client library global variables to expose the native API to the frontend library's development server. Learn how to setup this feature from this guide. Options​ --disable-auto-reload: Disables the auto-reloading feature.--arch=<arch>: Explicitly set the CPU architecture. This option is helpful if you use a 32-bit Node.js process on a 64-bit computer.-- <process-args>: Sets additional CLI arguments for the Neutralinojs application process. For example you can enable the browser mode by entering neu run -- --mode=browser. See all accepted arguments from here. ","version":"Next","tagName":"h3"},{"title":"neu update​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-update","content":" This command will update the existing Neutralinojs binaries and client library from the internet. You can use the nightly tag for the cli.binaryVersion and cli.clientVersion in the neutralino.config.json file to use experimental daily pre-releases. Options​ --latest: Fetches the latest framework version details via the GitHub API, downloads from official releases , and update the app configuration with fetched version details. warning Nightly builds refers to automatically generated daily builds, so these builds can contain experimental or incomplete features. Therefore, avoid using nightly versions in your production apps. Use nightly versions to try out latest features, but use a stable version for production apps. ","version":"Next","tagName":"h3"},{"title":"neu version​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-version","content":" Prints all version information. If this command is executed from a Neutralinojs application directory, you will see project-specific version details. Otherwise, you will see global version details. ","version":"Next","tagName":"h3"},{"title":"neu plugins [plugin]​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#neu-plugins-plugin","content":" Parameters​ plugin: Plugin identifier. This value is usually the npm package identifer. Options​ --add: Registers a new plugin to neu CLI. neu CLI downloads plugins to the CLI's node_modulesdirectory and loads during the bootstrap process. Plugins can introduce new commands to the CLI.--remove: Unregisters an existing plugin. ","version":"Next","tagName":"h3"},{"title":"Plugins​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#plugins","content":" Neutralinojs app developers are able to write plugins to add their own commands to the neu CLI. You can develop CLI plugins with the folllowing steps. ","version":"Next","tagName":"h2"},{"title":"Developing a plugin​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#developing-a-plugin","content":" neu CLI will register plugins using index.js as an interface. Create a new npm package with index.js and add the following code snippet. // index.js module.exports = { command: 'commandname <action>', register: (command, modules) => { command.option('--option1 --option2') .action((action, command) => { //your logic goes here.. }); } } command is the CLI command string with actions. The register function will be called when plugin is being registered. Also, it has the command object andstandard modules objectas parameters. Please check commander package documentation for more information about commands and callback parameters. ","version":"Next","tagName":"h3"},{"title":"Publishing your plugin​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#publishing-your-plugin","content":" Once you publish your plugin to the npm registry as a public package, anyone will be able to install it using: neu plugins --add <package-name> and it can be removed using: neu plugins --remove <package-name> See the Appify plugin source for further implementation details. ","version":"Next","tagName":"h3"},{"title":"Changelog​","type":1,"pageTitle":"neu CLI","url":"/docs/cli/neu-cli#changelog","content":" Please check the changelog from GitHub. ","version":"Next","tagName":"h2"},{"title":"Modes","type":0,"sectionRef":"#","url":"/docs/configuration/modes","content":"","keywords":"","version":"Next"},{"title":"window​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#window","content":" Neutralinojs application will run on a native window. The window will use the user's operating system's theme. This mode is a good selection for cross-platform application development. ","version":"Next","tagName":"h2"},{"title":"browser​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#browser","content":" Neutralinojs application will use the user's default browser to load the application. Therefore, you can build web applications with native operations. You can't typically access operating system-level features via web browsers. But, the Neutralinojs browser mode helps you to make web apps that can access the operating system layer with required security controls. ","version":"Next","tagName":"h2"},{"title":"cloud​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#cloud","content":" This mode will run the Neutralinojs process as a background server. You will be able to expose your application to a public network or the internet. tip Example scenario: You can make a web application to control your computer via mobile phones. Besides, you can run the Neutralinojs server on bare-metal servers, virtual machines, and application containers as a lightweight message broker. You may find endless use-cases for this framework mode. danger Make sure that you are blocking or allowing critical native operations vianativeBlockList, nativeAllowList respectively. Also, if you started the application with administrator access, your web application will have the same permission level. ","version":"Next","tagName":"h2"},{"title":"chrome​","type":1,"pageTitle":"Modes","url":"/docs/configuration/modes#chrome","content":" Neutralinojs app will run as a Chrome application. The framework uses the following Chrome command-line arguments to make the web application look more like a native app. --disable-background-networking --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-breakpad --disable-client-side-phishing-detection --disable-default-apps --disable-dev-shm-usage --disable-infobars --disable-extensions --disable-features=site-per-process --disable-hang-monitor --disable-ipc-flooding-protection --disable-popup-blocking --disable-prompt-on-repost --disable-renderer-backgrounding --disable-sync --disable-translate --disable-windows10-custom-titlebar --metrics-recording-only --no-first-run --no-default-browser-check --safebrowsing-disable-auto-update --password-store=basic --use-mock-keychain --user-data-dir=${NL_PATH}/.tmp/chromedata Neutralinojs chrome mode works on a computer that has a pre-installed version of Google Chrome, Chromium, or Microsoft Edge browser. If no installation was detected, Neutralinojs displays an error message by asking the user to install a Chromium-based browser. You can provide additional arguments (Eg: --disable-web-security) to the Chrome process via argsconfiguration attribute. Browse all supported Chromium command-line arguments here ","version":"Next","tagName":"h2"},{"title":"neutralino.config.json","type":0,"sectionRef":"#","url":"/docs/configuration/neutralino.config.json","content":"","keywords":"","version":"Next"},{"title":"Primary​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#primary","content":" The following configuraion values cannot be overridden in different Neutralinojs modes. ","version":"Next","tagName":"h2"},{"title":"applicationId: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#applicationid-string","content":" Unique string to identify your application. Eg: js.neutralino.sample ","version":"Next","tagName":"h3"},{"title":"version: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#version-string","content":" Application version. Eg: 2.4.22 ","version":"Next","tagName":"h3"},{"title":"defaultMode: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#defaultmode-string","content":" Mode of the application. Accepted values are window, browser, cloud, and chrome. ","version":"Next","tagName":"h3"},{"title":"General​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#general","content":" You can override the following configuration values from different modes. For example, you can use a specific URL in root-level and another URL in window-mode-level, as shown below. { "url": "/" "modes": { "window": { "url": "/#window-mode" } } } ","version":"Next","tagName":"h2"},{"title":"port: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#port-number","content":" The port of your application. If the value is 0, Neutralinojs will use a random available port. ","version":"Next","tagName":"h3"},{"title":"enableServer: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#enableserver-boolean","content":" Enables or disables the background server (Disables static file servering feature and native API messaging). If you load a remote URL to the webview, you can set this option to false. Make sure to set this option to true if you load resources from local sources. The default value is false. ","version":"Next","tagName":"h3"},{"title":"enableNativeAPI: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#enablenativeapi-boolean","content":" Enables or disables the native API. If you want to use any native API functions, you can set this option to true. The default value is false. ","version":"Next","tagName":"h3"},{"title":"singlePageServe: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#singlepageserve-boolean","content":" Activates SPA (Single Page App) serving. When this option is enabled, the static server module serves the primaryindex.html file for sub-directory requests only if another index.html doesn't exist in a specific sub-directory. The default value for this option is false. ","version":"Next","tagName":"h3"},{"title":"tokenSecurity: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#tokensecurity-string","content":" Neutralinojs uses a client-server communication pattern with a local WebSocket to handle native calls. This local server is protected with an auto-generated token. This option defines the security implementation for the token. Accepts the following values: one-time (Recommended) : Server sends the access token only once, and the client persists it in thesessionStorage. If another client (Eg: browser) tries to access the app, NE_RT_INVTOKN error message will be shown instead of the application. Using this option is recommended since it reduces security issues. none : Server sends the access token always, so any new client can see the application. The default value becomes one-time if this setting is not specified by the developer. danger If you are using native APIs that can access your computer's internals such as os, filesystem, modules, never use none option since any new client can use those APIs. ","version":"Next","tagName":"h3"},{"title":"url: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#url-string","content":" The entry URL of the application. Neutralinojs will initially load this URL. This property accepts both relative and absolute URLs. See following examples. "url": "/" The above config loads http://localhost:<port>/ URL initially (internally /index.html is loaded). You can use remote urls too. "url": "http://example.com" ","version":"Next","tagName":"h3"},{"title":"documentRoot: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#documentroot-string","content":" Sets the document root for the static server. For example, if you need to use resources directory as the document root, you can use setup documentRoot as follows. { "documentRoot": "/resources/", "url": "/" } Make sure to configure url properly with the document root. The following configuration is wrong, it instructs the static server to fetch resources from ./resources/resources. { "documentRoot": "/resources/", "url": "/resources/" } However, you can use a sub-directory in URL, as shown below. { "documentRoot": "/", "url": "/resources/" } ","version":"Next","tagName":"h3"},{"title":"exportAuthInfo: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#exportauthinfo-boolean","content":" Exports authentication details to the ${NL_PATH}/.tmp/auth_info.json file with the following JSON structure. { "port": "<port>", "accessToken": "<access_token>" } You can use the above authentication details to connect with Neutralinojs from external processes by using WebSocket as an IPC mechanism. ","version":"Next","tagName":"h3"},{"title":"enableExtensions: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#enableextensions-boolean","content":" Enables/disables extensions. Learn more about this option here ","version":"Next","tagName":"h3"},{"title":"extensions: object[]​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#extensions-object","content":" An array of extension definitions. Learn more about this option here ","version":"Next","tagName":"h3"},{"title":"nativeBlockList: string[]​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#nativeblocklist-string","content":" An array of native methods needs to be blocked from the frontend of the application. The wildcard character * is allowed inside entries. { "nativeBlockList": ["os.execCommand"], "nativeBlockList": ["app.*"] } ","version":"Next","tagName":"h3"},{"title":"nativeAllowList: string[]​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#nativeallowlist-string","content":" An array of native methods needs to be allowed from the frontend of the application. The wildcard character * is allowed inside entries. { "nativeAllowList": ["os.getEnv"], "nativeAllowList": ["storage.*"] } ","version":"Next","tagName":"h3"},{"title":"globalVariables: object​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#globalvariables-object","content":" A key-value-based JavaScript object of custom global variables. ","version":"Next","tagName":"h3"},{"title":"logging.enabled: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#loggingenabled-boolean","content":" Enables or disables the logging feature. ","version":"Next","tagName":"h3"},{"title":"logging.writeToLogFile: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#loggingwritetologfile-boolean","content":" Enables or disables log file. If this setting is false, the framework won't write log to neutralinojs.log, and it will write logs to standard streams. ","version":"Next","tagName":"h3"},{"title":"serverHeaders: object​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#serverheaders-object","content":" Custom headers for the static server and Websocket handshake process. For example, the following configuration sends a custom header with every outgoing HTTP response. { "serverHeaders": { "Test-Header-Option": "Value" } } ","version":"Next","tagName":"h3"},{"title":"Window mode​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#window-mode","content":" The following configuration values are used when the application runs with the window mode. ","version":"Next","tagName":"h2"},{"title":"modes.window.title: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowtitle-string","content":" Title of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.width: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowwidth-number","content":" Width of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.height: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowheight-number","content":" Height of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.minWidth: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowminwidth-number","content":" Minimum width of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.minHeight: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowminheight-number","content":" Minimum height of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.maxWidth: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowmaxwidth-number","content":" Maximum width of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.maxHeight: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowmaxheight-number","content":" Maximum height of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.x: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowx-number","content":" Left position (x) of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.y: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowy-number","content":" Right position (y) of the native window. ","version":"Next","tagName":"h3"},{"title":"modes.window.center: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowcenter-boolean","content":" Centers the native app window initially. ","version":"Next","tagName":"h3"},{"title":"modes.window.transparent: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowtransparent-boolean","content":" Enables the transparent native window mode for the application instance. If the transparency mode is activated, users can see through the webview if the webpage background uses transparent background colors. Partial transparency can be activated using the rgba() CSS color function. You can use this feature to create semi-transparent windows, windows with custom shadows, and custom-shaped window frames. The default value is false for this option. info Unlike in other platforms, Windows native window becomes borderless (window controls will be hidden) with the activation of the transparent mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.fullScreen: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowfullscreen-boolean","content":" Activates the full-screen mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.icon: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowicon-string","content":" Application icon's file name. You can directly point to an image file in the resources directory. We recommend you to choose a transparent PNG file. ","version":"Next","tagName":"h3"},{"title":"modes.window.alwaysOnTop: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowalwaysontop-boolean","content":" Activates the top-most mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.enableInspector: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowenableinspector-boolean","content":" Automatically opens the developer tools window. ","version":"Next","tagName":"h3"},{"title":"modes.window.borderless: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowborderless-boolean","content":" Activates the borderless mode. ","version":"Next","tagName":"h3"},{"title":"modes.window.maximize: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowmaximize-boolean","content":" Launches the application maximized. ","version":"Next","tagName":"h3"},{"title":"modes.window.resizable: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowresizable-boolean","content":" Make the window resizable or not. The default value is true. ","version":"Next","tagName":"h3"},{"title":"modes.window.hidden: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowhidden-boolean","content":" Make the window invisible. This setting can be used to develop background services. ","version":"Next","tagName":"h3"},{"title":"modes.window.exitProcessOnClose: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowexitprocessonclose-boolean","content":" If this setting is true, the app process will exit when the user clicks on the close button. Otherwise, the framework will dispatch the windowClose event. ","version":"Next","tagName":"h3"},{"title":"modes.window.useSavedState: boolean​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowusesavedstate-boolean","content":" Save and load the primary window state (width, height, x, y, values and maximized status) automatically. The default value is true. ","version":"Next","tagName":"h3"},{"title":"modes.window.extendUserAgentWith: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeswindowextenduseragentwith-string","content":" Extends the default webview-specific user agent string with a custom suffix. If this value is not set, the webview sets the default user agent from the platform-specific rendering engine (i.e., WebKit on GNU/Linux). ","version":"Next","tagName":"h3"},{"title":"Chrome mode​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#chrome-mode","content":" The following configuration values are used when the application starts with the chrome mode. ","version":"Next","tagName":"h2"},{"title":"modes.chrome.width: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeschromewidth-number","content":" Width of the chrome window. ","version":"Next","tagName":"h3"},{"title":"modes.chrome.height: number​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeschromeheight-number","content":" Height of the chrome window. ","version":"Next","tagName":"h3"},{"title":"modes.chrome.args: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#modeschromeargs-string","content":" Additional command-line arguments for the Chrome process. Read more about chrome mode from here ","version":"Next","tagName":"h3"},{"title":"CLI​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cli","content":" The following configuration values are used for the neu CLI. ","version":"Next","tagName":"h2"},{"title":"cli.binaryName: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clibinaryname-string","content":" Binary file name of your application. If it is myapp, all binaries will usemyapp-<platform>_<arch> format. ","version":"Next","tagName":"h3"},{"title":"cli.resourcesPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliresourcespath-string","content":" Path of your application resources. ","version":"Next","tagName":"h3"},{"title":"cli.resourcesExclude: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliresourcesexclude-string","content":" Regex pattern to exclude files from final app bundle. For example, the following configuration will exclude all the TypeScript source files from the final build: { "resourcesExclude" : ".*\\\\.ts$|.*\\\\.tsx$" } ","version":"Next","tagName":"h3"},{"title":"cli.extensionsPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliextensionspath-string","content":" Path of your application extensions. ","version":"Next","tagName":"h3"},{"title":"cli.extensionsExclude: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliextensionsexclude-string","content":" Regex pattern to exclude files from the extensions directory of the final app package. For example, the following configuration will exclude .log and .info files: { "extensionsExclude" : ".*\\\\.log$|.*\\\\.info$" } ","version":"Next","tagName":"h3"},{"title":"cli.clientLibrary: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliclientlibrary-string","content":" Filename of the Neutralinojs JavaScript library. ","version":"Next","tagName":"h3"},{"title":"cli.binaryVersion: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clibinaryversion-string","content":" Neutralinojs server version. Get nightly builds by using the nightly tag. ","version":"Next","tagName":"h3"},{"title":"cli.clientVersion: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliclientversion-string","content":" Neutralinojs client version. Get nightly builds by using the nightly tag. ","version":"Next","tagName":"h3"},{"title":"cli.autoReloadExclude: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#cliautoreloadexclude-string","content":" A JavaScript regular expression to exclude files from the auto-reload file watcher. For example, the following configuration will disable auto-reloading for SASS stylesheets (.scss). { "autoReloadExclude": ".*\\\\.scss$" } Use | character to set multiple regular expressions, as shown below. { "autoReloadExclude": ".*\\\\.scss$|.*\\\\.less$" } ","version":"Next","tagName":"h3"},{"title":"cli.frontendLibrary: object​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clifrontendlibrary-object","content":" Enables frontend development tools (HMR, etc) for the neu run command. Learn more about frontend framework integration from here ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.projectPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectprojectpath-string","content":" Sets the project path of the host project. This path will be used as the current directory while executing the host-project-related commands. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.initCommand: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectinitcommand-string","content":" A command that gets executed after downloading an host app template with the neu create command. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.devCommand: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectdevcommand-string","content":" This command will run with the neu run command to start the host project. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.buildCommand: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectbuildcommand-string","content":" The neu build command will execute this command before generating the app bundle, so you can generate bundled version of host project code. ","version":"Next","tagName":"h3"},{"title":"cli.hostProject.buildPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clihostprojectbuildpath-string","content":" Location where the final read-to-distribute host project files will be stored after the execution of buildCommand. Files in this folder are copied into the app bundle path after the execution of neu build command. ","version":"Next","tagName":"h3"},{"title":"cli.distributionPath: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#clidistributionpath-string","content":" Sets the build path for neu CLI. For example, if you need to get the built binaries in build folder instead of dist, you can set the distributionPath as follows: { "distributionPath": "/build", } The default value for distributionPath is /dist. ","version":"Next","tagName":"h3"},{"title":"Windows-specific options​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#windows-specific-options","content":" There are additional configuration options that define metadata and appearance of executables for Windows platform. These fields must be placed in the root of neutralino.config.json. Every field is optional. ","version":"Next","tagName":"h2"},{"title":"applicationName: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#applicationname-string","content":" The human-readable application name. Fills in the ProductName field of the executable. ","version":"Next","tagName":"h3"},{"title":"applicationIcon: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#applicationicon-string","content":" The location of the executable's icon relative to neutralino.config.json. The icon must be in PNG format. If it is not set, an icon from modes.window.icon will be chosen instead. If modes.window.icon does not point to a PNG file, too, a default Neutralino.js icon will be used. ","version":"Next","tagName":"h3"},{"title":"author: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#author-string","content":" The developer of the application. Fills in the CompanyName field of the executable. ","version":"Next","tagName":"h3"},{"title":"description: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#description-string","content":" A description of the executable file. This usually describes the purpose of your application. Fills in the FileDescription field of the executable. ","version":"Next","tagName":"h3"},{"title":"copyright: string​","type":1,"pageTitle":"neutralino.config.json","url":"/docs/configuration/neutralino.config.json#copyright-string","content":" Copyright information. Fills in the LegalCopyright field of the executable. Example configuration: { "applicationId": "cook.pancake.bakery", "version": "1.2.0", "applicationName": "Pancake Bakery", "author": "Sweet Pancakes LLC", "description": "Digital recipe book for pancakes from all over the world", "copyright": "Copyright © Sweet Pancakes LLC 2042. All rights reserved.", "applicationIcon": "buildAssets/appIcon.png", "cli": { "binaryName": "pancakebakery" } } ","version":"Next","tagName":"h3"},{"title":"Project Structure","type":0,"sectionRef":"#","url":"/docs/configuration/project-structure","content":"","keywords":"","version":"Next"},{"title":"Developing apps with vanilla JS​","type":1,"pageTitle":"Project Structure","url":"/docs/configuration/project-structure#developing-apps-with-vanilla-js","content":" If you like to develop Neutralinojs applications with vanilla JavaScript, you can place all application resources in one directory. After that, you can update the neutralino.config.json file with the following values. ... "cli": { ... "resourcesPath": "/<resourcesDir>/", "clientLibrary": "/<resourcesDir>/neutralino.js" } You can choose a name for <resourceDir>. But, by default neu CLI will use resources. ","version":"Next","tagName":"h2"},{"title":"Developing apps with frontend frameworks​","type":1,"pageTitle":"Project Structure","url":"/docs/configuration/project-structure#developing-apps-with-frontend-frameworks","content":" Any frontend framework can be used to make Neutralinojs applications. You can use any pattern as you wish to include both Neutralinojs app and frontend app in one repository. You can check our recommended approach from this guide. ","version":"Next","tagName":"h2"},{"title":"Examples​","type":1,"pageTitle":"Project Structure","url":"/docs/configuration/project-structure#examples","content":" Please browse sample apps section. ","version":"Next","tagName":"h3"},{"title":"About Neutralinojs","type":0,"sectionRef":"#","url":"/docs/contributing/about-neutralinojs","content":"","keywords":"","version":"Next"},{"title":"History​","type":1,"pageTitle":"About Neutralinojs","url":"/docs/contributing/about-neutralinojs#history","content":" In 2018, three Uva Wellassa University students, Shalitha Suranga,Deepal Samarakoon, and Chathumadhuri Hettiarachchi published a research paper about a theoretical way to build cross-platform apps using inbuilt platform-specific browser libraries. They initially planned to use "Neutrino" as the research project name, but it was already taken. So, they decided to use "Neutralinojs" as the project name (Neutralino refers to a hypothetical lightweight particle). For the research paper, Shalitha Suranga wrote a small POC project for GNU/Linux and Windows to demonstrate the theoretical idea and published it to GitHub as an experimental open-source project. In 2019, the research paper authors started working with the software development industry. But, Shalitha Suranga decided to maintain the POC project alone as a hobby project due to the positive feedback received from the developer communities. Later, Kasun Vithanage ported the POC project to the macOS platform. During 2020–2021, Shalitha Suranga rewrote the Neutralinojs POC project with a new WebSockets-based architecture. His goal was to make the project production-ready with a stable API, well-organized codebase, DevOps improvements, and developer-friendly documentation. Since this rewrite was so different compared to the original research project idea, he planned to re-brand "Neutralinojs" as "Neu.js". However, he decided to use the same name due to the existing Neutralinojs-related content on the internet. In 2022, Neutralinojs passed remarkable development milestones and became a popular open-source framework for building lightweight cross-platform desktop apps with JavaScript. During this journey, the developer community supported Neutralinojs with ideas and code contributions. ","version":"Next","tagName":"h2"},{"title":"Current development​","type":1,"pageTitle":"About Neutralinojs","url":"/docs/contributing/about-neutralinojs#current-development","content":" In 2022, Shalitha Suranga added the Neutralinojs project under the CodeZri non-profit organization to maintain the project, along with his other personal open-source projects. Nowadays, he releases a new framework version every two months with support from very supportive contributors. The project uses a community-driven development methodology. Developer community members and maintainers collaboratively work by writing code, reporting bugs, improving documentation, and discussing features. ","version":"Next","tagName":"h2"},{"title":"Financial perspective​","type":1,"pageTitle":"About Neutralinojs","url":"/docs/contributing/about-neutralinojs#financial-perspective","content":" Shalitha Suranga often donates his time to Neutralinojs by writing code, reviewing pull requests, and planning future of Neutralinojs. He integrated EthicalAds andGoogle Adsense with the Neutralinojs website to generate revenue for his work. Also, he accepts donations from the developer community via his personalPatreon and GitHub Sponsors accounts. Moreover, you can donate Neutralinojs via OpenCollective. Neutralinojs has no plans to monetize the framework with paid licensing/subscriptions, paid support, or courses. Also, Neutralinojs doesn't accept payments to deliver new custom features or solve bugs in apps. Our goal is to keep improving Neutralinojs as a pure FOSS project under the donation-based financial model. tip Read this articleto learn how to build a community-friendly revenue stream around your open-source project. We motivate everyone to build a community-friendly revenue stream around open-source projects! ","version":"Next","tagName":"h2"},{"title":"Architecture","type":0,"sectionRef":"#","url":"/docs/contributing/architecture","content":"Architecture The Neutralinojs framework core follows a single-process, monolithic, and layered architectural pattern with two-interconnected components: the framework core (C++) and the client library (JavaScript). Look at the following high-level architectural diagram: The framework core has two key components: the router and the native API. The router component is responsible for processing HTTP and WebSocket messages. Neutralinojs typically serve all web resources via HTTP like a normal HTTP web server. The Neutralinojs native API communication protocol uses the WebSocket messaging protocol. The router serves web resources and executes native API functions according to the incoming requests from the web context. Your JavaScript application needs to use the Neutralinojs client library functions to execute native API operations. The platform-specific webview runs the JavaScript code of the client library and your application. The webview component isn't a core framework component, so you can run Neutralinojs applications on any modern web browser with browser, chrome, and cloud modes. Because of this flexibility, you can write extensions with any programming language and connect to the framework core with authentication details. Even though an extension-less application follows a monolithic pattern, extensions make Neutralinojs applications non-monolithic with the process-based microservices architecture.","keywords":"","version":"Next"},{"title":"Committers","type":0,"sectionRef":"#","url":"/docs/contributing/committers","content":"","keywords":"","version":"Next"},{"title":"Become a committer​","type":1,"pageTitle":"Committers","url":"/docs/contributing/committers#become-a-committer","content":" You can actively submit patches, bug-reports, and ideas to become a Neutralinojs committer! ","version":"Next","tagName":"h2"},{"title":"Become a PMC member​","type":1,"pageTitle":"Committers","url":"/docs/contributing/committers#become-a-pmc-member","content":" PMC (Project Management Committee) members usually take decisions about project's future. Active committers will be added to the PMC list frequently by the existing PMC members according to their commitment. ","version":"Next","tagName":"h2"},{"title":"Code Style Guide","type":0,"sectionRef":"#","url":"/docs/contributing/code-style-guide","content":"","keywords":"","version":"Next"},{"title":"Programming best practices​","type":1,"pageTitle":"Code Style Guide","url":"/docs/contributing/code-style-guide#programming-best-practices","content":" First, make sure that your code change adheres to the following language-independent best practices: Neutralinojs codebases use a procedural and functional mixed coding style, so avoid adding classes and OOP concepts. However, it's okay to use class-based libraries, but make sure not to expose those classes from Neutralinojs internal procedures. Keep the source code simple even though the development requirement is somewhat complex.This articleexplains more about programming principles that you need to know. We stabilized the Neutralinojs codebase structure and have no plans to extend it further with new modules. In other words, please try to implement your code changes without changing the existing code structure. Please discuss first if your code suggestion needs to extend the code structure. Try to make new APIs and features consistent with the existing implementation. We decided not to expose any operating system-specific feature from the Neutralinojs API for the framework consistency across all operating systems. Therefore, make sure that your new feature will work on all supported operating systems. Write tests for new features and update the changelog file. Add comments only if a further explanation is required. Use self-explanatory identifiers for every code element by following the existing naming convention in the codebase. Use four spaces for indentation instead of tabs or two spaces. Inspect an existing source file and use the same formatting with new source files. ","version":"Next","tagName":"h2"},{"title":"C++ code style guide​","type":1,"pageTitle":"Code Style Guide","url":"/docs/contributing/code-style-guide#c-code-style-guide","content":" We are still composing a complete C++ code style guide. Make sure to follow the following points for C++ code submissions for now.  We don't use C++ exceptions. Use booleans to identify failures. For example, we use the following struct for the file read operation: struct FileReaderResult { bool hasError = false; string error; string data; }; We prefer single-line comments (i.e., // comment) over multi-line comments. Use pass-by-reference for complex data types, but use pass-by-value for atomics. Also, make sure to use theconst keyword properly if the parameter doesn't change within the procedure. For example, look at the following function definition: fs::FileReaderResult readFile(const string &filename); Avoid mixing old C-style syntax with modern C++ syntax.Use the __ prefix (double underscore) to declare module-only functions as shown in the following example: void __registerAllowList() { // implementation } Use getter and setter functions instead of shared global variables (defined with extern). ","version":"Next","tagName":"h2"},{"title":"JavaScript code style guide​","type":1,"pageTitle":"Code Style Guide","url":"/docs/contributing/code-style-guide#javascript-code-style-guide","content":" Use ES6 JavaScript syntax by avoiding legacy language syntax. Use template literals for somewhat complex string construction, but use the + operator for simple concatenation. Use the async/await syntax instead of the then/catch syntax for asynchronous operations. Avoid using too recent JavaScript APIs and language features since we need to support older Node.js and browser versions. But, think twice about readability with somewhat old JavaScript features. Don't use more than three parameters for a function—use a JSON object instead for better readability. If you work with some TypeScript codes, always strive to use the meaningful data types instead any orunknown broad data types. ","version":"Next","tagName":"h2"},{"title":"Developer Support","type":0,"sectionRef":"#","url":"/docs/contributing/developer-support","content":"","keywords":"","version":"Next"},{"title":"Bug reports and feature requests​","type":1,"pageTitle":"Developer Support","url":"/docs/contributing/developer-support#bug-reports-and-feature-requests","content":" There are no perfect software. But we can build good software. Help us to improve Neutralinojs by reporting bugs and submitting feature requests. Please create an issue on appropriate GitHub repository for feature requests and bug reporting. Neutralinojs native API: Create an issueNeutralinojs JavaScript API: Create an issueneu CLI: Create an issueStarter template: Create an issueDocumentaion: Create an issue: ","version":"Next","tagName":"h2"},{"title":"Framework Developer Guide","type":0,"sectionRef":"#","url":"/docs/contributing/framework-developer-guide","content":"","keywords":"","version":"Next"},{"title":"Setup and build the framework​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#setup-and-build-the-framework","content":" ","version":"Next","tagName":"h2"},{"title":"Cloning the repository​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#cloning-the-repository","content":" First, clone the main repository. git clone https://github.com/neutralinojs/neutralinojs.git cd neutralinojs ","version":"Next","tagName":"h3"},{"title":"Installing compilation tools and dependencies​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#installing-compilation-tools-and-dependencies","content":" Linux​ No need for separate compilers because Linux distributions usually have GNU C/C++ compilers installed already. Install GTK, WebKit, other libraries with the following command. Debian​ sudo apt install \\ libgtk-3-dev \\ libwebkit2gtk-4.0-37 \\ libwebkit2gtk-4.0-dev Fedora​ sudo dnf install \\ @development-tools \\ gtk3 \\ webkit2gtk3.x86_64 \\ webkit2gtk3-devel.x86_64 \\ libgtk-3-dev \\ libwebkit2gtk-4.0-37 \\ libwebkit2gtk-4.0-dev \\ libglib2.0-dev \\ libxrandr-dev Arch​ sudo pacman -S \\ gtk3 \\ webkit2gtk Windows​ Install the latest Visual Studio IDE with Windows SDK. The Neutralinojs compilation process will use the MSVC C++ compiler (aka cl.exe). info How to activate Windows 10 SDK: While installing it in the Visual Studio Installer, go to tab Workloads, section "Desktop & Mobile" and select "Desktop development with C++". On the right in "Installation details" > "Desktop development with C++" > "Optional", make sure "Windows 10 SDK" is checked. macOS​ Install Xcode Command Line Tools. ","version":"Next","tagName":"h3"},{"title":"Compile the Neutralinojs framework.​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#compile-the-neutralinojs-framework","content":" Run the following script in order to build the framework binaries. python scripts/bz.py info You need to have the Python interpreter (version 3.x) installed to run this script. Neutralinojs uses BuildZri C++ build automation tool to generate binaries on local development computers and CI/CD servers. Read the BuildZri documentation to learn more about CLI options and configuration. ","version":"Next","tagName":"h3"},{"title":"Setup and build the client​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#setup-and-build-the-client","content":" Neutralinojs apps communicate with the Neutralinojs process via a WebSocket connection. This WebSocket connection gets initiated by the Neutralinojs client. Clone the client repository to the same directory where you downloaded the main repository. git clone https://github.com/neutralinojs/neutralino.js.git cd neutralino.js Install developer dependencies. npm install ","version":"Next","tagName":"h2"},{"title":"Executing the test app​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#executing-the-test-app","content":" The main repository has a simple test application that you can use during development related activities. You can enter the following command from the main repository to build and update the test app's client. bash ./scripts/update_client.sh Now run the newly compiled test app with the following command. LinuxmacOSWindows ./bin/neutralino-linux_x64 --load-dir-res ","version":"Next","tagName":"h2"},{"title":"Testing​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#testing","content":" Testing is a crucial part in every development activity. Every pull request in the main codebase will trigger the following automated tests. Builds on Linux, macOS, and Windows with x64 machines.Integration test suite. However, you can run our integration test suite from your local computer too with the following command from the main codebase's directory. cd spec npm install npm run test It's always good to run the test suite for the module you've updated with the following command. npm run test <module> # Eg: npm run test filesystem info If you need to run tests for the extensions module, make sure to enter npm install from./bin/extensions/sampleextension first. The above command will run test only for the given module. ","version":"Next","tagName":"h2"},{"title":"Adding a new test case​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#adding-a-new-test-case","content":" To add a test case simply add it to the spec/<module>.spec.js file. For example, if you need to add a new test case to the debug module, add the test case to the spec/debug.spec.js file. Next, run the test suite for that specific module, as shown in the following command snippet: cd spec npm i npm run test debug ","version":"Next","tagName":"h3"},{"title":"Project directory structure​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#project-directory-structure","content":" ","version":"Next","tagName":"h2"},{"title":"Framework​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#framework","content":" Source: github.com/neutralinojs/neutralinojs api: The native API implementation and controllers. Written in REST API style.auth: Authentication and permissions-related logic.bin: Test app source code.lib: Third-party libraries source files.server: WebSocket/HTTP communication endpoints.spec: Integration/API test suite.scripts: Contains automation scripts to build the framework, generate release notes, update the client library, and build resources.neu for the test app. ","version":"Next","tagName":"h3"},{"title":"Client library​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#client-library","content":" Source: github.com/neutralinojs/neutralino.js src/api: JavaScript API frontend and implementaion.src/browser: Browser-related API implementation.src/ws: WebSocket client implementaion.scripts: Contains automation scripts to generate release notes. ","version":"Next","tagName":"h3"},{"title":"Contribution guidelines​","type":1,"pageTitle":"Framework Developer Guide","url":"/docs/contributing/framework-developer-guide#contribution-guidelines","content":" Before, contributing to the codebase, please check the following things. Discuss the feature/improvement/bug-fix with the Neutralinojs team via GitHub discussions.Get familiar with the code style. Write your code according to theNeutralinojs code style guide.Become familiar with all modules in the codebase.Avoid adding new features to only one platform. Thanks for helping us to make Neutralinojs better! ","version":"Next","tagName":"h2"},{"title":"Security","type":0,"sectionRef":"#","url":"/docs/contributing/security","content":"","keywords":"","version":"Next"},{"title":"Port security and authentication​","type":1,"pageTitle":"Security","url":"/docs/contributing/security#port-security-and-authentication","content":" Once you study the Neutralinojs architecture, you will notice that the framework frontend communicates with the framework core via a WebSocket-based network port. Developers who know the operating system internals will argue that the Neutralinojs framework is vulnerable due to the local port-based IPC. Let's understand it this way. The network is undoubtedly vulnerable, but network security strategies make networks secure for every computer user—that's how we trust the internet today. Similarly, Neutralinojs uses the One-Time-Token (OTT) strategy to prevent possible port scanning attacks. Here is how the Neutralinojs local port is secured: The Neutralinojs framework's authentication module generates the OTT during the initialization process and a part of the OTT is saved as Connection Token (CT) for WebSocket clients.When the user loads the client-library script, the framework sends the OTT only once.The client library stores the OTT in the local storage for future usage—the framework never sends the OTT again to the frontend. Depending on the current application mode, the client library stores the OTT in either webview or web browser.The client library uses CT to establish a WebSocket connection with the framework.The OTT is used to verify every native API function call that comes from WebSocket clients (including the client-library).The framework blocks WebSocket connections from remote URLs within window, browser, and Chrome modes. The following criteria need to be satisfied for executing an arbitrary API function via a malicious webpage (local) or program: The specific malicious component needs to capture the OTT before the original application obtains the OTT from the framework core. This attacking strategy is not practical because of the fast application startup and lack of faster ways to access operating system-level process status. Even though someone manages to detect the application startup, the original application requests OTT before the malicious program (The framework sends OTT only once). On the other hand, malicious programs don't need Neutralinojs to damage your computer system, so use programs you trust. Even the OTT request process is not possible with modern web browsers via remote pages due to CORS-like security strategies. Also, we don't even enable the native API for remote pages due to strict application security. If there is a way (there is no proven approach yet) to crack OTT, native API access controls protect the user's computer. ","version":"Next","tagName":"h2"},{"title":"Native API access control and authorization​","type":1,"pageTitle":"Security","url":"/docs/contributing/security#native-api-access-control-and-authorization","content":" The OTT strategy provides authentication for native API access by preventing invalid/vulnerable client connections. The OTT grants access to the native API, but it doesn't give access to everything. Most modern popular application runtimes provide access to everything without proper access control. In the Neutralinojs native API model, developers need to mention the APIs they need explicitly for better security. Developers can define API permission requirements via the native allowlist or blocklist features. The Neutralinojs native API permission system provides authorization support by validating incoming requests with the pre-defined permission matrices. Look at the following authentication/authorization diagram for more details: Moreover, Neutralinojs extensions also securely receive WebSocket authentication details (OTT, CT, and port) via standard input streams, so malicious programs can't obtain connectivity secrets by scanning your process list. Read our security policyto learn how to handle security-related framework issues. ","version":"Next","tagName":"h2"},{"title":"Frequently Asked Questions","type":0,"sectionRef":"#","url":"/docs/contributing/frequently-asked-questions","content":"","keywords":"","version":"Next"},{"title":"Framework​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#framework","content":" ","version":"Next","tagName":"h2"},{"title":"Error Code 127: libayatana-appindicator3.so.1 cannot open shared object file: No such file or directory​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#error-code-127-libayatana-appindicator3so1-cannot-open-shared-object-file-no-such-file-or-directory","content":" We fixed this issue in v4.5.0, so please upgrade your framework version. If you need to use a lower framework version, you need to install the missing package with the following commands to start the app properly: apt update apt install -y libayatana-appindicator3-1 Make sure to run the above commands with sudo. Check the package information for further reference. ","version":"Next","tagName":"h3"},{"title":"CLI​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#cli","content":" ","version":"Next","tagName":"h2"},{"title":"What should I do when I get Missing permission to execute the native method: <namespace.func> error ?​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#what-should-i-do-when-i-get-missing-permission-to-execute-the-native-method-namespacefunc-error-","content":" This error occurs when permissions are not given to execute a specific native method. To be able to run this function, add the namespace.func to the nativeAllowList. To allow all functions of the particular namespace, use namespace.*. Check here to learn more about allowlists. ","version":"Next","tagName":"h3"},{"title":"yarn global add @neutralinojs/neu doesn't complete the installation process.​","type":1,"pageTitle":"Frequently Asked Questions","url":"/docs/contributing/frequently-asked-questions#yarn-global-add-neutralinojsneu-doesnt-complete-the-installation-process","content":" When yarn is used to install neu, the output shows success Installed "@neutralinojs/neu". But, neu commands don't work even after installation, which neu outputs nothing. Check here for further information about the particular issue. This error is more of an yarn issue. To fix it, the developer needs to add the yarn global bin command output to $PATH. For example, we can add the following command to the .bashrc file (or other Shell interpreter initialization scripts): export PATH="$(yarn global bin):$PATH" For more information, check the official documentation of yarn here. ","version":"Next","tagName":"h3"},{"title":"Distribution Overview","type":0,"sectionRef":"#","url":"/docs/distribution/overview","content":"","keywords":"","version":"Next"},{"title":"Application build results​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#application-build-results","content":" The neu build command generates the following files on any supported operating system into the dist directory. Filename\tOS\tCPU architecture\tTypemyapp-linux_x64\tLinux\tx86_64\tApplication binary myapp-linux_armhf\tLinux\tarmhf\tApplication binary myapp-linux_arm64\tLinux\tarm64\tApplication binary myapp-mac_x64\tmacOS\tx86_64\tApplication binary (Intel) myapp-mac_universal\tmacOS\tx86_64 and arm64\tApplication binary myapp-mac_arm64\tmacOS\tarm64\tApplication binary (M1/M2/M3) myapp-win_x64\tWindows\tx86_64\tApplication binary resources.neu\tall\tN/A\tApplication resource file Neutralinojs officially offers only pre-built x64 and armhf/arm64 Linux-only binaries. If you need binaries for other CPU architectures, consider building binaries from the source with this guide. We are trying to officially support all CPU architectures soon! ","version":"Next","tagName":"h2"},{"title":"Selecting files for packaging​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#selecting-files-for-packaging","content":" The neu CLI generates application binaries for all supported platforms at once. These binaries are pre-built binaries. Therefore, please check oursecurity policy before you continue with the distribution process. As the first step for packaging, you can pick two files for each targeted operating system: application binary and the resource file. For example, if you need to make an application package for x64 Linux computers, pick myapp-linux_x64and the resources.neu file. The resources.neu contains all application resources, so, double click on the binary and check whether the resource file is not corrupted. ","version":"Next","tagName":"h2"},{"title":"Creating portable application packages using build scripts​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#creating-portable-application-packages-using-build-scripts","content":" The hschneider/neutralino-build-scripts community project offers pre-developed build scripts for generating platform-specific application bundles. For example, it generates a standard app structure on GNU/Linux by generating .desktop file with app icon by also providing a shell script to install the app. Clone the scripts to your root directory of your app folder to get started with Neutralinojs build scripts: git clone https://github.com/hschneider/neutralino-build-scripts.git build-scripts Install jq, which is required for parsing JSON files: # On macOS: brew install jq # On Linux or Windows/WSL: sudo apt-get install jq Update neutralino.config.json file with build scripts configuration as follows: "buildScript": { "mac": { "architecture": ["x64", "arm64", "universal"], "minimumOS": "10.13.0", "appName": "myapp", "appBundleName": "myapp", "appIdentifier": "com.marketmix.ext.bun.demo", "appIcon": "resources/icons/icon.icns" }, "win": { "architecture": ["x64"], "appName": "myapp", "appIcon": "resources/icons/icon.ico" }, "linux": { "architecture": ["x64", "arm64", "armhf"], "appName": "myapp", "appIcon": "resources/icons/icon.png", "appPath": "/usr/share/myapp", "appIconPath": "/usr/share/myapp/icon.png", "appIconLocation": "/usr/share/myapp/icon.png" } } ","version":"Next","tagName":"h2"},{"title":"Generating an application bundle for macOS​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#generating-an-application-bundle-for-macos","content":" You can generate a new application bundle for macOS by running the following command: ./build-mac.sh The build is created in the ./dist folder. The buildScript/mac JSON segment in the config-file contains the following fields: Key\tDescriptionarchitecture\tThis is an array of the architectures, you want to build. In our example we build all 3 architectures. minimumOS\tThe minimum macOS version. appName\tThe app-name as displayed in the Finder. appBundleName\tThe macOS app-bundle name. appIdentifier\tThe macOS app-identifier. appIcon\tPath to the app-icon in .icns format. If only the filename is submitted, the file is expected in the project's root. Visit the build scripts official documentation for more details. ","version":"Next","tagName":"h3"},{"title":"Generating an application bundle for Windows​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#generating-an-application-bundle-for-windows","content":" You can generate a new application bundle for Windows by running the following command: ./build-win.sh The build is created in the ./dist folder. You can now run install install-icon.cmd to set the app icon as specifed in config file. This script required you to have Resource Hacker installed on your machine. The buildScript/win JSON segment in the config-file contains the following fields: Key\tDescriptionarchitecture\tThis is an array of the architectures, you want to build. Because Neutralino currently only support 'x64', you should leave this untouched. appName\tThe app-name as displayed in the File Explorer, with or without .exe-suffix. appIcon\tPath to the app-icon in .ico format. If only the filename is submitted, the file is expected in the project's root. The icon is copied from this path into the app-bundle. To apply the icon to the executable file, you'll have to run Resource Hacker from a Windows machine. To do so, just double-click install-icon.cmd in the app-bundle. Visit the build scripts official documentation for more details. ","version":"Next","tagName":"h3"},{"title":"Generating an application bundle for Linux​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#generating-an-application-bundle-for-linux","content":" You can generate a new application bundle for GNU/Linux by running the following command: ./build-linux.sh All build targets are created in the ./dist folder. Calling sudo ./install.sh from your build folder automatically installs the app to the locations you defined. The buildScript/linux JSON segment in the config-file contains the following fields: Key\tDescriptionarchitecture\tThis is an array of the architectures, you want to build. In our example we build all 3 architectures. appName\tThe app-name as displayed in the File Explorer. appIcon\tPath to the app-icon in .png or .svg format. If only the filename is submitted, the file is expected in the project's root. The icon is copied from this path into the app-bundle. Example: resources/icons/icon.png appPath\tThe path of application directory in system where the source files will live after installing without the executable name and without ending slash. Example: /usr/share/myapp appIconPath\tThis is path to application icon after the application has been installed in the Linux system. This path is written to the .desktop-file. Example: /usr/share/myapp/icon.png appIconLocation\tSame as appIconPath. Visit the build scripts official documentation for more details. ","version":"Next","tagName":"h3"},{"title":"Creating application installers​","type":1,"pageTitle":"Distribution Overview","url":"/docs/distribution/overview#creating-application-installers","content":" The following guides are not documented yet. Creating an application installer for LinuxCreating an application installer for macOSCreating an application installer for Windows ","version":"Next","tagName":"h2"},{"title":"Your First Neutralinojs App","type":0,"sectionRef":"#","url":"/docs/getting-started/your-first-neutralinojs-app","content":"","keywords":"","version":"Next"},{"title":"Introduction​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#introduction","content":" We are going to create a simple application using Neutralinojs. This sample application will display Hello with the current username of your operating system. For example, if the current username is John, it will show, Hello John. note This tutorial uses Vanilla JavaScript for building the app. If you would like to use a frontend library, check this guide. ","version":"Next","tagName":"h2"},{"title":"Step 0: Installing neu CLI​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-0-installing-neu-cli","content":" You need to install neu CLI to create Neutralinojs applications. However, you can develop applications without CLI as well. But, the CLI will make some hard stuff easy. Run the following command on your terminal to install neu CLI globally. npm install -g @neutralinojs/neu If you don't want a global installation, use neu CLI with npx. npx @neutralinojs/neu <command> ","version":"Next","tagName":"h2"},{"title":"Step 1: Creating a new app​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-1-creating-a-new-app","content":" Enter the following command to scaffold a new app. neu create myapp The above command will create a new app inside myapp directory. To make sure whether everything is fine, run your application. cd myapp neu run info If you are on Windows, you might get a blank white screen. The reason for this is, accessing localhost from a UWP context is disabled by default. Run the following command with administrative privileges on the command prompt to fix this. CheckNetIsolation.exe LoopbackExempt -a -n="Microsoft.Win32WebViewHost_cw5n1h2txyewy" You may include this in your Windows setup files (with the user's consent) because users also may get an empty white screen on Windows. For better developer experience, we recommend you to install the WebView2 runtime on Windows. ","version":"Next","tagName":"h2"},{"title":"Step 2: Writing JavaScript, HTML, and CSS​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-2-writing-javascript-html-and-css","content":" Insert the following content into your application resource files. index.htmlstyles.cssmain.js <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>NeutralinoJs</title> <link rel="stylesheet" href="styles.css"> </head> <body> <div id="neutralinoapp"> <h1 id="name"></h1> </div> <script src="js/neutralino.js"></script> <script src="js/main.js"></script> </body> </html> Neutralinojs prevents arbitary native API function execution unlike Node.js environments. Here we used the os.getEnv native function, so check whether your application configuration allows the application frontend to execute it. The default configuration already allows the entire os namespace with the following nativeAllowList permission setup: "nativeAllowList": [ "app.*", "os.*", "debug.log" ], We don't need to update anything in the permission setup since it already allows os.getEnv native function calls. ","version":"Next","tagName":"h2"},{"title":"Step 3: Running your application​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-3-running-your-application","content":" As mentioned above, you can use the run command to start your application. neu run Congrats! your application works. info The neu run command will reload your application when there is a change in application resources. Try to change your index.html while the application is running. ","version":"Next","tagName":"h2"},{"title":"Step 4: Building your application ​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#step-4-building-your-application","content":" To make portable binaries for your application, we can use the build command. Enter the following command on your terminal to make final binaries for all supported platforms.  neu build --release The above command will produce binaries for all platforms into the dist directory and the --release flag will also package your binaries into a .zip file. This command will do the work blazing fast because there is no compilation process behind. ","version":"Next","tagName":"h2"},{"title":"What's next?​","type":1,"pageTitle":"Your First Neutralinojs App","url":"/docs/getting-started/your-first-neutralinojs-app#whats-next","content":" Now you know how to create Neutralinojs applications. We will suggest you to look into the following topics next. neutralino.config.jsonProject structureneu CLIGlobal variablesApplication modesNative API overview We've built the above example application with vanilla JavaScript. However, you can use your favorite frontend framework to build Neutralinojs apps. Check more details about frontend framework support here. ","version":"Next","tagName":"h2"},{"title":"Auto Updater","type":0,"sectionRef":"#","url":"/docs/how-to/auto-updater","content":"","keywords":"","version":"Next"},{"title":"Creating the update manifest​","type":1,"pageTitle":"Auto Updater","url":"/docs/how-to/auto-updater#creating-the-update-manifest","content":" When you ask Neutralinojs to check for updates, it will check the update manifest via the network. Update manifest refers to a JSON document which has the following format. { "applicationId": "js.neutralino.sample", "version": "0.0.2", "resourcesURL": "http://example.com/updater_test/update_res.neu", "data": { } } applicationId String: Application identifier. You need to use the same name you used in neutralinojs.config.json. Otherwise, the update check operation will not proceed.version String: Application version.resourcesURL String: A link to download resources.neu. You can use any file name as you wish, but make sure to serve data with the Content-Type: application/octet-stream header.data Object (optional): Additional data about the update. Accepts any JSON value. ","version":"Next","tagName":"h2"},{"title":"Hosting the update manifest and resources​","type":1,"pageTitle":"Auto Updater","url":"/docs/how-to/auto-updater#hosting-the-update-manifest-and-resources","content":" Host the application manifest and resources file on the internet or a private network according to your access requirements. You can test auto updater locally by setting up a static server or placing update manifest and the resource file into your application's resources directory. Also, you can setup a DevOps pipeline to automate your application updates if you need. If you release a new application version by upgrading Neutralinojs server, users have to download/install the app again since the auto updater only update application resources (including Neutralinojs client). ","version":"Next","tagName":"h2"},{"title":"Writing code to update your app​","type":1,"pageTitle":"Auto Updater","url":"/docs/how-to/auto-updater#writing-code-to-update-your-app","content":" Call the following function whenever you need to check for updates. try { let url = "http://example.com/updater_test/update_manifest.json"; let manifest = await Neutralino.updater.checkForUpdates(url); } catch(err) { // Handle errors } Next, you can use the manifest object to compare versions. try { let url = "http://example.com/updater_test/update_manifest.json"; let manifest = await Neutralino.updater.checkForUpdates(url); if(manifest.version != NL_APPVERSION) { await Neutralino.updater.install(); await Neutralino.app.restartProcess(); } } catch(err) { // Handle errors } As shown in the above code snippet, you can call Neutralino.updater.install to perform the update based on the downloaded manifest. Later, restart the application with the app.restartProcess function. ","version":"Next","tagName":"h2"},{"title":"CLI","type":0,"sectionRef":"#","url":"/docs/release-notes/cli","content":"","keywords":"","version":"Next"},{"title":"Unreleased​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#unreleased","content":" ","version":"Next","tagName":"h2"},{"title":"v11.3.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1130","content":" ","version":"Next","tagName":"h2"},{"title":"Host projects support​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#host-projects-support","content":" Developers can launch Neutralinojs from any programming language using child process APIs (i.e., subprocess in Python) and communicate with the framework process using the extension API. The new hostProject configuration object extends the official CLI to help developers easily create, run, and build these host projects. For example, the following host project configuration instructs the CLI to run a Node.js host project: "hostProject": { "projectPath": "/node-src", "buildPath": "/node-src/dist/", "initCommand": "npm install", "devCommand": "npm start", "buildCommand": "npm run build" } Community projects implement bindings and templates to create host projects using Node.js, Python, Go, etc. For example, the node-neutralino NPM package lets you launch Neutralinojs via Node.js environments and execute native APIs via the NeutralinoApp class: import NeutralinoApp from 'node-neutralino'; const app = new NeutralinoApp({ url: '/', windowOptions: { enableInspector: false, } }); app.init(); app.window.setTitle('Node.js'); ","version":"Next","tagName":"h3"},{"title":"Executable icon and metadata on Windows​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#executable-icon-and-metadata-on-windows","content":" Now, the neu build command automatically updates the executable file icon and metadata based on the following configuration options: author: gets written into executable's metadata.description: gets written into executable's metadata.copyright: gets written into executable's metadata. Defaults to current date + generic "all rights reserved".applicationName: gets written into executable's metadata. Defaults to cli.binaryName.applicationIcon: a relative path to an icon in .png format. Defaults to modes.window.icon. If it is not set, uses Neutralinojs logo. ","version":"Next","tagName":"h3"},{"title":"Using Frontend Libraries","type":0,"sectionRef":"#","url":"/docs/getting-started/using-frontend-libraries","content":"","keywords":"","version":"Next"},{"title":"React​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#react","content":" neu create myapp --template codezri/neutralinojs-react cd myapp # Start the React development server with Neutralinojs neu run # Build the React and Neutralinojs app neu build Repository: codezri/neutralinojs-react ","version":"Next","tagName":"h2"},{"title":"Using any frontend library​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#using-any-frontend-library","content":" The following tutorial guides you to set up any frontend library with Neutralinojs by explaining how we built the Neutralinojs React template: ","version":"Next","tagName":"h2"},{"title":"Initializing projects​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#initializing-projects","content":" First, you need to create a new empty Neutralinojs project. Use theneutralinojs/neutralinojs-zero template to create an empty project, as shown below. neu create myapp --template neutralinojs/neutralinojs-zero Now, create a new project with your favourite frontend framework's command-line tools. In this tutorial, we are going to use React, but you can use any frontend library as you wish. You need to create this project inside the myapp directory. cd myapp npx create-react-app react-src ","version":"Next","tagName":"h3"},{"title":"Configuring Neutralinojs project​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#configuring-neutralinojs-project","content":" The neutralinojs-zero template has a pre-included HTML file and icon, so delete the www directory since we don't need those files now. rm -rf www You need to configure the Neutralinojs project to support the frontend framework. First, you can set the document root with your frontend framework's build directory. React typically generates build outputs tobuild directory, so we can update documentRoot as follows. "documentRoot": "/react-src/build/" Now, our Neutralinojs app knows the application resource location, but it's missing an icon, so set an icon for the app. You can load an icon from your frontend framework's default resources directory. For demonstration purposes, let's use the React icon from the public directory. "modes": { "window": { // --- other options "icon": "/react-src/public/logo192.png" } } ","version":"Next","tagName":"h3"},{"title":"Configuring neu CLI​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#configuring-neu-cli","content":" By default, the zero template configuration asks the Neutralinojs CLI to download the Neutralinojs client (aka neutralino.js) from GitHub releases. Then, the CLI creates your app package by copying the neutralino.js file. However, you can download the client library from the NPM registry and bundle with your app frontend. Remove the clientLibrary property from the Neutralinojs configuration to avoid fetching the client from GitHub releases: We can configure CLI for React by using the following options. "cli": { // --- other options "resourcesPath": "/react-src/build/", // --- "clientLibrary": "/www/neutralino.js", // <--- Remove this option // --- } Now, you can build and run the React application as a Neutralinojs application — it's possible with the following steps. First, build the React application with the following command. cd react-src npm run build Finally, run the Neutralinojs application. cd .. neu run ","version":"Next","tagName":"h3"},{"title":"Initializing native API with @neutralinojs/lib​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#initializing-native-api-with-neutralinojslib","content":" You could run the application with the neu run command, but you cannot use the native API yet because it has not been initialized. To do that you need to install the Neutralinojs client with following command: cd react-src npm install @neutralinojs/lib The next step is to load Neutralinojs global variables. You can achieve that by including JavaScript script in the root HTML file of a framework of your choice. React typically holds the main HTML file content in the ./public/index.html file, so we can put the following HTML snippet there to load the client library. <script src="%PUBLIC_URL%/__neutralino_globals.js"></script> Now make sure to initialize the client library from your frontend application entry point file. React's application entry-point is typically ./src/index.js. Therefore, we can do the initialization process from there by calling the init function from @neutralinojs/lib package. import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; // Import init function from "@neutralinojs/lib" import { init } from "@neutralinojs/lib" ReactDOM.render( <React.StrictMode> <App /> </React.StrictMode>, document.getElementById('root') ); init(); // Add this function call Let's validate if the client library loaded properly. To do that let's use filesystem API in order to read the current directory of Neutralinojs app. Firstly you need to update neutralino.config.json to allow what API your application can call. You can enable the whole namespace filesystem.* or just single function from a given namespace like in the snippet below. "nativeAllowList": [ "app.*", "filesystem.readDirectory" ], Now let's add following snippet in ./src/App.js file which will log the current directory or error message when App component is mounted. import { useEffect } from 'react' import './App.css'; // Import filesystem namespace import { filesystem } from "@neutralinojs/lib" function App() { // Log current directory or error after component is mounted useEffect(() => { filesystem.readDirectory('./').then((data) => { console.log(data) }).catch((err) => { console.log(err) }) }, []) return ( <div className="App"> My Neutralinojs App </div> ); } export default App; The last step is to run your Neutralinojs app with --window-enable-inspector argument which will allow you to open developer tools. cd react-src npm run build cd .. neu run -- --window-enable-inspector The current directory should be logged to the console. To open developer tools right click anywhere in the Neutralinojs application and press inspect element. ","version":"Next","tagName":"h3"},{"title":"Enabling hot-reload and configuration​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#enabling-hot-reload-and-configuration","content":" Building every code change and testing your application is undoubtedly time-consuming. Therefore, you can use your frontend framework's HMR (Hot Module Replacement) features to speed up your development activities. But, we have a small issue here. There are now two HTTP servers: the Neutralinojs resource server and the frontend framework's development server. How can we load the Neutralinojs client library from the frontend framework's development server? Don't worry — neu CLI provides a built-in feature to enable HMR by patching the main HTML file. You can add the following section to your configuration file for activating hot-reloading. "cli": { // --- other options "frontendLibrary": { "patchFile": "/react-src/public/index.html", "devUrl": "http://localhost:3000" } } } The above options tell neu CLI about the main HTML file and development server URL. Next, configure your project by adding frontend-library-specific development commands as follows: "cli": { // --- other options "frontendLibrary": { "patchFile": "/react-src/public/index.html", "devUrl": "http://localhost:3000", "projectPath": "/react-src/", "initCommand": "npm install", "devCommand": "BROWSER=none npm start", "buildCommand": "npm run build" } } } Finally, run the Neutralinojs application with the following command. neu run The above command executes the devCommand, starts the React development server, and run the Neutralinojs app in development mode. ","version":"Next","tagName":"h3"},{"title":"Packaging​","type":1,"pageTitle":"Using Frontend Libraries","url":"/docs/getting-started/using-frontend-libraries#packaging","content":" To produce the app binaries, you can use the following command, as usual: neu build --release The above command executes the buildCommand first, so the application bundle will use the currect React project source. See the full source code of this tutorial here. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements","content":" Use the zip-lib package to handle ZIP files for better performance and simplicity in the source code. ","version":"Next","tagName":"h3"},{"title":"v11.2.2​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1122","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-1","content":" Fix initial loading issues with frontend library development file patching. ","version":"Next","tagName":"h3"},{"title":"v11.2.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1120","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler","content":" Introduce the --clean flag to the neu build command to clean previous build files.Add file excluding feature for the app bundle and extensions directory via cli.resourcesExclude and cli.extensionsExclude configuration properties. For example, now developers can use the "resourcesExclude": ".*\\\\.scss$|.*\\\\.d.ts$" configuration to exclude *.scss and *.d.ts files from the final app bundle.Let app developers customize the frontend library development server wait time using the cli.frontendLibrary.waitTimeout configuration property. ","version":"Next","tagName":"h2"},{"title":"Core: Version​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-version","content":" The neu version command now compares the installed CLI version and the framework version with the latest released versions and displays a warning messages if the users use an older versions.The neu version command now displays the (latest) tag with CLI, binary, client library version details. ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-2","content":" Check and validate neutralino.config.json file before executing app-specific commands.Check app template validity before downloading content from a specific GitHub repository using the official GitHub API.Add the app icon to the final app bundle only the specific project uses an app icon.Fix the port waiting timeout issue with frontend library-based development workflow. ","version":"Next","tagName":"h3"},{"title":"v11.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1110","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-1","content":" Add cli.distributionPath into the neutralino.config.json file to customize the default dist distribution directory. ","version":"Next","tagName":"h3"},{"title":"v11.0.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1101","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-3","content":" Clean existing app build files before creating another build using the neu build command.Support older Node versions by removing the optional chaining feature usage.Fix the endless port waiting issue with the --frontend-lib-dev option. ","version":"Next","tagName":"h3"},{"title":"v11.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1100","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner","content":" Change the WebSocket connection based on the v5 framework APIs. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-4","content":" Fixed issues with the frontend library command execution. ","version":"Next","tagName":"h3"},{"title":"v10.1.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1011","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-5","content":" Fixed app development issues with the Vite server. ","version":"Next","tagName":"h3"},{"title":"v10.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1010","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-6","content":" Fixed several issues in the frontend-library-based development flow (i.e., removed the hardcoded port number, fixed double devCommand execution, etc.,). ","version":"Next","tagName":"h3"},{"title":"v10.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v1000","content":" ","version":"Next","tagName":"h2"},{"title":"Core: frontend-library-based development​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-frontend-library-based-development","content":" Added new configuration options to the cli.frontendLibrary key of the neutralino.config.json: projectPath: Sets the project path of the frontend-library project. This path will be used as the current directory while executing the frontend-app-related commands.initCommand: A command that gets executed after downloading an app template with the neu create command.devCommand: This command will run with the neu run command to start the frontend development server. The CLI doesn't wait for devCommand completion, instead, it will wait for the frontend development server via the tcp-port-used package.buildCommand: The neu build command will execute this command before generating the app bundle, so you can generate static resources of your frontend app using this command. ","version":"Next","tagName":"h3"},{"title":"v9.8.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v980","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Downloader​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloader","content":" Download the latest Neutralinojs framework resources with the --latest option in the neu update command.If framework versions are not present in the app/template configuration, download the latest framework resources automatically. The CLI will download nightly releases if it can't fetch the latest release tag because of an GitHub API-related issue (i.e., Exceeded rate limits). ","version":"Next","tagName":"h3"},{"title":"v9.7.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v970","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Downloader/bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloaderbundler","content":" Download the TypeScript definition file for standalone client library mode. This won't include the TypeScript definition file to the final application bundle. ","version":"Next","tagName":"h3"},{"title":"v9.6.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v961","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/Improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-7","content":" Fix the hot-reloading issue that occurs with newer Node runtime versions. ","version":"Next","tagName":"h3"},{"title":"v9.6.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v960","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-2","content":" Avoid copying the WebView2Loader.dll file to the final app package since it was removed from the Neutralinojs framework. ","version":"Next","tagName":"h3"},{"title":"v9.5.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v951","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes/Improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-8","content":" Use the decompress library instead of unzipper to fix issues with latest Node.js runtime versions.Generate the Mac universal binary with the neu build command. ","version":"Next","tagName":"h3"},{"title":"v9.5.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v950","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#devops","content":" Implement a way to test plugins locally. ","version":"Next","tagName":"h3"},{"title":"v9.4.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v940","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps: new test suite​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#devops-new-test-suite","content":" Initiate a new Node.js-based test suite. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/Improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-9","content":" Clean project files if the neu create command wan't successful.Display an error message if the neu build --copy-storage fails due to missing .storage directory.Support Darwin arm64 binaries natively without binary translation (x64 -> arm64).Make the client library downloading process optional and support importing the client library via @neutralinojs/lib.Download the module version of the client library based on the app configuration. ","version":"Next","tagName":"h3"},{"title":"v9.3.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v931","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Plugins​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-plugins","content":" Automatically re-install plugins when the neu CLI version is upgraded/downgraded via package managers. ","version":"Next","tagName":"h3"},{"title":"Core: downloader/builder​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloaderbuilder","content":" Support ARM (armhf/arm64) binaries. ","version":"Next","tagName":"h3"},{"title":"v9.3.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v930","content":" ","version":"Next","tagName":"h2"},{"title":"General​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#general","content":" Add short descriptions for each command.Support to download nightly build versions. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixesimprovements-10","content":" Fix plugin listing issue. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#devops-1","content":" Add a simple test-suite for testing CLI commands with a Bash script. ","version":"Next","tagName":"h3"},{"title":"v9.2.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v920","content":" ","version":"Next","tagName":"h2"},{"title":"General​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#general-1","content":" Improve log messages and styles ","version":"Next","tagName":"h3"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-1","content":" Display Neutralinojs process's STDIN and STDERR streams directly on the console.Remove --verbose option from the run command. ","version":"Next","tagName":"h3"},{"title":"v9.1.2​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v912","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-2","content":" Fix client library path issue with hot-reload workaround on Windows. ","version":"Next","tagName":"h3"},{"title":"v9.1.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v911","content":" ","version":"Next","tagName":"h2"},{"title":"Bugfixes​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixes","content":" Fix browser mode exit issue with neu run. ","version":"Next","tagName":"h3"},{"title":"v9.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v910","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-3","content":" Add a workaround to use hot module reloading from the app developer's existing frontend library/framework. ","version":"Next","tagName":"h3"},{"title":"v9.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v900","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Creator​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-creator","content":" Allow downloading any community template via neu create myapp --template <template>. <template> accepts valid GitHub repo identifiers. The default value is neutralinojs/neutralinojs-minimal. ","version":"Next","tagName":"h3"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-4","content":" Add --verbose option to identify framework initialization crashes. It will show STDERR and STDOUT of the framework once the process was terminated.Support sending any internal CLI argument to the Neutralinojs process via neu run -- <additional_args>.Remove --mode=<mode> option from run since the same work can be done with neu run -- --mode=<mode>. ","version":"Next","tagName":"h3"},{"title":"Bugfixes and improvements​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixes-and-improvements","content":" Fix the infinite retry issue with the neu run command.Show an error message for download failures. ","version":"Next","tagName":"h3"},{"title":"v8.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v810","content":" ","version":"Next","tagName":"h2"},{"title":"Core: File watcher​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-file-watcher","content":" Exclude auto-reload files via cli.autoReloadExclude.Watch only the cli.resourcesDir to avoid many unwanted reloads. ","version":"Next","tagName":"h3"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-3","content":" Add new --copy-storage flag to automatically copy storage data to the app bundle. ","version":"Next","tagName":"h3"},{"title":"v8.0.1​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v801","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-4","content":" Make cli.extensionsDir optional for bundling process. ","version":"Next","tagName":"h3"},{"title":"Bugfixes​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#bugfixes-1","content":" Fix an issue in websocket error log. ","version":"Next","tagName":"h3"},{"title":"v8.0.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v800","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Bundler​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-bundler-5","content":" Copy extensions to the app bundle.Rename res.neu to resources.neu. ","version":"Next","tagName":"h3"},{"title":"Core: Runner​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-runner-5","content":" Use websocket connection to auto reload app. ","version":"Next","tagName":"h3"},{"title":"v7.1.0​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#v710","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Downloader​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#core-downloader-1","content":" Use server/client versions from config ","version":"Next","tagName":"h3"},{"title":"neu version​","type":1,"pageTitle":"CLI","url":"/docs/release-notes/cli#neu-version","content":" Removed global Neutralino version details ","version":"Next","tagName":"h3"},{"title":"Client Library","type":0,"sectionRef":"#","url":"/docs/release-notes/client-library","content":"","keywords":"","version":"Next"},{"title":"Unreleased​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#unreleased","content":" ","version":"Next","tagName":"h2"},{"title":"v5.4.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v540","content":" ","version":"Next","tagName":"h2"},{"title":"API: resources​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-resources","content":" Export getFiles(), extractFile(path, dest), readFile(path), and readBinaryFile(path) functions. ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window","content":" Export minimize(), unminimize(), and isMinimized() functions.Add alwaysCapture and dragMinDistance options to the window.setDraggableRegion() function and improve the performance of the overall draggable window implementation. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#bugfixesimprovements","content":" Fix several issues with TypeScript exports and definitions. ","version":"Next","tagName":"h3"},{"title":"v5.3.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v530","content":" ","version":"Next","tagName":"h2"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem","content":" Expose filesystem.getAbsolutePath(path), filesystem.getRelativePath(path, ?base), and filesystem.getPathParts(path) functions. ","version":"Next","tagName":"h3"},{"title":"v5.2.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v520","content":" ","version":"Next","tagName":"h2"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-1","content":" Accept overwrite, skip, and recursive options for the filesystem.copy() function. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#bugfixesimprovements-1","content":" Improve the window.create() function's option-to-CLI argument mapping logic. ","version":"Next","tagName":"h3"},{"title":"v5.1.1​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v511","content":" ","version":"Next","tagName":"h2"},{"title":"NPM​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#npm","content":" Fix the NPM package import issue. ","version":"Next","tagName":"h3"},{"title":"v5.1.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v510","content":" ","version":"Next","tagName":"h2"},{"title":"API: clipboard​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-clipboard","content":" Export new framework functions: clipboard.getFormat(), clipboard.readImage(), and clipboard.writeImage(image). ","version":"Next","tagName":"h3"},{"title":"TypeScript​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#typescript","content":" Separate type definitions into a new directory to improve project structure.Add missing type definitions. ","version":"Next","tagName":"h3"},{"title":"v5.0.1​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v501","content":" ","version":"Next","tagName":"h2"},{"title":"TypeScript​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#typescript-1","content":" Fix type declaration issues with the window global object. Now, window.NL_VERSION, etc. won't display errors on code editors or with the TypeScript compiler. ","version":"Next","tagName":"h3"},{"title":"v5.0.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v500","content":" ","version":"Next","tagName":"h2"},{"title":"API: app​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-app","content":" Expose app.readProcessInput(readAll=false), app.writeProcessOutput(), and app.writeProcessError() functions. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-2","content":" Export/deprecate functions based on framework's v5 release. See framework changelog for more details. ","version":"Next","tagName":"h3"},{"title":"v3.13.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3130","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-1","content":" Add extendUserAgentWith and exitProcessOnClose options to window.create TypeScript definition. ","version":"Next","tagName":"h3"},{"title":"v3.12.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3120","content":" ","version":"Next","tagName":"h2"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#improvementsbugfixes","content":" Improved the performance of the draggable regions API by throttling Neutralino framework function calls.Fix the restarting issue that happens when the app path contains spaces. ","version":"Next","tagName":"h3"},{"title":"v3.11.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3110","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-2","content":" Avoid saving the window state for child windows in the window.create function by using the --window-use-saved-state=false internal CLI argument. ","version":"Next","tagName":"h3"},{"title":"v3.10.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v3100","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-3","content":" Export the window.center function. ","version":"Next","tagName":"h3"},{"title":"v3.9.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v390","content":" ","version":"Next","tagName":"h2"},{"title":"API: file watchers​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-file-watchers","content":" Export filesystem.createWatcher and filesystem.removeWatcher functions. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#devops","content":" Publish to NPM only if there are unreleased changes in changelog. ","version":"Next","tagName":"h3"},{"title":"v3.8.2​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v382","content":" ","version":"Next","tagName":"h2"},{"title":"NPM/ESM support​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#npmesm-support","content":" Add ESM support for the client library via neutralino.mjs.Publish (and automate) the client library as an NPM package,@neutralinojs/lib. ","version":"Next","tagName":"h3"},{"title":"v3.8.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v380","content":" ","version":"Next","tagName":"h2"},{"title":"API: custom methods and file streams​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-custom-methods-and-file-streams","content":" Expose functions in framework's custom methods and file streams implementations. ","version":"Next","tagName":"h3"},{"title":"v3.7.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v370","content":" ","version":"Next","tagName":"h2"},{"title":"API: os, filesystem, storage, and computer​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-os-filesystem-storage-and-computer","content":" Expose new framework functions: os.getEnvs, storage.getKeys, and computer.getMousePosition.Add size and pos options to filesystem.readFile and filesystem.readBinaryFile functions. ","version":"Next","tagName":"h3"},{"title":"v3.6.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v360","content":" ","version":"Next","tagName":"h2"},{"title":"API: System information API​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-system-information-api","content":" Expose the new system information API functions: computer.getArch, computer.getKernelInfo, computer.getOSInfo, computer.getCPUInfo, and computer.getDisplays. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-os","content":" Add the defaultPath option to set the default file path for all file dialogs. ","version":"Next","tagName":"h3"},{"title":"v3.5.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v350","content":" ","version":"Next","tagName":"h2"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-3","content":" Expose createdAt and modifiedAt JavaScript timestamps with the filesystem.getStats function. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-os-1","content":" Add new functions for spawning processes. spawnProcess, getSpawnedProcesses, and updateSpawnedProcess. ","version":"Next","tagName":"h3"},{"title":"v3.4.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v340","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#devops-1","content":" Add nightly builds support. Developers can download the nightly builds by setting cli.clientVersion to nightly. ","version":"Next","tagName":"h3"},{"title":"Core: global variables​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-global-variables","content":" Add NL_CCOMMIT to hold the release commit of the client library. ","version":"Next","tagName":"h3"},{"title":"v3.3.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v330","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-4","content":" Add window.getPosition to get the current window coordinates. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-filesystem-4","content":" Add filesystem.appendFile to append text content to a file. Thrown errors are similar to the filesystem.writeFile function.Add filesystem.appendBinaryFile to append binary content to a file. Thrown errors are similar to the filesystem.writeBinaryFile function. ","version":"Next","tagName":"h3"},{"title":"v3.2.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v320","content":" ","version":"Next","tagName":"h2"},{"title":"API: init​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-init","content":" Store NL_TOKEN in sessionStorage and handle native API calls after page reload.Show a message to the user via HTML if NL_TOKEN is not valid (Eg: when the user tries to open the app from another client with one-time token). ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-window-5","content":" Add window.setAlwaysOnTop(bool).Add window.getSize. ","version":"Next","tagName":"h3"},{"title":"v3.1.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v310","content":" ","version":"Next","tagName":"h2"},{"title":"API: clipboard​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-clipboard-1","content":" clipboard.readText and clipboard.writeText functions added. ","version":"Next","tagName":"h3"},{"title":"v3.0.0​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#v300","content":" ","version":"Next","tagName":"h2"},{"title":"Core: Extensions​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-extensions","content":" Extension API functions. Queue messages dispatched to extensions and send when the extension is ready. ","version":"Next","tagName":"h3"},{"title":"Core: Init​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-init","content":" Reload app based on --neu-dev-auto-reload (--debug-mode removed) with the neuDev_reloadApp event. ","version":"Next","tagName":"h3"},{"title":"API: window.create​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-windowcreate","content":" Return process information with the promise. ","version":"Next","tagName":"h3"},{"title":"API: window.setDraggableRegion​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-windowsetdraggableregion","content":" Allow passing DOM element as the param. ","version":"Next","tagName":"h3"},{"title":"API: window.unsetDraggableRegion​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-windowunsetdraggableregion","content":" Newly introduced method to remove draggable region handlers from an element. ","version":"Next","tagName":"h3"},{"title":"API: Updater​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#api-updater","content":" Updater API functions. ","version":"Next","tagName":"h3"},{"title":"Improvements​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#improvements","content":" Make return values of events namespace functions consistent.Rename res.neu to resources.neu. ","version":"Next","tagName":"h3"},{"title":"Core: Ping on browsers​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#core-ping-on-browsers","content":" Polling action to the server was removed and replaced by the server process's internal idle check. app.keepAlive was removed. ","version":"Next","tagName":"h3"},{"title":"Events​","type":1,"pageTitle":"Client Library","url":"/docs/release-notes/client-library#events","content":" Client-side implementaion of extensionReady.Allow developers to call native APIs without depending on the ready event (it's not removed becuase of the internal usage). ","version":"Next","tagName":"h3"},{"title":"Extensions Overview","type":0,"sectionRef":"#","url":"/docs/how-to/extensions-overview","content":"","keywords":"","version":"Next"},{"title":"Defining the extensions​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#defining-the-extensions","content":" First, you need to define extensions you use in neutralinojs.config.json with the following structure. "extensions": [ { "id": "js.neutralino.sampleextension", "commandLinux": "${NL_PATH}/extensions/binary/linux/ext_bin", "commandDarwin": "${NL_PATH}/extensions/binary/mac/ext_bin", "commandWindows": "${NL_PATH}/extensions/binary/win/ext_bin.exe" }, { "id": "js.neutralino.binaryextension", "command": "node ${NL_PATH}/extensions/binary/main.js", } ] id String: A unique key to identify each extension. This id cannot contain any characters except for letters, numbers, and periods.command String (optional): A cross-platform command to start the extension. Eg: node ${NL_PATH}/extensions/binary/main.jswill work on every platform.commandLinux String (optional): Extension startup command for Linux.commandDarwin String (optional): Extension startup command for macOS.commandWindows String (optional): Extension startup command for Windows. ","version":"Next","tagName":"h2"},{"title":"Enable the extensions feature​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#enable-the-extensions-feature","content":" The extensions API is disabled by default. Enable extensions by adding the following setting to your app config. "enableExtensions": true ","version":"Next","tagName":"h2"},{"title":"Connecting an extension with Neutralinojs​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#connecting-an-extension-with-neutralinojs","content":" As you already noticed, an extension is just a separate process. Neutralinojs starts spawning extension instances during the framework bootstrap process and initiates each extension process by sending the following JSON object via standard input streams: { "nlPort": "", "nlToken": "", "nlConnectToken": "", "nlExtensionId": "" } The above JSON properties contains connectivity information as follows: nlPort: port of the Neutralinojs server.nlToken: Access token to use the native API.nlConnectToken: A token that extension should send during WebSocket connection initialization.nlExtensionId: Extension identifier. Now, you can connect with the Neutralinojs server with the above details. Use the following WebSocket URL to initiate a new WebSocket connection. ws://localhost:{port}?extensionId={extensionId}&connectToken={connectToken} ","version":"Next","tagName":"h2"},{"title":"Sending a message from app to an extension​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#sending-a-message-from-app-to-an-extension","content":" The extensions API uses an event-based messaging protocol. Every message uses the following JSON structure. { "event": "<event_name>", "data": {} } Use the built-in extensions API to send a message to any extension, as shown below. let extension = 'js.neutralino.sampleextension'; let event = 'helloExtension'; let data = { testValue: 10, }; await Neutralino.extensions.dispatch(extension, event, data); The above code snippet sends a message to the js.neutralino.sampleextension extension instance. You can send messages to extensions with the dispatch function anytime. If you send a message before the extension connects with the main process, the Neutralinojs client library queues and sends it when the target extension's connection is established. In other words, you don't need to worry about extensions' status when you send messages to extensions. ","version":"Next","tagName":"h2"},{"title":"Sending a message from the extension to app​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#sending-a-message-from-the-extension-to-app","content":" When you connect your extensions with the Neutralinojs main process, you can call the native API by sending WebSocket messages to the Neutralinojs process directly. Neutralinojs server processes messages based on the following format. { "id": "<id>", "method": "<method>", "accessToken": "<token>", "data": {} } id String: A UUID v4 string.method String: Native method name. Eg: window.setTitle.accessToken String: Access token generated by the Neutralinojs server.data Object (optional): Parameters for the native method. You can invoke the app.broadcast native method to send messages to all app instances. Register a callback with the events.on in the application code to receive the message send by the extension process. ","version":"Next","tagName":"h2"},{"title":"Terminating an extension instance​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#terminating-an-extension-instance","content":" When Neutralino exits, it does not send kill signals to all extension instances. Therefore, it is necessary to stop the extension process when the WebSocket-based IPC (Inter-Process Communication) closes. The following Node.js extension code shows how to do this: const fs = require('fs'); const process = require('process'); const WS = require('websocket').w3cwebsocket; const { v4: uuidv4 } = require('uuid'); const chalk = require('chalk'); // Obtain required params to start a WS connection from stdIn. const processInput = JSON.parse(fs.readFileSync(process.stdin.fd, 'utf-8')); const NL_PORT = processInput.nlPort; const NL_TOKEN = processInput.nlToken; const NL_CTOKEN = processInput.nlConnectToken; const NL_EXTID = processInput.nlExtensionId; const client = new WS( `ws://localhost:${NL_PORT}?extensionId=${NL_EXTID}&connectToken=${NL_CTOKEN}` ); client.onerror = () => log("Connection error!", "ERROR"); client.onopen = () => log("Connected"); client.onclose = () => process.exit(); client.onmessage = (e) => { const { event, data } = JSON.parse(e.data); if (event === "eventToExtension") { log(data); client.send( JSON.stringify({ id: uuidv4(), method: "app.broadcast", accessToken: NL_TOKEN, data: { event: "eventFromExtension", data: "Hello app!" }, }) ); } }; function log(message, type = "INFO") { const logLine = `[${NL_EXTID}]: ${chalk[ type === "INFO" ? "green" : "red" ](type)} ${message}`; console[type === "INFO" ? "log" : "error"](logLine); } This code implements a simple Node.js extension for Neutralinojs, which establishes a WebSocket connection to the Neutralinojs server and handles incoming messages from the server. It also sends a message to the server using the client.send method when it receives a specific event from the server. For more information on how to terminate an extension instance, you can refer to the sample extension source.https://github.com/neutralinojs/neutralinojs/tree/main/bin/extensions/sampleextension ","version":"Next","tagName":"h2"},{"title":"Using Neutralinojs from your source files​","type":1,"pageTitle":"Extensions Overview","url":"/docs/how-to/extensions-overview#using-neutralinojs-from-your-source-files","content":" The above approach helps you to extend Neutralinojs API with a custom backend code. Neutralinojs process can spawn multiple extensions as child processes and communicate with the internal messaging protocol. On the other hand, you can spawn Neutralinojs processes from your own processes and communicate with the same messaging protocol. Using this approach, it's possible to write Neutralinojs apps with any backend language. You can obtain authentication details for the Neutralinojs process by setting your config as below. "exportAuthInfo": true The above setting exports authentication details to ${NL_PATH}/.tmp/auth_info.json with the following format. { "nlPort": "<port>", "nlToken": "<token>", "nlConnectToken": "<connect_token>" } Connect with the Neutralinojs process by using the extension API as usual with the extension identifier you used in the application configuration file. ","version":"Next","tagName":"h2"},{"title":"Framework","type":0,"sectionRef":"#","url":"/docs/release-notes/framework","content":"","keywords":"","version":"Next"},{"title":"Unreleased​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#unreleased","content":" ","version":"Next","tagName":"h2"},{"title":"v5.4.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v540","content":" ","version":"Next","tagName":"h2"},{"title":"API: resources​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-resources","content":" Implement getFiles(), extractFile(path, dest), readFile(path), and readBinaryFile(path) functions via the resources module for reading the files embedded in the resources.neu resources bundle. These functions works only if the framework loaded resources from the resource bundle -- they will throw NE_RS_APIRQRF if the framework loaded resources from the resources directory. ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window","content":" Implement minimize(), unminimize(), and isMinimized() functions to minimize and restore the native app window. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes","content":" Fix issues with the clipboard.writeImage() function on Windows.Fix the unwanted delay with the window.exitProcessOnClose configuration option on Windows.Fix a bug with the window.isFullScreen() function on GNU/Linux-based platforms.Fix duplicate virtual PID issues with the os.spawnProcess() function. ","version":"Next","tagName":"h3"},{"title":"v5.3.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v530","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: window transparency on Windows​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-window-transparency-on-windows","content":" Window transparency support was added on the Windows version of the Neutralinojs framework. This can be activated with modes.window.transparent configuration property or --window-transparent command-line option. Unlike in other platforms, Windows native window becomes borderless (window controls will be hidden) with the activation of the transparent mode. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os","content":" Add the temp key for the supported directory list of the os.getPath(pathKey) function. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem","content":" Add the filesystem.getAbsolutePath(path) function to let developers get a full path string from a relative path string.Add the filesystem.getRelativePath(path, ?base) function to get a relative path from a path and a base path.Add the filesystem.getPathParts(path) to parse and get path segments like filename, extension, root path, etc. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-1","content":" Fix Unicode issues in the Windows version with filesystem, storage, and general modules.Fix standard output/error data display issues on Windows ","version":"Next","tagName":"h3"},{"title":"v5.2.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v520","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: Configless framework initialization​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-configless-framework-initialization","content":" Now, developers can load the Neutralinojs framework without creating a neutralino.config.json file. Now, there is no mandatory configuration properties since Neutralinojs set reasonable defaults. Developers can launch the framework using the following methods without a configuration file: # Loading a remote URL ./framework-bin --url=https://neutralino.js.org/docs # Launches a local static web app ./framework-bin --url="/resources/" --window-title="My web app" --enable-server ","version":"Next","tagName":"h3"},{"title":"Configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration","content":" New internal CLI arguments added: --single-page-serve, --enable-native-api and --document-root=<string> ","version":"Next","tagName":"h3"},{"title":"Core: Static server SPA (Single Page App) serving​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-static-server-spa-single-page-app-serving","content":" Earlier, Neutralinojs app developers had to use hash routing with their frontend-library-based apps since the internal static server didn't offer an inbuilt URL rewrite logic for SPAs (Single Page Apps). Now, they can use the singlePageServe: true option in the app configuration file to activate SPA routing. If this setting is on, the static server will serve the main index.html file when it receives directory requests that possibly send HTTP 404 status. For example, the /invoices path serves the main index.html file if there is no directory named invoices which holds an index.html file. ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-1","content":" Improve the behaviour of the window.show() function on Windows. Now, this function flashes the window if it's already in foreground and activates the window properly if it's minimized. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-2","content":" Fix path issues with the defaultPath option in system file dialogs on Windows. ","version":"Next","tagName":"h3"},{"title":"v5.1.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v510","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: window transparency​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-window-transparency","content":" Neutralinojs offers the inbuilt borderless mode and draggable region API to create custom window frames using HTML and CSS. Earlier, Neutralinojs used a default opaque color (usually white) for the window and webview layer, so app developers couldn't make custom CSS-styled window frames transparent or implement custom window frame shapes (i.e., rounded edges). Now, it offers the window.transparent boolean flag to activate window transparency. If the transparency mode is on, the Neutralinojs window and webview use an alpha color layer and become transparent, so developers can use the rgba CSS color function on body background to handle the transparency level of the app. The transparency mode can be activated using the --window-transparent=<bool> internal command-line option too. Note: This feature is not implemented for the Windows operating system yet. ","version":"Next","tagName":"h3"},{"title":"API: clipboard​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-clipboard","content":" Implement clipboard.readImage() and clipboard.writeImage(image) functions to work with clipboard image data.Expose the clipboard.clear() function to clear system clipboard.Expose the clipboard.getFormat() function to check the system clipboard data format. This function returns text, image, and unknown enum values based on existing data on the clipboard. ","version":"Next","tagName":"h3"},{"title":"v5.0.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v500","content":" ","version":"Next","tagName":"h2"},{"title":"API: Reading, writing with standard streams​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-reading-writing-with-standard-streams","content":" Implement app.readProcessInput(readAll=false) for reading string data from the standard input stream. This function can read a single line or multiple lines at once.Implement app.writeProcessOutput and app.writeProcessError for sending string data to standard output and error streams accordingly. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-1","content":" Enable default recursive behavior in the filesystem.createDirectory function.Add filesystem.copy, filesystem.move, and filesystem.remove functions.Add {recursive} options object to filesystem.readDirectory(path, options) activate recursive directory listing. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os-1","content":" Accept stdin with the background mode of the os.execCommand function. ","version":"Next","tagName":"h3"},{"title":"Core: security​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-security","content":" Now, all app clients and extensions require a valid connect token (A part of the NL_TOKEN) to connect to the Neutralinojs framework WebSocket server to receive app events.The framework now sends the access token, connect token, port, and extension identifier to extension processes via the standard input, so other processes can't read them by scanning the process list.The WebSocket client connection origin is checked during the HTTP/WS handshake to make sure that only local clients connect with a specific Neutralinojs app that runs on window, browser, or Chrome mode. Any URL origin is allowed for the cloud mode.The above security enhancements fix two security advisories on GitHub. ","version":"Next","tagName":"h3"},{"title":"Global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#global-variables","content":" Now the NL_ARCH global variable returns the same value that computer.getArch returns. ","version":"Next","tagName":"h3"},{"title":"Deprecations​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#deprecations","content":" Removed filesystem.removeFile, filesystem.removeDirectory, filesystem.copyFile, and filesystem.moveFile functions.Extensions won't receive --nl-port, --nl-token, and --nl-extension-id as command-line arguments. Now the framework sends these via stdin as a JSON string. ","version":"Next","tagName":"h3"},{"title":"v4.15.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4150","content":" ","version":"Next","tagName":"h2"},{"title":"Configuration: custom user agent string​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-custom-user-agent-string","content":" Developers sometimes use the user agent string to indentify the client in server-side and client-side source codes. Now, Neutralinojs lets app developers extend the default user agent string with a custom string via the window.extendUserAgentWith configuration property and the --window-extend-user-agent-with=<string> command-line option, as shown in the following example: "window": { // --- "extendUserAgentWith": "MyAppClient" } The above configuration extends the user agent string: console.log(navigator.userAgent) // <Default UA> MyAppClient ","version":"Next","tagName":"h3"},{"title":"Configuration: custom configuration files​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#configuration-custom-configuration-files","content":" The Neutralinojs framework typically loads the application configuration content from the neutralino.config.json file, but sometimes app developers need to use a custom configuration filename during development (i.e., For separating production and development environments). Now, you can use the --config-file=<filename> internal command-line parameter to use a custom app configuration, as shown in the following example: ./myapp-linux_x64 --load-dir-res --config-file=neutralino-dev.config.json ","version":"Next","tagName":"h3"},{"title":"v4.14.1​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4141","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops","content":" Use Windows 2019 server and macOS 11 (Big Sur) to compile framework release artifacts.Set minimum supported macOS version via MACOSX_DEPLOYMENT_TARGET=10.7 ","version":"Next","tagName":"h3"},{"title":"v4.14.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4140","content":" ","version":"Next","tagName":"h2"},{"title":"Filesystem API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#filesystem-api","content":" Introduce the filesystem.getWatchers function to get all created watchers.Add binary file reading support for the filesystem.updateOpenedFile(id, action, data) function. This function implements readBinary and readAllBinary actions and dataBinary output action in the openedFile global event.Return the existing watcher identifier from filesystem.createWatcher if there is an existing active watcher for the given path. ","version":"Next","tagName":"h3"},{"title":"OS API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#os-api","content":" Add a way to set current working directory for process creation functions: os.execCommand(command, options) now supports cwd via the options object and os.spawnProcess(command, cwd) accepts currently working directory via the second string parameter. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-3","content":" Fix Unicode charactor issues in the tray menu on Windows.Avoid including null bytes to file reader events initiated by the filesystem.openFile function.Discard window method executions on non-window modes. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-1","content":" Update external GitHub Action packages to their latest versions.Fix issues of the failing test cases ","version":"Next","tagName":"h3"},{"title":"v4.13.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4130","content":" ","version":"Next","tagName":"h2"},{"title":"Core: persistent window state​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-persistent-window-state","content":" Now the framework stores the primary window state in a temporary file (JSON formatted) and loads during the startup process. This feature stores and sets the window position (x, y coordinates), size (width and height), and maximized status. This feature is enabled by default in all platforms, but app developers can turn it off by using false for the window.useSavedState configuration attribute or --window-use-saved-state internal CLI argument. Also, the window state loading status is available via the NL_WSAVSTLOADED global variable. The framework sets true for this boolean variable if the window state was loaded from the saved configuration. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-4","content":" Fix several issues in the webview Windows code (i.e., Wait for the window close event, window style fixes, etc.). ","version":"Next","tagName":"h3"},{"title":"v4.12.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4120","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-2","content":" Add window.center to center the application window programmatically. ","version":"Next","tagName":"h3"},{"title":"Core: configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-configuration","content":" Setting the initial window position via modes.window.x and modes.window.y integer config props.Centering the window at startup via modes.window.center boolean config props.Add config overrides for the startup window position: --window-center=<true|false>, --window-x=<int> and --window-y=<int> ","version":"Next","tagName":"h3"},{"title":"Core: webview​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-webview","content":" Statically link the Webview2 loader library on Windows, so app developers can package their apps without including the WebView2Loader.dll file. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-5","content":" Added Unicode characters support for Neutralinojs Windows. ","version":"Next","tagName":"h3"},{"title":"v4.11.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4110","content":" ","version":"Next","tagName":"h2"},{"title":"API: File watchers​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-file-watchers","content":" In some scenarios, Neutralinojs app developers need to implement file watchers in their apps. Earlier, Neutralinojs API didn't offer a native file watcher API and developers had to use less-performant workarounds, such as making recursive filesystem.readDirectory calls. The new file watchers API lets you create native, cross-platform, event-based file watchers for filesystem paths with the following functions: filesystem.createWatcher(path): Creates a new file watcher for a given path and returns the watcher identifier.filesystem.removeWatcher(watcherId): Removes a files watcher based on a file watcher identifier. Whenever a filesystem change occurs, file watcher instances dispatch the watchFile event with the following data: id: Watcher identifieraction: Filesystem change: add, delete, modified, and moveddir: Directory pathfilename: Modified file ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-6","content":" Fix the initial window flashing and hidden window state issues on Windows.Fix data corruption in binary file appending.Apply dark/light themes based on system preferences on Windows. ","version":"Next","tagName":"h3"},{"title":"v4.10.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v4100","content":" ","version":"Next","tagName":"h2"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-2","content":" Generate official macOS arm64 (For Apple M1 and higher devices) and universal binaries with the GitHub workflow. ","version":"Next","tagName":"h3"},{"title":"Improvements/bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#improvementsbugfixes-7","content":" Add a JSON schema definition for the neutralino.config.json file.Fix source code compilation issues on macOS arm64 systems. ","version":"Next","tagName":"h3"},{"title":"ESM/NPM support​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#esmnpm-support","content":" Neutralinojs typically stores the client library implementation in a separate file (neutralino.js). This approach makes Neutralinojs app development process easier with a globally exposed JavaScript object, Neutralino. But, modern web developers use ES modules and they usually like to fetch dependencies from NPM. So, now, developers can load the __neutralino_globals.js internal script (i.e., <script src="__neutralino_globals.js"></script>) to load only globals. Then, they can use the client library implementation via neutralino.mjs with the neu CLI or from @neutralinojs/lib with a Node package manager. ","version":"Next","tagName":"h3"},{"title":"v4.9.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v490","content":" ","version":"Next","tagName":"h2"},{"title":"API: Custom methods​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-custom-methods","content":" Neutralinojs offers the extensions API to write custom backend code with any programming language, but extensions come with the following drawbacks that affect apps in several scenarios: Extensions use a shared WebSocket for communication, so using direct C++ references (i.e., the window handler) is impossible within extensions.The developer is responsible for packaging their extension binaries.A C++-based extension is not fast as native C++-based code due to the WebSockets-based IPC. Alternatively, a developer can download the framework C++ code, modify it, and re-compile it. But, the developer may face issues while synching upstream code modifications. So, Neutralinojs offers a separate namespace, a function template, inbuilt helper functions (i.e., to get the window handler, validation, etc.), and a developer guide to add custom APIs to the Neutralinojs framework without updating the framework core. Example: let res = await Neutralino.custom.fetch('https://neutralino.js.org'); If developers make a custom API that others can use, we motivate them to contribute to the Neutralinojs framework by adding it to the main codebase. Example: let res = await Neutralino.net.fetch('https://neutralino.js.org'); If the developer adds a new custom method to the framework, the client library will automatically export it to the Neutralino.custom namespace by using the NL_CMETHODS internal global variable. The Neutralino.custom.getMethods function returns an array of custom methods similar to NL_CMETHODS. ","version":"Next","tagName":"h3"},{"title":"API: File streams​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-file-streams","content":" The current Neutralinojs API offers non-stream-based (Promise-based but synchronous-like) functions for working with files. For example, the filesystem.readFile function reads the file content and retrieves data synchronously even though the WebSocket communication mechanism supports asynchronous patterns. However, the synchronous API lets developers work with files in a simple way, but they face the following issues in some scenarios: Reading large files is not performance-friendly (The whole file content gets loaded into the memory).Unable to work with dynamic file objects (i.e., Device files).File descriptors are not persistent within the app lifecycle as they get destroyed after native API calls. To solve this issue, we offer an event-based file stream API with the following functions/events: Functions​ filesystem.openFile: Creates a file stream by openning a file.filesystem.updateOpenedFile: Triggers a file read/readAll event or sets the file cursor.filesystem.getOpenedFileInfo: Returns (awaited) information about the file stream (Props: id, eof, pos, and lastRead) Events​ openedFile: Occurs per each file read event and whenever the file stream reaches EOF. ","version":"Next","tagName":"h3"},{"title":"v4.8.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v480","content":" ","version":"Next","tagName":"h2"},{"title":"API: os.getEnvs​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-osgetenvs","content":" os.getEnv returns a value for a given environment variable key. Developers had to use alternative methods to retrieve a list of all environment variables with values. The os.getEnvs returns all environment variables as a JavaScript object similar to Node's process.env. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-2","content":" Added pos and size options for readFile and readBinaryFile methods to set the file cursor position and buffer size respectively. ","version":"Next","tagName":"h3"},{"title":"API: storage.getKeys​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-storagegetkeys","content":" Added the storage.getKeys function to get an array of Neutralinojs storage keys. Now, developers don't need to write their own functions to retrieve storage keys with the filesystem API. ","version":"Next","tagName":"h3"},{"title":"API: computer.getMousePosition​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-computergetmouseposition","content":" Returns the current mouse cursor position via a JavaScript object that has x and y props. This function is helpful for develping interactive desktop widgets on all supported platforms. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements","content":" Replaced string error codes with enums in the C++ source code.Some refactorings done in C++ struct definitions and return values. ","version":"Next","tagName":"h3"},{"title":"v4.7.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v470","content":" ","version":"Next","tagName":"h2"},{"title":"API: System information API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-system-information-api","content":" Ealier, we had the getMemoryInfo function in the computer namespace to retrieve system memory statistics. Now, we have added more functions to get details about the CPU, operating system, kernel, and connected displays: computer.getArch: Returns the CPU architecture. i.e, x64, arm, etc.computer.getKernelInfo: Returns the operating system's kernel details.computer.getOSInfo: Returns the operating system details.computer.getCPUInfo: Returns the CPU details.computer.getDisplays: Returns an array of all connected displays with the resolution, frequency-like information. ","version":"Next","tagName":"h3"},{"title":"API: os dialogs​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os-dialogs","content":" Add the defaultPath option to showSaveDialog, showOpenDialog, and showFolderDialog functions to set the initial path/filename of system dialogs. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-3","content":" Run the test suite on Windows GitHub Actions instance.Fix the armhf framework binary generation issue in the GitHub Actions workflow. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-1","content":" Hide the automation info bar from the Chrome mode by default -- Developers can add the --enable-automation flag to the config file if they need the particular command-line switch. ","version":"Next","tagName":"h3"},{"title":"v4.6.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v460","content":" ","version":"Next","tagName":"h2"},{"title":"API: Process spawning API​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-process-spawning-api","content":" We have os.execCommand for launching processes, but it's synchronous, meaning, the developer has to wait unti process completion to receive pid, stdOut and stdErr. execCommand is not suitable for long-running processes. The new spawning API offers API functions for handling long-running processes in a multi-threaded way. os.spawnProcess(command): Spawns a process and returns id (A virtual Neutralino-scoped pid) and pid (Operating system-level pid).os.getSpawnedProcesses(): Returns a list of spawned processes.os.updateSpawnedProcess(id, action, data): Sends an action event for the spawned process. Supports the following actions: stdIn: Sends a string via the standard input stream. data is the input string.stdInEnd: Closes the standard input stream.exit: Terminates the spawned process. ","version":"Next","tagName":"h3"},{"title":"Core: events​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-events","content":" spawnedProcess: Dispatched when there is a change in the spawned process. CustomEvent gets triggered with the following object: { id: <id>, pid: <pid>, action: <action>, data: <data> } Available actions: stdOut: Outputs standard output data. data contains the standard output payload.stdErr: Outputs standard error data. data contains the standard error payload.exit: Notified when the process terminates. data contains the process exit code. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-4","content":" Add official Linux ARM (armhf and arm64) binary build support for the standard release workflow and nightly build. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-3","content":" Expose createdAt and modifiedAt JavaScript timestamps via the filesystem.getStats function. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-2","content":" Hide the .storage directory (Neutralinojs storage location) on Windows.Support using query parameters in resources URLs. i.e., index.html?v=2.0 is supported, but caching is not yet implemented.Show a user-friendly error message for Neutralinojs server initialization failures. ","version":"Next","tagName":"h3"},{"title":"v4.5.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v450","content":" ","version":"Next","tagName":"h2"},{"title":"Core: events​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-events-1","content":" Added windowFocus and windowBlur native events. ","version":"Next","tagName":"h3"},{"title":"DevOps​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#devops-5","content":" Use BuildZri for C++ build automation.Implement a new workflow for nightly releases. Developers can get the nightly release binaries via the nightly version tag. ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-3","content":" Search and dynamically load app indicator libraries on Linux. This enhancement supports Neutralinojs to start without a crash when there is no app indicator library present on the system.Throw NE_OS_TRAYIER from the os.setTray function for initialization failures.Fix binary file write error on Windows with the filesystem.writeBinaryFile function. This was fixed by using LF as the line breaker on all platforms as a portable solution. If the developer needs CRLF on Windows (or CR on Darwin), the developer needs to handle it explicitly with NL_OS. ","version":"Next","tagName":"h3"},{"title":"Core: global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-global-variables","content":" Add NL_COMMIT to hold framework's release commit. This is helpful to find the nightly release's code snapshot. ","version":"Next","tagName":"h3"},{"title":"v4.4.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v440","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-3","content":" Add window.getPosition to get the current window coordinates. ","version":"Next","tagName":"h3"},{"title":"API: filesystem​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-filesystem-4","content":" Add filesystem.appendFile to append text content to a file. Thrown errors are similar to the filesystem.writeFile function.Add filesystem.appendBinaryFile to append binary content to a file. Thrown errors are similar to the filesystem.writeBinaryFile function. ","version":"Next","tagName":"h3"},{"title":"Dependencies​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#dependencies","content":" Use ayatana-appindicator3-0.1 instead of appindicator3-0.1 (Marked as obsolete in Debian packages) ","version":"Next","tagName":"h3"},{"title":"Bugfixes/improvements​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixesimprovements-4","content":" Dynamically call SetProcessDpiAwarenessContext function to support previous Windows versions.Display the native method name with the NE_RT_NATPRME error payload. ","version":"Next","tagName":"h3"},{"title":"v4.3.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v430","content":" ","version":"Next","tagName":"h2"},{"title":"Core: auth​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-auth","content":" Added tokenSecurity to the configuration to improve the security of NL_TOKEN. Accepted values are none and one-time. If none is set, Neutralinojs server will always expose NL_TOKEN for any application instance, so you can open Neutralinojs apps from browser directly. If one-time (recommended) is set, Neutralinojs server expose NL_TOKEN only once and client persists the token in sessionStorage, so all other clients that acces the app after the initial client will get an auth error message (Displayed to the user via HTML). ","version":"Next","tagName":"h3"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-4","content":" window.setAlwaysOnTop(bool) was added.window.getSize was added. ","version":"Next","tagName":"h3"},{"title":"Core: global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-global-variables-1","content":" Added NL_EXTENABLED which returns true if extensions are enabled. It is used to check extensions status faster during initialization process. ","version":"Next","tagName":"h3"},{"title":"Bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixes","content":" Fixed the file dialog order issue on Windows.Removed tray icon when the application exits. ","version":"Next","tagName":"h3"},{"title":"v4.2.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v420","content":" ","version":"Next","tagName":"h2"},{"title":"API: clipboard​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-clipboard-1","content":" Add clipboard API for all platforms. Supports reading and writing text in the system clipboard. ","version":"Next","tagName":"h3"},{"title":"Core: configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-configuration-1","content":" Accept chrome-related CLI args: --chrome-width, --chrome-height, and --chrome-args.Accept --neu-dev-extension to enable devtools connections (For internal usages with CLI).Accept custom HTTP headers via serverHeaders option. ","version":"Next","tagName":"h3"},{"title":"API: global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-global-variables","content":" Added NL_RESMODE to get details about application resources source. Returns bundle if resources are loaded from resources.neu. Otherwise, returns directory. ","version":"Next","tagName":"h3"},{"title":"Bugfixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bugfixes-1","content":" Fix chrome mode user data dir issue (Support paths with spaces).Fix browser mode's shutdown issue with neu CLI. ","version":"Next","tagName":"h3"},{"title":"v4.1.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v410","content":" ","version":"Next","tagName":"h2"},{"title":"API: window​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-window-5","content":" window.getTitle returns the current native window title. ","version":"Next","tagName":"h3"},{"title":"API: os​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-os-2","content":" Remove NE_OS_ENVNOEX from os.getEnv and return an empty string if environment variable is not defined. ","version":"Next","tagName":"h3"},{"title":"Core: Chrome mode​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-chrome-mode","content":" Now you can run Neutralinojs apps as Chrome apps via the chrome mode. ","version":"Next","tagName":"h3"},{"title":"Core: configuration​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-configuration-2","content":" Getting chrome mode config from modes.chrome. Added height, width, and args specially for the chrome mode. ","version":"Next","tagName":"h3"},{"title":"v4.0.0​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#v400","content":" ","version":"Next","tagName":"h2"},{"title":"API: os.execCommand​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-osexeccommand","content":" Renamed shouldRunInBackground option to background.Supports stdIn as an optional input.Returns multiple values: stdOut, stdErr, pid, and exitCode. ","version":"Next","tagName":"h3"},{"title":"Core: API extensions​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-api-extensions","content":" Config file supports new extensions array globally or in a specific mode.Neutralino spawns extension processes based on extensions array.Neutralino doesn't send kill signals to extension processes. The extension developer needs to stop processes properly.extension setting has 4 fields: id, command, commandLinux,commandDarwin, and commandWindows.The command's (platform-specific command's) value accepts ${NL_PATH} global variable.Each extension process instance is called with three CLI args: --nl-port={}, --nl-extension-id={} and --nl-token={}Enable/disable extensions with enableExtensions config. ","version":"Next","tagName":"h3"},{"title":"Core: Static server​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-static-server","content":" Supports setting document root (with documentRoot) via config. Now, it's possible to launch app without a subdirectory in the URL. ","version":"Next","tagName":"h3"},{"title":"Core: Community driver processes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#core-community-driver-processes","content":" Now developers can use Neutralinojs as a part of their software with any programming language by spawning Neutralinojs as a child process. Use exportAuthInfo to write auth details to ${NL_PATH}/.tmp/auth_info.json. Then the parent process can pickup access details there. Note that WebSocket communication needs to be initiated via extensions API/loader. ","version":"Next","tagName":"h3"},{"title":"API: app.broadcast​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-appbroadcast","content":" Sends an event to all app clients. This method is for extension developers. ","version":"Next","tagName":"h3"},{"title":"API: events.broadcast​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-eventsbroadcast","content":" Sends an event to all clients (apps and extensions). Useful for notifying important general events. ","version":"Next","tagName":"h3"},{"title":"API: extensions​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-extensions","content":" dispatch: Sends an event to a specific extension.broadcast: Sends an event to all connected extensions. Useful for sending shutdown signals.getStats: Returns details about loaded extensions and connected extensions. ","version":"Next","tagName":"h3"},{"title":"API: updater​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#api-updater","content":" checkForUpdates: Send a request to a seed URL (JSON) and fetch update details.install: Install updates based on the currently downloaded manifest. ","version":"Next","tagName":"h3"},{"title":"Events​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#events-1","content":" appClientConnect and appClientDisconnect: Occurs when a new app instance is launched and closed respectively.extClientConnect and extClientDisconnect: Occurs when a new extension is connected and disconnected respectively.extensionReady can be used to implement immediate extension calls. This is implemented from the client-side with extensions.getStats and extClientConnect. This event gurantees that it will be triggered regardless of the extension's start time. ","version":"Next","tagName":"h3"},{"title":"Error codes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#error-codes","content":" NE_EX_EXTNOTC: Thrown by extensions.dispatch if the target extension is not connected.NE_UP_CUPDMER: Thrown by updater.checkForUpdates if the JSON update manifest is invalid or applicationId is not matching.NE_UP_CUPDERR: Thrown by updater.checkForUpdates if the updater API cannot fetch the manifest.NE_UP_UPDNOUF: Thrown by updater.install when the update manifest is not loaded.NE_UP_UPDINER: Thrown by updater.install for update installation errors. ","version":"Next","tagName":"h3"},{"title":"Bug fixes​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#bug-fixes","content":" Fix port 0 issue with modes. Earlier, if the developer sets port as 0 from a specific mode, the NL_PORT also becomes 0.Fix an issue with writeToLogFile config option. Earlier, the log file was created even this option is set to false. ","version":"Next","tagName":"h3"},{"title":"Global variables​","type":1,"pageTitle":"Framework","url":"/docs/release-notes/framework#global-variables-1","content":" NL_APPVERSION: Value of the version key in the config file. ","version":"Next","tagName":"h3"}],"options":{"id":"default"}} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 5fcb414d..9b88bdda 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://neutralino.js.org/apps</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/privacy-policy</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/resources</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/app</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/clipboard</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/computer</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/custom</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/debug</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/error-codes</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/events</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/extensions</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/filesystem</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/global-variables</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/init</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/os</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/overview</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/storage</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/updater</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/window</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/cli/internal-cli-arguments</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/cli/neu-cli</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/configuration/modes</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/configuration/neutralino.config.json</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/configuration/project-structure</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/about-neutralinojs</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/architecture</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/code-style-guide</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/committers</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/developer-support</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/framework-developer-guide</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/frequently-asked-questions</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/security</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/distribution/overview</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/getting-started/using-frontend-libraries</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/getting-started/your-first-neutralinojs-app</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/how-to/auto-updater</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/how-to/extensions-overview</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/release-notes/cli</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/release-notes/client-library</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/release-notes/framework</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url></urlset> \ No newline at end of file +<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:news="http://www.google.com/schemas/sitemap-news/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"><url><loc>https://neutralino.js.org/apps</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/privacy-policy</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/resources</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/app</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/clipboard</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/computer</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/custom</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/debug</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/error-codes</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/events</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/extensions</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/filesystem</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/global-variables</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/init</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/os</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/overview</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/resources</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/storage</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/updater</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/api/window</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/cli/internal-cli-arguments</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/cli/neu-cli</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/configuration/modes</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/configuration/neutralino.config.json</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/configuration/project-structure</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/about-neutralinojs</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/architecture</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/code-style-guide</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/committers</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/developer-support</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/framework-developer-guide</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/frequently-asked-questions</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/contributing/security</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/distribution/overview</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/getting-started/using-frontend-libraries</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/getting-started/your-first-neutralinojs-app</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/how-to/auto-updater</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/how-to/extensions-overview</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/release-notes/cli</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/release-notes/client-library</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/docs/release-notes/framework</loc><changefreq>weekly</changefreq><priority>0.5</priority></url><url><loc>https://neutralino.js.org/</loc><changefreq>weekly</changefreq><priority>0.5</priority></url></urlset> \ No newline at end of file