diff --git a/ACECore/build/release/ACECore.zip b/ACECore/build/release/ACECore.zip index 6a66ce1..3843bcd 100644 Binary files a/ACECore/build/release/ACECore.zip and b/ACECore/build/release/ACECore.zip differ diff --git a/About/build/release/About.zip b/About/build/release/About.zip index 261b059..5fe8c91 100644 Binary files a/About/build/release/About.zip and b/About/build/release/About.zip differ diff --git a/AceDiff/build/release/AceDiff.zip b/AceDiff/build/release/AceDiff.zip index ff75588..b254d48 100644 Binary files a/AceDiff/build/release/AceDiff.zip and b/AceDiff/build/release/AceDiff.zip differ diff --git a/ActivityMonitor/build/release/ActivityMonitor.zip b/ActivityMonitor/build/release/ActivityMonitor.zip index cc3c1b9..5eaf880 100644 Binary files a/ActivityMonitor/build/release/ActivityMonitor.zip and b/ActivityMonitor/build/release/ActivityMonitor.zip differ diff --git a/Antedit/build/release/Antedit.zip b/Antedit/build/release/Antedit.zip index 8b7d352..7066f4f 100644 Binary files a/Antedit/build/release/Antedit.zip and b/Antedit/build/release/Antedit.zip differ diff --git a/Antunnel/build/release/Antunnel.zip b/Antunnel/build/release/Antunnel.zip index 114cac6..591b6e6 100644 Binary files a/Antunnel/build/release/Antunnel.zip and b/Antunnel/build/release/Antunnel.zip differ diff --git a/AntunnelPlugins/build/release/AntunnelPlugins.zip b/AntunnelPlugins/build/release/AntunnelPlugins.zip index 6e557b6..fd71d63 100644 Binary files a/AntunnelPlugins/build/release/AntunnelPlugins.zip and b/AntunnelPlugins/build/release/AntunnelPlugins.zip differ diff --git a/Archive/build/release/Archive.zip b/Archive/build/release/Archive.zip index 24f870c..480a4ac 100644 Binary files a/Archive/build/release/Archive.zip and b/Archive/build/release/Archive.zip differ diff --git a/Blogger/build/release/Blogger.zip b/Blogger/build/release/Blogger.zip index 797d1e4..2ef74ff 100644 Binary files a/Blogger/build/release/Blogger.zip and b/Blogger/build/release/Blogger.zip differ diff --git a/Booklet/build/release/Booklet.zip b/Booklet/build/release/Booklet.zip index d65be05..d8b2167 100644 Binary files a/Booklet/build/release/Booklet.zip and b/Booklet/build/release/Booklet.zip differ diff --git a/Clipper/build/release/Clipper.zip b/Clipper/build/release/Clipper.zip index 1736785..9581225 100644 Binary files a/Clipper/build/release/Clipper.zip and b/Clipper/build/release/Clipper.zip differ diff --git a/CodePad/build/release/CodePad.zip b/CodePad/build/release/CodePad.zip index 7438996..0cc163f 100644 Binary files a/CodePad/build/release/CodePad.zip and b/CodePad/build/release/CodePad.zip differ diff --git a/DiffEditor/build/release/DiffEditor.zip b/DiffEditor/build/release/DiffEditor.zip index fc6762e..34c6fba 100644 Binary files a/DiffEditor/build/release/DiffEditor.zip and b/DiffEditor/build/release/DiffEditor.zip differ diff --git a/Docify/build/release/Docify.zip b/Docify/build/release/Docify.zip index 0b5285e..a4f3e2b 100644 Binary files a/Docify/build/release/Docify.zip and b/Docify/build/release/Docify.zip differ diff --git a/GPClient/build/release/GPClient.zip b/GPClient/build/release/GPClient.zip index 5b8fe6f..f1bcd7b 100644 Binary files a/GPClient/build/release/GPClient.zip and b/GPClient/build/release/GPClient.zip differ diff --git a/GitGraph/build/release/GitGraph.zip b/GitGraph/build/release/GitGraph.zip index 02d0e65..f4444a3 100644 Binary files a/GitGraph/build/release/GitGraph.zip and b/GitGraph/build/release/GitGraph.zip differ diff --git a/GraphEditor/build/release/GraphEditor.zip b/GraphEditor/build/release/GraphEditor.zip index 98bb6c2..baf6ac6 100644 Binary files a/GraphEditor/build/release/GraphEditor.zip and b/GraphEditor/build/release/GraphEditor.zip differ diff --git a/ImageEditor/build/release/ImageEditor.zip b/ImageEditor/build/release/ImageEditor.zip index 60d014a..62eda4f 100644 Binary files a/ImageEditor/build/release/ImageEditor.zip and b/ImageEditor/build/release/ImageEditor.zip differ diff --git a/LibreOffice/build/release/LibreOffice.zip b/LibreOffice/build/release/LibreOffice.zip index ebad086..6bd439d 100644 Binary files a/LibreOffice/build/release/LibreOffice.zip and b/LibreOffice/build/release/LibreOffice.zip differ diff --git a/LuaPlayground/build/release/LuaPlayground.zip b/LuaPlayground/build/release/LuaPlayground.zip index 9024c62..7539cbc 100644 Binary files a/LuaPlayground/build/release/LuaPlayground.zip and b/LuaPlayground/build/release/LuaPlayground.zip differ diff --git a/MarkOn/build/release/MarkOn.zip b/MarkOn/build/release/MarkOn.zip index aa3fe1d..6778dce 100644 Binary files a/MarkOn/build/release/MarkOn.zip and b/MarkOn/build/release/MarkOn.zip differ diff --git a/MonacoCore/build/release/MonacoCore.zip b/MonacoCore/build/release/MonacoCore.zip index 0b6c447..aa0e1ca 100644 Binary files a/MonacoCore/build/release/MonacoCore.zip and b/MonacoCore/build/release/MonacoCore.zip differ diff --git a/OnlyOffice/build/release/OnlyOffice.zip b/OnlyOffice/build/release/OnlyOffice.zip index f2ba002..cf3cbdd 100644 Binary files a/OnlyOffice/build/release/OnlyOffice.zip and b/OnlyOffice/build/release/OnlyOffice.zip differ diff --git a/Preview/build/release/Preview.zip b/Preview/build/release/Preview.zip index ec870e6..f77a82f 100644 Binary files a/Preview/build/release/Preview.zip and b/Preview/build/release/Preview.zip differ diff --git a/RemoteCamera/build/release/RemoteCamera.zip b/RemoteCamera/build/release/RemoteCamera.zip index e24bb1b..88781ff 100644 Binary files a/RemoteCamera/build/release/RemoteCamera.zip and b/RemoteCamera/build/release/RemoteCamera.zip differ diff --git a/RemoteDesktop/build/release/RemoteDesktop.zip b/RemoteDesktop/build/release/RemoteDesktop.zip index 3e05727..1d053a7 100644 Binary files a/RemoteDesktop/build/release/RemoteDesktop.zip and b/RemoteDesktop/build/release/RemoteDesktop.zip differ diff --git a/SQLiteDB/build/release/SQLiteDB.zip b/SQLiteDB/build/release/SQLiteDB.zip index 1850071..7ea3e89 100644 Binary files a/SQLiteDB/build/release/SQLiteDB.zip and b/SQLiteDB/build/release/SQLiteDB.zip differ diff --git a/ServerLogClient/build/release/ServerLogClient.zip b/ServerLogClient/build/release/ServerLogClient.zip index 79b093c..3bf15a3 100644 Binary files a/ServerLogClient/build/release/ServerLogClient.zip and b/ServerLogClient/build/release/ServerLogClient.zip differ diff --git a/ShaderPlayground/build/release/ShaderPlayground.zip b/ShaderPlayground/build/release/ShaderPlayground.zip index 649565c..0d37a63 100644 Binary files a/ShaderPlayground/build/release/ShaderPlayground.zip and b/ShaderPlayground/build/release/ShaderPlayground.zip differ diff --git a/ShowCase/build/release/ShowCase.zip b/ShowCase/build/release/ShowCase.zip index e6a8f55..45c8016 100644 Binary files a/ShowCase/build/release/ShowCase.zip and b/ShowCase/build/release/ShowCase.zip differ diff --git a/SimpleMDE/build/release/SimpleMDE.zip b/SimpleMDE/build/release/SimpleMDE.zip index 6639ba1..f2006ac 100644 Binary files a/SimpleMDE/build/release/SimpleMDE.zip and b/SimpleMDE/build/release/SimpleMDE.zip differ diff --git a/SystemControl/build/release/SystemControl.zip b/SystemControl/build/release/SystemControl.zip index d041a33..0db2dec 100644 Binary files a/SystemControl/build/release/SystemControl.zip and b/SystemControl/build/release/SystemControl.zip differ diff --git a/TinyEditor/build/release/TinyEditor.zip b/TinyEditor/build/release/TinyEditor.zip index d47242a..1cb3a3f 100644 Binary files a/TinyEditor/build/release/TinyEditor.zip and b/TinyEditor/build/release/TinyEditor.zip differ diff --git a/VizApp/build/release/VizApp.zip b/VizApp/build/release/VizApp.zip index 46a2c3a..52c1a46 100644 Binary files a/VizApp/build/release/VizApp.zip and b/VizApp/build/release/VizApp.zip differ diff --git a/build.json b/build.json new file mode 100644 index 0000000..c89cb84 --- /dev/null +++ b/build.json @@ -0,0 +1,26 @@ +{ + "targets" : { + "Build all" :{ + "jobs": [ + { + "name": "batch", + "data": { + "target": "release" + } + } + ] + }, + "Release": { + "require": ["backend"], + "jobs": [ + { + "name": "lua-exec", + "data": { + "path": "home://workspace/antosdk-apps/release.lua", + "params": {} + } + } + ] + } + } +} \ No newline at end of file diff --git a/libantosdk/build/debug/main.js b/libantosdk/build/debug/main.js index 62aabc2..27c7d27 100644 --- a/libantosdk/build/debug/main.js +++ b/libantosdk/build/debug/main.js @@ -1 +1,417 @@ -var OS;!function(t){let e;!function(e){class i{constructor(e){this.worker=new Worker(e.asFileHandle().getlink()),this.jobs={},this.worker.onmessage=t=>{let e=t.data,i=this.jobs[e.id];i?"log"===e.type?i.logger&&(e.error?i.logger.error(e.result):!1===e.show_time&&i.logger.print?i.logger.print(e.result):i.logger.info(e.result)):(i.callback(e),delete this.jobs[e.id]):console.log("Unable to identify result of job",e.id,e)};const i={};for(const e in t.setting.system.packages){const r=t.setting.system.packages[e];i[e]={path:r.path,name:r.pkgname}}this.submit("sdk-setup",{REST:t.API.REST,pkgs:i})}newJobID(){return"job_"+Math.random().toString(36).replace(".","")}exectue_job(t,e,i,r,o){const s=this.newJobID(),a={id:s,cmd:t,data:e,root:i};this.jobs[s]={callback:r,logger:o},this.worker.postMessage(a)}submit(t,e,i,r){return new Promise((o,s)=>{this.exectue_job(t,e,i,t=>{if(t.error)return s(t.error);o(t.result)},r)})}terminate(){this.worker.terminate()}}class r{constructor(t,e){this.root=e,this.logger=t,r.worker||(r.worker=new i("pkg://libantosdk/core/worker.js"))}require(t){return this.run("sdk-import",t.map(t=>t+".worker.js"))}compile(t,e){return new Promise(async(i,r)=>{try{await this.require([t]),i(await this.run(t+"-compile",e))}catch(t){r(__e(t))}})}run(e,i){return"sdk-run-app"===e?new Promise(async(e,r)=>{try{let r=i;1==r.split("://").length&&(r=`${this.root}/${i}`);const o=await(r+"/package.json").asFileHandle().read("json");return o.text=o.name,o.path=r,o.filename=o.pkgname,o.type="app",o.mime="antos/app",o.icon&&(o.icon=`${o.path}/${o.icon}`),o.iconclass||o.icon||(o.iconclass="fa fa-adn"),this.logger.info(__("Installing...")),t.setting.system.packages[o.pkgname]=o,o.app?(this.logger.info(__("Running {0}...",o.app)),t.GUI.forceLaunch(o.app,[])):this.logger.error(__("{0} is not an application",o.pkgname)),e(void 0)}catch(t){r(t)}}):"batch"===e?new Promise(async(t,e)=>{try{if(!i||!i.target){const t=__("No target provided for job: batch");throw this.logger.error(t),new Error(t.__())}let e=i.pwd;e||(e=this.root);const o=await e.asFileHandle().read();if(o.error)throw this.logger.error(o.error),new Error(o.error);const s=o.result.filter(t=>"dir"===t.type);for(let t of s){const e=(t.path+"/build.json").asFileHandle();try{await e.onready()}catch(e){this.logger.info(__("No build.json file found in {0}, ignore this file",t.path));continue}this.logger.info(__("########### BUILDING: {0} ###########",t.path));const o=new r(this.logger,t.path),s=await e.read("json");s.root||(s.root=t.path),await o.batch([i.target],s)}return this.logger.info(__("########### Batch building done ###########")),t(void 0)}catch(t){e(t)}}):r.worker.submit(e,i,this.root,this.logger)}batch(t,e){return e.root&&(this.root=e.root),new Promise(async(i,r)=>{try{e.targets||r("No target found");for(const i of t){const t=e.targets[i];if(!t)return r(__("No target: {0}",i));if(t.depend&&await this.batch(t.depend,e),t.require&&await this.require(t.require),this.logger&&this.logger.info(__("### RUNNING STAGE: {0}###",i).__()),t.jobs)for(const e of t.jobs)await this.run(e.name,e.data)}i(void 0)}catch(t){r(t)}})}}let o;e.AntOSDKBuilder=r,function(t){class e extends t.RemoteFileHandle{constructor(t){super(t);const e="pkg://libantosdk/"+this.genealogy.join("/");this.setPath(e.asFileHandle().path)}}t.SDKFileHandle=e,t.register("^sdk$",e)}(o=e.VFS||(e.VFS={}))}(e=t.API||(t.API={}))}(OS||(OS={})),function(t){let e;!function(e){class i{constructor(t){this.target=t}info(t){this.log("info",t,!0)}warn(t){this.log("warn",t,!0)}error(t){this.log("error",t,!0)}log(t,e,i){let r=$("
").attr("class","sdk-log-"+t);if(i){let t=new Date,i=t.getDate()+"/"+(t.getMonth()+1)+"/"+t.getFullYear()+" "+t.getHours()+":"+t.getMinutes()+":"+t.getSeconds();r.text(`[${i}]: ${e.__()}`)}else r.text(e.__());$(this.target).append(r),$(this.target).scrollTop($(this.target)[0].scrollHeight)}print(t){t.match(/warn/i)?this.log("warn",t,!1):t.match(/error/i)?this.log("error",t,!1):this.log("info",t,!1)}clear(){$(this.target).empty()}}class r extends e.BaseApplication{constructor(t){super("SDKBuilder",t)}main(){this.logger=new i(this.find("container")),this.sdk=new t.API.AntOSDKBuilder(this.logger,""),this.filehandle=void 0,this.options=void 0,this.targets=this.find("target-list"),this.args&&this.args.length>0&&(this.filehandle=this.args[0].path.asFileHandle()),this.find("btnbuild").onbtclick=t=>{const e=this.targets.selectedItem;e&&this.load(this.compile([e.data.text])).catch(t=>this.logger.error(__(t.stack)))},this.find("btnclear").onbtclick=t=>{this.logger.clear()},this.find("btnrefresh").onbtclick=t=>{this.open()},this.find("btnopen").onbtclick=async t=>{try{const t=await this.openDialog("FileDialog",{title:__("Select build file"),mimes:this.meta().mimes});this.filehandle=t.file.path.asFileHandle(),this.open()}catch(t){this.logger.error(t.toString())}},this.open()}open(){void 0!==this.filehandle&&this.filehandle.read("json").then(t=>{if(!t.targets)return this.logger.error(__("Invalid build file: {0}",this.filehandle.path));const e=Object.keys(t.targets).map(t=>({text:t}));this.scheme.apptitle=this.filehandle.path,this.options=t,this.options.root=this.filehandle.parent().path,this.targets.data=e,this.logger.info(__("Loaded: {0}",this.filehandle.path))}).catch(t=>this.logger.error(__("Unable to load build file: {0}: {1}",this.filehandle.path,t.toString())))}compile(t){return new Promise(async(e,i)=>{try{this.logger.clear(),await this.sdk.batch(t,this.options),e("OK")}catch(t){i(__e(t))}})}}e.SDKBuilder=r}(e=t.application||(t.application={}))}(OS||(OS={}));
\ No newline at end of file
+
+var OS;
+(function (OS) {
+    let API;
+    (function (API) {
+        ;
+        class AntOSDKWorker {
+            constructor(path) {
+                this.worker = new Worker(path.asFileHandle().getlink());
+                this.jobs = {};
+                this.worker.onmessage = (e) => {
+                    let ret = e.data;
+                    let job = this.jobs[ret.id];
+                    if (job) {
+                        if (ret.type === "log") {
+                            if (job.logger) {
+                                if (ret.error)
+                                    job.logger.error(ret.result);
+                                else {
+                                    if (ret.show_time === false && job.logger.print)
+                                        job.logger.print(ret.result);
+                                    else
+                                        job.logger.info(ret.result);
+                                }
+                            }
+                        }
+                        else {
+                            job.callback(ret);
+                            delete this.jobs[ret.id];
+                        }
+                    }
+                    else {
+                        console.log("Unable to identify result of job", ret.id, ret);
+                    }
+                };
+                const pkgs = {};
+                for (const k in OS.setting.system.packages) {
+                    const pkg = OS.setting.system.packages[k];
+                    pkgs[k] = {
+                        path: pkg.path,
+                        name: pkg.pkgname
+                    };
+                }
+                this.submit("sdk-setup", {
+                    REST: OS.API.REST,
+                    pkgs: pkgs
+                });
+            }
+            newJobID() {
+                return `job_${Math.random().toString(36).replace(".", "")}`;
+            }
+            exectue_job(cmd, data, root, callback, logger) {
+                const id = this.newJobID();
+                const job = {
+                    id: id,
+                    cmd: cmd,
+                    data: data,
+                    root: root
+                };
+                this.jobs[id] = {
+                    callback: callback,
+                    logger: logger
+                };
+                this.worker.postMessage(job);
+            }
+            submit(cmd, data, root, logger) {
+                return new Promise((resolve, reject) => {
+                    this.exectue_job(cmd, data, root, (ret) => {
+                        if (ret.error) {
+                            return reject(ret.error);
+                        }
+                        resolve(ret.result);
+                    }, logger);
+                });
+            }
+            terminate() {
+                this.worker.terminate();
+            }
+        }
+        class AntOSDKBuilder {
+            constructor(logger, root) {
+                this.root = root;
+                this.logger = logger;
+                if (!AntOSDKBuilder.worker) {
+                    AntOSDKBuilder.worker = new AntOSDKWorker("pkg://libantosdk/core/worker.js");
+                }
+            }
+            require(mods) {
+                return this.run("sdk-import", mods.map(m => `${m}.worker.js`));
+            }
+            compile(type, opts) {
+                return new Promise(async (resolve, reject) => {
+                    try {
+                        await this.require([type]);
+                        const ret = await this.run(`${type}-compile`, opts);
+                        resolve(ret);
+                    }
+                    catch (e) {
+                        reject(__e(e));
+                    }
+                });
+            }
+            run(job, data) {
+                if (job === "sdk-run-app") {
+                    return new Promise(async (resolve, reject) => {
+                        try {
+                            let app_root = data;
+                            if (app_root.split("://").length == 1) {
+                                app_root = `${this.root}/${data}`;
+                            }
+                            const v = await `${app_root}/package.json`.asFileHandle().read("json");
+                            v.text = v.name;
+                            v.path = app_root;
+                            v.filename = v.pkgname;
+                            v.type = "app";
+                            v.mime = "antos/app";
+                            if (v.icon) {
+                                v.icon = `${v.path}/${v.icon}`;
+                            }
+                            if (!v.iconclass && !v.icon) {
+                                v.iconclass = "fa fa-adn";
+                            }
+                            this.logger.info(__("Installing..."));
+                            OS.setting.system.packages[v.pkgname] = v;
+                            if (v.app) {
+                                this.logger.info(__("Running {0}...", v.app));
+                                OS.GUI.forceLaunch(v.app, []);
+                            }
+                            else {
+                                this.logger.error(__("{0} is not an application", v.pkgname));
+                            }
+                            return resolve(undefined);
+                        }
+                        catch (error) {
+                            reject(error);
+                        }
+                    });
+                }
+                else if (job === "batch") {
+                    return new Promise(async (resolve, reject) => {
+                        try {
+                            if (!data || !data.target) {
+                                const err = __("No target provided for job: batch");
+                                this.logger.error(err);
+                                throw new Error(err.__());
+                            }
+                            let pwd = data.pwd;
+                            if (!pwd) {
+                                pwd = this.root;
+                            }
+                            const ret = await pwd.asFileHandle().read();
+                            if (ret.error) {
+                                this.logger.error(ret.error);
+                                throw new Error(ret.error);
+                            }
+                            let dirs = ret.result.filter(e => e.type === "dir");
+                            if (data.modules) {
+                                dirs = dirs.filter(e => data.modules.includes(e.filename));
+                            }
+                            for (let entry of dirs) {
+                                const build_file = `${entry.path}/build.json`.asFileHandle();
+                                try {
+                                    await build_file.onready();
+                                }
+                                catch (e) {
+                                    this.logger.info(__("No build.json file found in {0}, ignore this file", entry.path));
+                                    continue;
+                                }
+                                this.logger.info(__("########### BUILDING: {0} ###########", entry.path));
+                                const sdk = new AntOSDKBuilder(this.logger, entry.path);
+                                const options = await build_file.read("json");
+                                if (!options.root) {
+                                    options.root = entry.path;
+                                }
+                                await sdk.batch([data.target], options);
+                            }
+                            this.logger.info(__("########### Batch building done ###########"));
+                            return resolve(undefined);
+                        }
+                        catch (error) {
+                            reject(error);
+                        }
+                    });
+                }
+                return AntOSDKBuilder.worker.submit(job, data, this.root, this.logger);
+            }
+            batch(targets, options) {
+                if (options.root) {
+                    this.root = options.root;
+                }
+                return new Promise(async (resolve, reject) => {
+                    try {
+                        if (!options.targets) {
+                            reject("No target found");
+                        }
+                        for (const name of targets) {
+                            const target = options.targets[name];
+                            if (!target)
+                                return reject(__("No target: {0}", name));
+                            if (target.depend) {
+                                await this.batch(target.depend, options);
+                            }
+                            if (target.require) {
+                                await this.require(target.require);
+                            }
+                            if (this.logger)
+                                this.logger.info(__("### RUNNING STAGE: {0}###", name).__());
+                            if (target.jobs)
+                                for (const job of target.jobs) {
+                                    await this.run(job.name, job.data);
+                                }
+                        }
+                        resolve(undefined);
+                    }
+                    catch (e) {
+                        reject(e);
+                    }
+                });
+            }
+        }
+        API.AntOSDKBuilder = AntOSDKBuilder;
+        let VFS;
+        (function (VFS) {
+            class SDKFileHandle extends VFS.RemoteFileHandle {
+                /**
+                 *Creates an instance of SDKFileHandle.
+                 * @param {string} pkg_path package path in string
+                 * @memberof SDKFileHandle
+                 */
+                constructor(pkg_path) {
+                    super(pkg_path);
+                    const path = `pkg://libantosdk/${this.genealogy.join("/")}`;
+                    this.setPath(path.asFileHandle().path);
+                }
+            }
+            VFS.SDKFileHandle = SDKFileHandle;
+            VFS.register("^sdk$", SDKFileHandle);
+        })(VFS = API.VFS || (API.VFS = {}));
+    })(API = OS.API || (OS.API = {}));
+})(OS || (OS = {}));
+
+var OS;
+(function (OS) {
+    let application;
+    (function (application) {
+        class Logger {
+            /**
+             * Creates an instance of Logger.
+             * @param {HTMLElement} el target container
+             * @memberof Logger
+             */
+            constructor(el) {
+                this.target = el;
+            }
+            /**
+             * Log level info
+             *
+             * @param {string|FormattedString} s
+             * @memberof Logger
+             */
+            info(s) {
+                this.log("info", s, true);
+            }
+            /**
+             * Log level warning
+             *
+             * @param {string|FormattedString} s
+             * @memberof Logger
+             */
+            warn(s) {
+                this.log("warn", s, true);
+            }
+            /**
+             * Log level error
+             *
+             * @param {string|FormattedString} s
+             * @memberof Logger
+             */
+            error(s) {
+                this.log("error", s, true);
+            }
+            /**
+             * Log a string to target container
+             *
+             * @private
+             * @param {string} c class name of the appended log element
+             * @param {string|FormattedString} s log string
+             * @param {boolean} showtime define whether the logger should insert datetime prefix
+             * in the log string
+             * @memberof Logger
+             */
+            log(c, s, showtime) {
+                let el = $("
")
+                    .attr("class", `sdk-log-${c}`);
+                if (showtime) {
+                    let date = new Date();
+                    let prefix = date.getDate() + "/"
+                        + (date.getMonth() + 1) + "/"
+                        + date.getFullYear() + " "
+                        + date.getHours() + ":"
+                        + date.getMinutes() + ":"
+                        + date.getSeconds();
+                    el.text(`[${prefix}]: ${s.__()}`);
+                }
+                else {
+                    el.text(s.__());
+                }
+                $(this.target).append(el);
+                $(this.target).scrollTop($(this.target)[0].scrollHeight);
+            }
+            /**
+             * Print a log message without prefix
+             *
+             * @param {string|FormattedString} s text to print
+             * @memberof Logger
+             */
+            print(s) {
+                if (s.match(/warn/i)) {
+                    this.log("warn", s, false);
+                }
+                else if (s.match(/error/i)) {
+                    this.log("error", s, false);
+                }
+                else {
+                    this.log("info", s, false);
+                }
+            }
+            /**
+             * Empty the log container
+             *
+             * @memberof Logger
+             */
+            clear() {
+                $(this.target).empty();
+            }
+        }
+        /**
+         *
+         * @class SDKBuilder
+         * @extends {BaseApplication}
+         */
+        class SDKBuilder extends application.BaseApplication {
+            constructor(args) {
+                super("SDKBuilder", args);
+            }
+            main() {
+                this.logger = new Logger(this.find("container"));
+                this.sdk = new OS.API.AntOSDKBuilder(this.logger, "");
+                this.filehandle = undefined;
+                this.options = undefined;
+                this.targets = this.find("target-list");
+                if (this.args && this.args.length > 0)
+                    this.filehandle = this.args[0].path.asFileHandle();
+                this.find("btnbuild").onbtclick = (e) => {
+                    const selected = this.targets.selectedItem;
+                    if (!selected)
+                        return;
+                    this.load(this.compile([selected.data.text])).catch((e) => this.logger.error(__(e.stack)));
+                };
+                this.find("btnclear").onbtclick = (e) => {
+                    this.logger.clear();
+                };
+                this.find("btnrefresh").onbtclick = (e) => {
+                    this.open();
+                };
+                this.find("btnopen").onbtclick = async (e) => {
+                    try {
+                        const d = await this.openDialog("FileDialog", {
+                            title: __("Select build file"),
+                            mimes: this.meta().mimes
+                        });
+                        this.filehandle = d.file.path.asFileHandle();
+                        this.open();
+                    }
+                    catch (error) {
+                        this.logger.error(error.toString());
+                    }
+                };
+                this.open();
+            }
+            open() {
+                if (this.filehandle === undefined) {
+                    return;
+                }
+                this.filehandle
+                    .read("json")
+                    .then((data) => {
+                    if (!data.targets) {
+                        return this.logger.error(__("Invalid build file: {0}", this.filehandle.path));
+                    }
+                    const targets = Object.keys(data.targets).map(e => {
+                        return { text: e };
+                    });
+                    this.scheme.apptitle = this.filehandle.path;
+                    this.options = data;
+                    this.options.root = this.filehandle.parent().path;
+                    this.targets.data = targets;
+                    this.logger.info(__("Loaded: {0}", this.filehandle.path));
+                })
+                    .catch((e) => this.logger.error(__("Unable to load build file: {0}: {1}", this.filehandle.path, e.toString())));
+            }
+            compile(stages) {
+                return new Promise(async (resolve, reject) => {
+                    try {
+                        this.logger.clear();
+                        await this.sdk.batch(stages, this.options);
+                        resolve("OK");
+                    }
+                    catch (e) {
+                        reject(__e(e));
+                    }
+                });
+            }
+        }
+        application.SDKBuilder = SDKBuilder;
+    })(application = OS.application || (OS.application = {}));
+})(OS || (OS = {}));
diff --git a/libantosdk/build/release/libantosdk.zip b/libantosdk/build/release/libantosdk.zip
index 92d3c40..b307325 100644
Binary files a/libantosdk/build/release/libantosdk.zip and b/libantosdk/build/release/libantosdk.zip differ
diff --git a/libantosdk/ts/main.ts b/libantosdk/ts/main.ts
index 36ef5a8..0849f11 100644
--- a/libantosdk/ts/main.ts
+++ b/libantosdk/ts/main.ts
@@ -217,7 +217,11 @@ namespace OS {
                                 this.logger.error(ret.error);
                                 throw new Error(ret.error);
                             }
-                            const dirs = ret.result.filter(e => e.type === "dir");
+                            let dirs = ret.result.filter(e => e.type === "dir");
+                            if(data.modules)
+                            {
+                                dirs = dirs.filter(e => data.modules.includes(e.filename));
+                            }
                             for(let entry of dirs)
                             {
                                 const build_file = `${entry.path}/build.json`.asFileHandle();
diff --git a/libplotly/build/release/libplotly.zip b/libplotly/build/release/libplotly.zip
index 23dc90f..7029f9f 100644
Binary files a/libplotly/build/release/libplotly.zip and b/libplotly/build/release/libplotly.zip differ
diff --git a/libthreejs/build/release/libthreejs.zip b/libthreejs/build/release/libthreejs.zip
index fdfc7f7..2e2848b 100644
Binary files a/libthreejs/build/release/libthreejs.zip and b/libthreejs/build/release/libthreejs.zip differ
diff --git a/packages.json b/packages.json
index c472fe1..6c977c3 100644
--- a/packages.json
+++ b/packages.json
@@ -225,7 +225,7 @@
 		"description": "https://raw.githubusercontent.com/lxsang/antosdk-apps/2.0.x/libantosdk/README.md",
 		"category": "Development",
 		"author": "Xuan Sang LE",
-		"version": "0.1.1-b",
+		"version": "0.1.2-b",
 		"dependencies": [],
 		"download": "https://raw.githubusercontent.com/lxsang/antosdk-apps/2.0.x/libantosdk/build/release/libantosdk.zip"
 	},
diff --git a/release.lua b/release.lua
new file mode 100644
index 0000000..ac06adb
--- /dev/null
+++ b/release.lua
@@ -0,0 +1,95 @@
+local args=...
+
+local release_url = "https://ci.iohub.dev/public/antos-release/packages/2.0.x/"
+
+local result = function(data)
+    return { error = false, result = data }
+end
+
+local error = function(msg)
+    return {error = msg, result = false}
+end
+
+local output = function(text)
+    echo( JSON.encode(result(text)))
+end
+
+function script_path()
+   local str = debug.getinfo(2, "S").source:sub(2)
+   return str:match("(.*/)")
+end
+
+local cwd = script_path()
+local release_dir = cwd.."/release/"
+
+-- prepare release directory
+if ulib.exists(release_dir) then
+    --remove it
+    ulib.delete(release_dir)
+end
+
+-- create release dir
+output("Creating delivery directory: "..release_dir)
+if not ulib.mkdir(release_dir) then
+    return error("Unable to create release dir")
+end
+
+local r = ulib.read_dir(cwd, cwd)
+if r.error then
+    return error(r.error)
+end
+
+local packages = {}
+
+for i,v in ipairs(r) do
+    if v.type == "dir" then
+        local ar_file = v.path.."/build/release/"..v.filename..".zip"
+        local meta_file = v.path.."/package.json"
+        local readme_file = v.path.."/README.md"
+        if ulib.exists(ar_file) and ulib.exists(meta_file) then
+            -- copy zip file to release directory
+            output("Copying "..ar_file.." -> "..release_dir.."/"..v.filename..".zip")
+            if not ulib.send_file(ar_file, release_dir..v.filename..".zip") then
+                return error("Unable to copy file:"..v.filename..".zip")
+            end
+            if ulib.exists(readme_file) then
+                output("Copying "..readme_file.." -> "..release_dir.."/"..v.filename..".md")
+                if not ulib.send_file(readme_file, release_dir..v.filename..".md") then
+                    return error("Unable to copy file:"..v.readme_file..".md")
+                end
+            end
+            -- read meta-data
+            local meta = JSON.decodeFile(meta_file)
+            if not meta then
+                return error("Unable to parse package meta-data: "..meta_file)
+            end
+            local pkg = {
+                pkgname = v.filename,
+                name = meta.name,
+                description = release_url..v.filename..".md",
+                category = meta.category or "Other",
+                author = meta.info.author or "Unknown",
+                version = meta.version,
+                dependencies = meta.dependencies or {},
+                download = release_url..v.filename..".zip"
+            }
+            table.insert(packages, pkg)
+        end
+    end
+end
+
+-- write meta-data
+local index_file = release_dir.."/packages.json"
+output("Generate meta-data file: "..index_file)
+
+local file,err = io.open(index_file,'w')
+if file then
+    file:write(JSON.encode(packages))
+    file:close()
+else
+    return error("error open file ".. index_file..":"..err)
+end
+
+
+
+return result("Done!!!")
\ No newline at end of file
diff --git a/release/ACECore.md b/release/ACECore.md
new file mode 100644
index 0000000..c930e92
--- /dev/null
+++ b/release/ACECore.md
@@ -0,0 +1,27 @@
+# ACECore
+This package is AntOS wrapper of the wellknown Ace editor.
+
+Ace is a standalone code editor written in JavaScript. The goal is to create a browser based 
+editor that matches and extends the features, usability and performance of existing native 
+editors such as TextMate, Vim or Eclipse. It can be easily embedded in any web page or 
+JavaScript application. Ace is developed as the primary editor for 
+[Cloud9 IDE](https://c9.io/) and the successor of the Mozilla Skywriter (Bespin) Project.
+
+## Features
+
+* Syntax highlighting for over 120 languages (TextMate/Sublime/_.tmlanguage_ files can be imported)
+* Over 20 themes (TextMate/Sublime/_.tmtheme_ files can be imported)
+* Automatic indent and outdent
+* An optional command line
+* Handles huge documents (at last check, 4,000,000 lines is the upper limit)
+* Fully customizable key bindings including vim and Emacs modes
+* Search and replace with regular expressions
+* Highlight matching parentheses
+* Toggle between soft tabs and real tabs
+* Displays hidden characters
+* Drag and drop text using the mouse
+* Line wrapping
+* Code folding
+* Multiple cursors and selections
+* Live syntax checker (currently JavaScript/CoffeeScript/CSS/XQuery)
+* Cut, copy, and paste functionality
\ No newline at end of file
diff --git a/release/ACECore.zip b/release/ACECore.zip
new file mode 100644
index 0000000..6a66ce1
Binary files /dev/null and b/release/ACECore.zip differ
diff --git a/release/About.md b/release/About.md
new file mode 100644
index 0000000..c4c9e9b
--- /dev/null
+++ b/release/About.md
@@ -0,0 +1,26 @@
+# About
+This is an example project, generated by AntOS Development Kit
+
+It is used to show the change logs of the current AntOS version
+
+## Change logs
+### v0.1.1-b
+* Increase default window size
+### v0.1.1-b
+* add missing css file
+
+### v0.1.0-b
+* Beta state, read README file from the current OS
+
+### v0.0.7-a
+* Change app category to Utility
+
+### v0.0.6-a
+* Use README page available on github
+
+### v0.0.5-a
+* Fix cotent padding is not correct on some browsers
+
+### v0.0.4-a
+* Add color style to link
+* Fix some minor bugs
\ No newline at end of file
diff --git a/release/About.zip b/release/About.zip
new file mode 100644
index 0000000..261b059
Binary files /dev/null and b/release/About.zip differ
diff --git a/release/AceDiff.md b/release/AceDiff.md
new file mode 100644
index 0000000..63434c4
--- /dev/null
+++ b/release/AceDiff.md
@@ -0,0 +1,11 @@
+# AceDiff
+This is a wrapper for Ace Editor to provide a 2-panel diffing/merging tool that visualizes differences in two documents and allows users to copy changes from to the other.
+
+It's built on top of google-diff-match-patch library. That lib handles the hard part: the computation of the document diffs. Ace-diff just visualizes that information as line-diffs in the editors.
+
+Github page: [https://github.com/ace-diff/ace-diff](https://github.com/ace-diff/ace-diff).
+
+The ACE diff depends on the ACECore package.
+
+## Change logs
+- v0.1.1-a: add dependencies
\ No newline at end of file
diff --git a/release/AceDiff.zip b/release/AceDiff.zip
new file mode 100644
index 0000000..ff75588
Binary files /dev/null and b/release/AceDiff.zip differ
diff --git a/release/ActivityMonitor.md b/release/ActivityMonitor.md
new file mode 100644
index 0000000..7f949eb
--- /dev/null
+++ b/release/ActivityMonitor.md
@@ -0,0 +1,13 @@
+# Activity monitor
+
+This simple application show the current running AntOS processes
+
+## Change logs
+### v0.0.8-b
+* Increase default window size
+
+### v0.0.6-a
+* Fix process type identification bug
+
+### v0.0.5-a
+* Fix process type identification bug
\ No newline at end of file
diff --git a/release/ActivityMonitor.zip b/release/ActivityMonitor.zip
new file mode 100644
index 0000000..cc3c1b9
Binary files /dev/null and b/release/ActivityMonitor.zip differ
diff --git a/release/Antedit.md b/release/Antedit.md
new file mode 100644
index 0000000..eddd226
--- /dev/null
+++ b/release/Antedit.md
@@ -0,0 +1,22 @@
+# Antedit
+Simple yet powerful text/code editor based on the Monaco editor,
+the editor that powers VS Code.
+
+The editor functionality can be extended by its extension mechanism.
+Extension can be developed/released/isntalled by the editor itself.
+### Change logs
+- 0.2.3-b: Minor changes to adapt the core UI to the new AntOS 2.0.x
+- 0.2.3-b: Allow reload current file via context menu in case of external changes
+- 0.2.2-b: Support horizotal scrolling on horizotal tabbars
+- 0.2.1-b: Add open file to right, editor actions are only attached to code editor
+- 0.2.0-b: Support diff mode in editor + fix new Monaco version compatible bug
+- 0.1.17-b: Fix extension keybinding bug with the new monaco editor
+- 0.1.16-b: use the new version of monaco editor
+- 0.1.14-b: improve output log display
+- 0.1.13-b: Allow file upload in file view, add menu context in tabbar
+- 0.1.12-b: fix recent files not adding correctly
+- 0.1.11-b: fix file type parsing from path
+- 0.1.10-b: Antedit now has it own extension manager
+- 0.1.9-a: Allow output text selection
+- 0.1.8-a: Allow to change language mode
+- 0.1.7-a: Add keyboard shortcut support to extension actions
\ No newline at end of file
diff --git a/release/Antedit.zip b/release/Antedit.zip
new file mode 100644
index 0000000..8b7d352
Binary files /dev/null and b/release/Antedit.zip differ
diff --git a/release/Antunnel.md b/release/Antunnel.md
new file mode 100644
index 0000000..e9288ab
--- /dev/null
+++ b/release/Antunnel.md
@@ -0,0 +1,11 @@
+# Antunnel
+
+`Antunnel` is a client side API that allows AntOS applications to
+talk to server side applications via the [`antd-tunnel-pligin`](https://github.com/lxsang/antd-tunnel-plugin) plugin
+using a single websocket API.
+
+## Changes log
+- v0.2.0-b User multiple bytes interger network byte order in frame format
+- v0.1.9-b Use the new client size minima frame format (reduces frame overhead)
+- v0.1.4-a Reduce frame overhead
+- v0.1.3-a Remove magic number in the frame to reduce frame overhead
diff --git a/release/Antunnel.zip b/release/Antunnel.zip
new file mode 100644
index 0000000..114cac6
Binary files /dev/null and b/release/Antunnel.zip differ
diff --git a/release/AntunnelPlugins.md b/release/AntunnelPlugins.md
new file mode 100644
index 0000000..c155036
--- /dev/null
+++ b/release/AntunnelPlugins.md
@@ -0,0 +1,9 @@
+# Antunnel Plugins
+Aditional Plugins for Antunnel library.
+This package provides also the Typescript declaration file for
+application Development.
+
+## Change logs
+- v.0.1.2: minor changes on API
+- v.0.1.1: Added group query support
+- v.0.1.0: Antunnel API declaration and broadcast plugin
\ No newline at end of file
diff --git a/release/AntunnelPlugins.zip b/release/AntunnelPlugins.zip
new file mode 100644
index 0000000..6e557b6
Binary files /dev/null and b/release/AntunnelPlugins.zip differ
diff --git a/release/AntunnelTestClient.md b/release/AntunnelTestClient.md
new file mode 100644
index 0000000..0e08609
--- /dev/null
+++ b/release/AntunnelTestClient.md
@@ -0,0 +1,15 @@
+# AntunnelTestClient
+This is an example project, generated by AntOS Development Kit
+
+## Howto
+Use the Antedit command palette to access to the SDK functionalities:
+
+1. Create new project
+2. Init the project from the current folder located in side bar
+3. Build and run the project
+4. Release the project in zip package
+
+## Set up build target
+
+Open the `build.json` file from the current project tree and add/remove
+build target entries and jobs. Save the file
\ No newline at end of file
diff --git a/release/AntunnelTestClient.zip b/release/AntunnelTestClient.zip
new file mode 100644
index 0000000..027947a
Binary files /dev/null and b/release/AntunnelTestClient.zip differ
diff --git a/release/Archive.md b/release/Archive.md
new file mode 100644
index 0000000..a92ba86
--- /dev/null
+++ b/release/Archive.md
@@ -0,0 +1,22 @@
+# Archive
+
+Small application for zip file manager
+
+## Features
+* Open, create zip file Archive
+* Add/remove file/folder to archive
+* Extract zip file content
+
+## Changle log
+
+### v0.0.4-a
+* Fix file dialog bug when extract zip content
+
+### v0.0.3-a
+* Change category to utility
+
+### v0.0.2-a
+* Adapt to the new AntOS string API
+
+### v0.0.1-a
+* First release
\ No newline at end of file
diff --git a/release/Archive.zip b/release/Archive.zip
new file mode 100644
index 0000000..24f870c
Binary files /dev/null and b/release/Archive.zip differ
diff --git a/release/Blogger.md b/release/Blogger.md
new file mode 100644
index 0000000..f956a63
--- /dev/null
+++ b/release/Blogger.md
@@ -0,0 +1,25 @@
+# Blogger
+
+Blackend for my blog at https://blog.iohub.dev
+
+
+## Change logs
+
+### v0.2.x-a
+* Patch 11: Add TFIDF analyse functionality
+* Patch 10: Migrate code to typescript, use SQLiteDB lib for database access
+* Patch 9: Update to use the new MDE library
+* Patch 8: Support for antOS 2.0.x
+* Patch 7: Fix sendmail API security bug
+* Patch 6: Chage libraries load order
+* Patch 5: Add user photo to portfolio
+* Patch 4: Add package dependencies
+* Patch 3: Correct JSON text decoding
+* Patch 2: Bug fix rendering content
+* Patch 0-1 Important change: Store raw post content to the database instead of base64 string as before
+
+### v0.1.x-a
+* Patch 3-4: Enhance youtube video embedding feature in markdown
+* Patch 2: CV Category now can be created when database is not created yet
+* Patch 1: Fix package archive broken
+* Patch 0: Change default email of the sender
\ No newline at end of file
diff --git a/release/Blogger.zip b/release/Blogger.zip
new file mode 100644
index 0000000..797d1e4
Binary files /dev/null and b/release/Blogger.zip differ
diff --git a/release/Booklet.md b/release/Booklet.md
new file mode 100644
index 0000000..171b9e9
--- /dev/null
+++ b/release/Booklet.md
@@ -0,0 +1,30 @@
+# Booklet
+A back-end tool for my online document hub [https://doc.iohub.dev/antos/](https://doc.iohub.dev/)
+
+
+## Change logs
+### v0.2.5-a
+* Use the new MDE library
+### v0.2.3-a
+* Chage app category name
+### v0.2.1-a
+* Chage libraries load order
+### v0.2.1-a
+* Add depends on the SimpleMDE package
+### v0.2.0-a
+* Book meta data is no longer depending on the absolute path
+* Meta-data of Books created by Booklet v0.1.x needs to be modified (manually) to work properly on v0.2.x
+### v0.1.0-a
+* Add support to model/gltf-binary file
+### v0.1.0-a: new feature
+* Entries of the same parent now can go up and down
+* Support drag and drop to move entries around
+* Support assets such as image files can be uploaded and stored directly into the book structure
+* Booklet can now render local image
+
+### v0.0.3-a
+* Clean up code
+
+### v0.0.2-a
+* First public release
+*
diff --git a/release/Booklet.zip b/release/Booklet.zip
new file mode 100644
index 0000000..d65be05
Binary files /dev/null and b/release/Booklet.zip differ
diff --git a/release/Clipper.md b/release/Clipper.md
new file mode 100644
index 0000000..0ffea39
--- /dev/null
+++ b/release/Clipper.md
@@ -0,0 +1,17 @@
+# Clipper
+
+VDE screen capture tool.
+
+Clipper use `html2canvas` to capture AntOS desktop or a specific window.
+It is able to crop the captured image before saving to a file
+
+## Change logs
+* v0.1.4-a minor changes to adapt to new AntOS v2.0.x
+* v0.1.3-a change app category
+* v0.1.2-a use ALT-S as global shortcut for screen capture
+* v0.1.1-a use CTRL-S as global shortcut for screen capture
+* v0.1.0-a initial version
+
+
+## Credit
+* [html2canvas](https://html2canvas.hertzen.com/)
\ No newline at end of file
diff --git a/release/Clipper.zip b/release/Clipper.zip
new file mode 100644
index 0000000..1736785
Binary files /dev/null and b/release/Clipper.zip differ
diff --git a/release/CodePad.md b/release/CodePad.md
new file mode 100644
index 0000000..e943e41
--- /dev/null
+++ b/release/CodePad.md
@@ -0,0 +1,7 @@
+# CodePad
+A simple yet powerful code/text editor.
+CodePad is a text editor based on the ACE editor.
+
+## Change logs
+- v0.1.6-a: adapt to new AntOS v2.0.x
+- v0.1.5-a: CodePad moved out of AntOS based system as regular AntOS package
\ No newline at end of file
diff --git a/release/CodePad.zip b/release/CodePad.zip
new file mode 100644
index 0000000..7438996
Binary files /dev/null and b/release/CodePad.zip differ
diff --git a/release/DBDecoder.md b/release/DBDecoder.md
new file mode 100644
index 0000000..4b364cd
--- /dev/null
+++ b/release/DBDecoder.md
@@ -0,0 +1,15 @@
+# DBDecoder
+This is an example project, generated by AntOS Development Kit
+
+## Howto
+Use the CodePad command palette to access to the SDK functionalities:
+
+1. Create new project
+2. Init the project from the current folder located in side bar
+3. Build and run the project
+4. Release the project in zip package
+
+## Set up build target
+
+Open the `project.json` file from the current project tree and add/remove
+build target entries. Save the file
\ No newline at end of file
diff --git a/release/DBDecoder.zip b/release/DBDecoder.zip
new file mode 100644
index 0000000..ad0e7f0
Binary files /dev/null and b/release/DBDecoder.zip differ
diff --git a/release/DiffEditor.md b/release/DiffEditor.md
new file mode 100644
index 0000000..5f127fa
--- /dev/null
+++ b/release/DiffEditor.md
@@ -0,0 +1,6 @@
+# DiffEditor
+View and edit files in diff mode
+
+## Change logs
+- 0.1.6-a: adapt to new AntOS v2.0.x
+- Add dependencies
diff --git a/release/DiffEditor.zip b/release/DiffEditor.zip
new file mode 100644
index 0000000..fc6762e
Binary files /dev/null and b/release/DiffEditor.zip differ
diff --git a/release/Docify.md b/release/Docify.md
new file mode 100644
index 0000000..666b1ca
--- /dev/null
+++ b/release/Docify.md
@@ -0,0 +1,12 @@
+# Docify
+Simple PDF document manager
+
+## Change logs
+- v0.1.0-b: use libsqlite for database handling
+- v0.0.9-b: Adapt to support AntOS 2.0.x
+- v0.0.8-b: Allow upload files directly from the app
+- v0.0.7-a: Change category and icon
+- v0.0.6-a: Add print dialog (support server side printing)
+- v0.0.5-a: Fix delete file bug
+- v0.0.4-a: Display file size in entry meta-data
+- v0.0.3-a: Fix document moved bug, sort entries by year, month, day
\ No newline at end of file
diff --git a/release/Docify.zip b/release/Docify.zip
new file mode 100644
index 0000000..0b5285e
Binary files /dev/null and b/release/Docify.zip differ
diff --git a/release/Dockman.md b/release/Dockman.md
new file mode 100644
index 0000000..cd47507
--- /dev/null
+++ b/release/Dockman.md
@@ -0,0 +1,15 @@
+# Dockman
+This is an example project, generated by AntOS Development Kit
+
+## Howto
+Use the CodePad command palette to access to the SDK functionalities:
+
+1. Create new project
+2. Init the project from the current folder located in side bar
+3. Build and run the project
+4. Release the project in zip package
+
+## Set up build target
+
+Open the `project.json` file from the current project tree and add/remove
+build target entries. Save the file
\ No newline at end of file
diff --git a/release/Dockman.zip b/release/Dockman.zip
new file mode 100644
index 0000000..bc6a027
Binary files /dev/null and b/release/Dockman.zip differ
diff --git a/release/GPClient.md b/release/GPClient.md
new file mode 100644
index 0000000..156fd3a
--- /dev/null
+++ b/release/GPClient.md
@@ -0,0 +1,3 @@
+# GPClient
+
+Simple Multi purpose client wrapper
diff --git a/release/GPClient.zip b/release/GPClient.zip
new file mode 100644
index 0000000..5b8fe6f
Binary files /dev/null and b/release/GPClient.zip differ
diff --git a/release/GitGraph.md b/release/GitGraph.md
new file mode 100644
index 0000000..2d1cc47
--- /dev/null
+++ b/release/GitGraph.md
@@ -0,0 +1,22 @@
+# LibGitGraph
+Git grapth visualization API for AntOS application.
+
+The visualization can be easily integrated to an AntOS application, example:
+
+```typescript
+const graph = new API.LibGitGraph({
+    target: this.find("git-graph");
+});
+graph.on_open_diff = (files) => {
+    console.log(files);
+}
+graph.base_dir = "home://workspace/repo-git".asFileHandle();
+```
+
+## Change logs:
+- v0.1.5-b: Adapt to new AntOS UI API
+- v0.1.4-b: Fetch changes on a commit based on current commit and its left most parent commit
+- v0.1.3-b: Support open Git repo with open with dialog
+- v0.1.2-b: fix init bug
+- v0.1.1-b: add class to container element
+- v0.1.0-b: Initial version
\ No newline at end of file
diff --git a/release/GitGraph.zip b/release/GitGraph.zip
new file mode 100644
index 0000000..02d0e65
Binary files /dev/null and b/release/GitGraph.zip differ
diff --git a/release/GraphEditor.md b/release/GraphEditor.md
new file mode 100644
index 0000000..bee530f
--- /dev/null
+++ b/release/GraphEditor.md
@@ -0,0 +1,13 @@
+# GraphEditor
+
+Generate graph from text using mermaid
+
+## Change logs
+* v0.0.9-a: Change category
+* v0.0.8-a: Fix ace path
+* v0.0.7-a: Fix worker path
+* v0.0.6-a: Fix unable to export image from tainted canvas
+* v0.0.5-a: GraphEditor is now compatible with new AntOS API
+
+
+Note: This application use the open source library [Mermaid js](https://mermaid-js.github.io/mermaid) for graph rendering
\ No newline at end of file
diff --git a/release/GraphEditor.zip b/release/GraphEditor.zip
new file mode 100644
index 0000000..98bb6c2
Binary files /dev/null and b/release/GraphEditor.zip differ
diff --git a/release/ImageEditor.md b/release/ImageEditor.md
new file mode 100644
index 0000000..52dcc82
--- /dev/null
+++ b/release/ImageEditor.md
@@ -0,0 +1,22 @@
+# Image Editor
+Full featured image editor using HTML5 Canvas.
+
+This application is a wrapper of the [TOAST UI Image editor](https://github.com/nhn/tui.image-editor).
+
+**Features:**
+
+* Load image to canvas
+* Undo/Redo (With shortcut)
+* Crop
+* Flip
+* Rotation
+* Free drawing
+* Line drawing
+* Shape
+* Icon
+* Text
+* Mask Filter
+* Image Filter
+
+## Changes log
+* v0.1.0-a: First release
\ No newline at end of file
diff --git a/release/ImageEditor.zip b/release/ImageEditor.zip
new file mode 100644
index 0000000..60d014a
Binary files /dev/null and b/release/ImageEditor.zip differ
diff --git a/release/Katex.md b/release/Katex.md
new file mode 100644
index 0000000..1cbbc69
--- /dev/null
+++ b/release/Katex.md
@@ -0,0 +1,13 @@
+KaTeX is a fast, easy-to-use JavaScript library for TeX math rendering on the web.
+
+* Fast: KaTeX renders its math synchronously and doesn't need to reflow the page. See how it compares to a competitor in this speed test.
+* Print quality: KaTeX's layout is based on Donald Knuth's TeX, the gold standard for math typesetting.
+* Self contained: KaTeX has no dependencies and can easily be bundled with your website resources.
+* Server side rendering: KaTeX produces the same output regardless of browser or environment, so you can pre-render expressions using Node.js and send them as plain HTML.
+
+
+KaTeX is compatible with all major browsers, including Chrome, Safari, Firefox, Opera, Edge, and IE 11.
+
+KaTeX supports much (but not all) of LaTeX and many LaTeX packages.
+
+Github Project: [https://github.com/KaTeX/KaTeX](https://github.com/KaTeX/KaTeX)
\ No newline at end of file
diff --git a/release/Katex.zip b/release/Katex.zip
new file mode 100644
index 0000000..e4c7bc1
Binary files /dev/null and b/release/Katex.zip differ
diff --git a/release/LibreOffice.md b/release/LibreOffice.md
new file mode 100644
index 0000000..816814f
--- /dev/null
+++ b/release/LibreOffice.md
@@ -0,0 +1,24 @@
+# Libre Office Onlie
+
+This application is the front-end connector of the Libre Office Online suite.
+It needs to connect to a working LibreOffice document server.
+
+The application allows to open/edit commons document, presentation, and spreedsheet.
+It support a wide range of documents.
+
+![https://github.com/lxsang/antosdk-apps/blob/master/LibreOffice/libreoffice.png?raw=true](https://github.com/lxsang/antosdk-apps/blob/master/LibreOffice/libreoffice.png?raw=true)
+
+## Change log
+- v 0.1.4-a:
+    * Update backend script to latest API changes
+    * use luasocket + luasec to fetch LibreOffice service discovery
+- v 0.1.3-a:
+    * Minor fix to support AntOS v2.0.x
+- v 0.1.2-a:
+    * Fix server side API error with new backend API
+- v 0.1.1-a:
+    * improve UI handling
+    * add Save as option
+    * add traditional AntOS application File menu
+    * fetch supported mimes from discovery URL
+- v 0.1.0-a: Initial version
diff --git a/release/LibreOffice.zip b/release/LibreOffice.zip
new file mode 100644
index 0000000..ebad086
Binary files /dev/null and b/release/LibreOffice.zip differ
diff --git a/release/LuaPlayground.md b/release/LuaPlayground.md
new file mode 100644
index 0000000..c48cc3e
--- /dev/null
+++ b/release/LuaPlayground.md
@@ -0,0 +1,12 @@
+#LuaPlayground
+
+
+Application for serverside code testing and analytics tool.
+It allows to execute lua code on the server from the browser
+
+## Change logs
+* 0.1.1-a: Minor changes to support mobile devices
+* 0.1.0-a: Change package dependencies
+* 0.0.7-a: Change icon and category
+* 0.0.6-a: Fix ace path error
+* 0.0.5-a: Fix worker path error
\ No newline at end of file
diff --git a/release/LuaPlayground.zip b/release/LuaPlayground.zip
new file mode 100644
index 0000000..9024c62
Binary files /dev/null and b/release/LuaPlayground.zip differ
diff --git a/release/MonacoCore.md b/release/MonacoCore.md
new file mode 100644
index 0000000..c56f853
--- /dev/null
+++ b/release/MonacoCore.md
@@ -0,0 +1,6 @@
+# MonacoCore
+The Monaco Editor is the code editor which powers VS Code.
+
+This library is the AntOS package wrapper of the Monaco editor 0.33.0
+
+For more information on the editor: [https://microsoft.github.io/monaco-editor/](https://microsoft.github.io/monaco-editor/)
\ No newline at end of file
diff --git a/release/MonacoCore.zip b/release/MonacoCore.zip
new file mode 100644
index 0000000..0b6c447
Binary files /dev/null and b/release/MonacoCore.zip differ
diff --git a/release/OnlyOffice.md b/release/OnlyOffice.md
new file mode 100644
index 0000000..2f34f2b
--- /dev/null
+++ b/release/OnlyOffice.md
@@ -0,0 +1,20 @@
+# OnlyOffice
+
+This application is the front-end connector of the OnlyOffice suite.
+It needs to connect to a working OnlyOffice document server.
+
+The application allows to open/edit commons document, presentation, and spreedsheet.
+Integrate OnlyOffice to an virtual window environment like AntOs allows a convenient
+way to work with multiple documents at the same time.
+
+![https://github.com/lxsang/antosdk-apps/blob/master/OnlyOffice/screenshot.png?raw=true](https://github.com/lxsang/antosdk-apps/blob/master/OnlyOffice/screenshot.png?raw=true)
+
+## Change log
+- v 0.1.8a: Use new backend API + luasec + luasocket to manipulate remote file
+- v 0.1.7a: Allow setting blur overlay on window
+- v 0.1.6a: Update backend api
+- v 0.1.5a: Add document versionning support
+- v 0.1.4a: If the iframe has the same origin with the parent, enable the focus event
+- v 0.1.3a: Let backend generates document key, compatible with doc.iohub.dev/office
+- v 0.1.2a: generate document key based on username, file path and modified time
+- v 0.1.1a: generate document key based on username and file path
diff --git a/release/OnlyOffice.zip b/release/OnlyOffice.zip
new file mode 100644
index 0000000..f2ba002
Binary files /dev/null and b/release/OnlyOffice.zip differ
diff --git a/release/Preview.md b/release/Preview.md
new file mode 100644
index 0000000..33b466a
--- /dev/null
+++ b/release/Preview.md
@@ -0,0 +1,8 @@
+# Preview
+
+Image and PDF file viewer for AntOS
+
+## Change logs
+* v0.1.3-a: Minor fix on window focus event when using ifrane
+* v0.1.2-a: support AntOS v2.0.x
+* v0.1.0-a: add depends on libpdfjs, user the default PDFJS viewer
\ No newline at end of file
diff --git a/release/Preview.zip b/release/Preview.zip
new file mode 100644
index 0000000..ec870e6
Binary files /dev/null and b/release/Preview.zip differ
diff --git a/release/RemoteCamera.md b/release/RemoteCamera.md
new file mode 100644
index 0000000..4c2fa88
--- /dev/null
+++ b/release/RemoteCamera.md
@@ -0,0 +1,13 @@
+# RemoteCamera
+
+Connect to a V4L2 camera on server via Antunnel plugin.
+
+![](https://raw.githubusercontent.com/lxsang/antosdk-apps/master/RemoteCamera/screenshot.jpg)
+
+This application reauires the **tunel plugin** and the **ant-tunnel v4l2 publisher**
+on the server-side
+
+## Change log
+* v0.1.5-a: support AntOS 2.0.x
+* v0.1.4-a: change app category
+* v0.1.2-a: user worker for jpeg decoding
diff --git a/release/RemoteCamera.zip b/release/RemoteCamera.zip
new file mode 100644
index 0000000..e24bb1b
Binary files /dev/null and b/release/RemoteCamera.zip differ
diff --git a/release/RemoteDesktop.md b/release/RemoteDesktop.md
new file mode 100644
index 0000000..d445657
--- /dev/null
+++ b/release/RemoteDesktop.md
@@ -0,0 +1,21 @@
+# WVNC remote desktop
+![](https://raw.githubusercontent.com/lxsang/antosdk-apps/master/RemoteDesktop/screenshot.jpg)
+
+A web based VNC client allowing to control remote VNC desktop from browser. The application is based on **wvnc**, a protocol and API that uses web socket to communicate with remote VNC server.
+
+Further information on **wvnc**: [https://blog.lxsang.me/post/id/23](https://blog.lxsang.me/post/id/23)
+
+
+## Change logs
+* v0.1.16 - Allow to enable/disable mouse capture in remote desktop, remove some unused toolbar buttons
+* v0.1.15 - Only send ACK command when finish rendering the received frame, this allows to vastly improve performance and bandwidth
+* v0.1.14 - Add toolbar for canvas size control
+* v0.1.13 - support AntOS v2.0.x
+* v0.1.12 - improve UI handling
+* v0.1.11 - Support 16 bits per pixel
+* v0.1.10 - Allow to sync clipboard between local and remote machine, CTRL+SHIF+V to paste text from local to remote machine
+* v0.1.9 - improve stability
+* v0.1.7-8 - remove package dependencies, use web assembly for jpeg decoding, improve rendering performance and connection stability
+* v0.1.6 - Change category
+* v0.1.5 - add package dependencies and use the new **libwvnc**
+* v0.1.0 - adapt to the new AntOS API
diff --git a/release/RemoteDesktop.zip b/release/RemoteDesktop.zip
new file mode 100644
index 0000000..3e05727
Binary files /dev/null and b/release/RemoteDesktop.zip differ
diff --git a/release/SQLiteDB.md b/release/SQLiteDB.md
new file mode 100644
index 0000000..598b8f3
--- /dev/null
+++ b/release/SQLiteDB.md
@@ -0,0 +1,11 @@
+# SQLiteDB
+
+This package contains the SQLiteDB API binding for AntOS applications
+and a simple sqlite3 browser application that uses the library as reference
+
+Note: in AntOS, file with extension `.db` is considered as sqlite3 database
+file and has the following mimetype `application/vnd.sqlite3`. Applications
+shall use this mime in `package.json`
+
+## Change logs
+- v0.1.0a: initial version with functioning library binding
diff --git a/release/SQLiteDB.zip b/release/SQLiteDB.zip
new file mode 100644
index 0000000..1850071
Binary files /dev/null and b/release/SQLiteDB.zip differ
diff --git a/release/ServerLogClient.md b/release/ServerLogClient.md
new file mode 100644
index 0000000..942440f
--- /dev/null
+++ b/release/ServerLogClient.md
@@ -0,0 +1,12 @@
+# Server log monitor
+This application allows to monitor Server Syslog
+using Antunnel protocol. Features:
+* Realtime log monitoring
+* Filter logs by pattern (regular expression), severity
+* Recording last n log messages
+
+## Change logs
+* v0.1.3-b update dependencies to latest
+* v0.1.2-b update dependencies to latest
+* v0.1.1-b minor fix on dialog handling, fix incorrect package version
+* v0.1.0-b first beta version
\ No newline at end of file
diff --git a/release/ServerLogClient.zip b/release/ServerLogClient.zip
new file mode 100644
index 0000000..79b093c
Binary files /dev/null and b/release/ServerLogClient.zip differ
diff --git a/release/ShaderPlayground.md b/release/ShaderPlayground.md
new file mode 100644
index 0000000..73bd3f0
--- /dev/null
+++ b/release/ShaderPlayground.md
@@ -0,0 +1,12 @@
+# ShaderPlayground
+
+Playground for working with Open GL shader language, the sharder is rendered
+with the Three.js library
+
+## Change logs
+- v0.0.4-a: support AntOS 2.0.x
+- v0.0.3-a: reset texture when open new file
+- v0.0.2-a:
+    - Remove GLSLX, use the default WEBGL API for shader compiling
+    - Allow save/open shader source code to/from file (JSON)
+- v0.0.1-a: Initial version
\ No newline at end of file
diff --git a/release/ShaderPlayground.zip b/release/ShaderPlayground.zip
new file mode 100644
index 0000000..649565c
Binary files /dev/null and b/release/ShaderPlayground.zip differ
diff --git a/release/ShowCase.md b/release/ShowCase.md
new file mode 100644
index 0000000..e31763a
--- /dev/null
+++ b/release/ShowCase.md
@@ -0,0 +1,3 @@
+# AntOS showcase
+
+This application demonstrates the basic GUI features supported by AntOS
diff --git a/release/ShowCase.zip b/release/ShowCase.zip
new file mode 100644
index 0000000..e6a8f55
Binary files /dev/null and b/release/ShowCase.zip differ
diff --git a/release/SimpleMDE.md b/release/SimpleMDE.md
new file mode 100644
index 0000000..eca857b
--- /dev/null
+++ b/release/SimpleMDE.md
@@ -0,0 +1,5 @@
+EasyMDE - Markdown Editor library for AntOS
+
+A drop-in JavaScript textarea replacement for writing beautiful and understandable Markdown. The WYSIWYG-esque editor allows users who may be less experienced with Markdown to use familiar toolbar buttons and shortcuts. In addition, the syntax is rendered while editing to clearly show the expected result. Headings are larger, emphasized words are italicized, links are underlined, etc. SimpleMDE is one of the first editors to feature both built-in autosaving and spell checking.
+
+Project on Github [https://easy-markdown-editor.tk/](https://easy-markdown-editor.tk/)
\ No newline at end of file
diff --git a/release/SimpleMDE.zip b/release/SimpleMDE.zip
new file mode 100644
index 0000000..6639ba1
Binary files /dev/null and b/release/SimpleMDE.zip differ
diff --git a/release/SystemControl.md b/release/SystemControl.md
new file mode 100644
index 0000000..29a7432
--- /dev/null
+++ b/release/SystemControl.md
@@ -0,0 +1,9 @@
+# SystemControl
+
+System monitoring is a part of my ROS Based robot software system.
+
+It allows to display the robot resource infomation (such as battery, network, CPU load, memory load, etc.) on Antos application
+via the Antunnel service
+
+![https://raw.githubusercontent.com/lxsang/antosdk-apps/master/SystemControl/screenshot.png](https://raw.githubusercontent.com/lxsang/antosdk-apps/master/SystemControl/screenshot.png)
+
diff --git a/release/SystemControl.zip b/release/SystemControl.zip
new file mode 100644
index 0000000..d041a33
Binary files /dev/null and b/release/SystemControl.zip differ
diff --git a/release/TinyEditor.md b/release/TinyEditor.md
new file mode 100644
index 0000000..f77295b
--- /dev/null
+++ b/release/TinyEditor.md
@@ -0,0 +1,3 @@
+# TinyEditor
+This is the example project for the tutorial: [https://blog.lxsang.me/post/id/20](https://blog.lxsang.me/post/id/20). The tutorial is outdated, it is no longer compatible with the new antos API
+
diff --git a/release/TinyEditor.zip b/release/TinyEditor.zip
new file mode 100644
index 0000000..d47242a
Binary files /dev/null and b/release/TinyEditor.zip differ
diff --git a/release/VizApp.md b/release/VizApp.md
new file mode 100644
index 0000000..efdcc67
--- /dev/null
+++ b/release/VizApp.md
@@ -0,0 +1,8 @@
+# GraphEditor
+
+Generate graph from text using dot(viz) format
+
+## Change logs
+* v0.1.0-a: Add package dependencies
+* v0.0.2-a: Fix path problem
+* v0.0.1-a: First version
\ No newline at end of file
diff --git a/release/VizApp.zip b/release/VizApp.zip
new file mode 100644
index 0000000..46a2c3a
Binary files /dev/null and b/release/VizApp.zip differ
diff --git a/release/libantosdk.md b/release/libantosdk.md
new file mode 100644
index 0000000..0d13a77
--- /dev/null
+++ b/release/libantosdk.md
@@ -0,0 +1,22 @@
+# libantosdk
+AntOSDK: development API for AntOS based applications/projects
+
+## Change logs
+- 0.1.2: add batch building support
+- 0.1.1: linux worker is renamed to backend, linux-exec job re to cmd-exec, add lua-exec job for backend lua script execution
+- 0.1.0: antOS SDK is no longer delivered in this package, it will be fetched directly from AntOS release site
+- 0.0.18: Add some public API on grid view
+- 0.0.17: Use lastest AntOS d.ts file
+- 0.0.16: Fix jquery encoding error
+- 0.0.15: App name differ from libname, update AntOS API
+- 0.0.14: vfs-rm can be configured to be silent when the target does not exist
+- 0.0.13: allow linux-job handle to set defaut pwd if it is not specified in job description
+- 0.0.12: TS worker now allows user specific compile options (defined un build file)
+- 0.0.11: Update AntOS API v1.2.1
+- 0.0.10: fix binary readfile bug
+- 0.0.9: Fix locale gen bug
+- 0.0.8: Update JQuery support in typescript
+- 0.0.7: enable typescript downlevelIteration compile option
+- 0.0.6: add GUI application for building a JSON build file
+- 0.0.5: add API that supports running Linux commands on server
+- 0.0.4: support automatic locale generation
\ No newline at end of file
diff --git a/release/libantosdk.zip b/release/libantosdk.zip
new file mode 100644
index 0000000..92d3c40
Binary files /dev/null and b/release/libantosdk.zip differ
diff --git a/release/libfabric.md b/release/libfabric.md
new file mode 100644
index 0000000..c6e6e5a
--- /dev/null
+++ b/release/libfabric.md
@@ -0,0 +1,13 @@
+# libfabric
+
+This package is a wrapper of the **Fabric.js** library v-4.4.0.
+
+
+Fabric.js is a framework that makes it easy to work with HTML5 canvas element. It is an interactive object model on top of canvas element. It is also an SVG-to-canvas parser.
+
+Using Fabric.js, you can create and populate objects on canvas; objects like simple geometrical shapes — rectangles, circles, ellipses, polygons, or more complex shapes consisting of hundreds or thousands of simple paths. You can then scale, move, and rotate these objects with the mouse; modify their properties — color, transparency, z-index, etc. You can also manipulate these objects altogether — grouping them with a simple mouse selection.
+
+## Non-Technical Introduction to Fabric
+Fabric.js allows you to easily create simple shapes like rectangles, circles, triangles and other polygons or more complex shapes made up of many paths, onto the HTML  element on a webpage using JavaScript. Fabric.js will then allow you to manipulate the size, position and rotation of these objects with a mouse. It’s also possible to change some of the attributes of these objects such as their color, transparency, depth position on the webpage or selecting groups of these objects using the Fabric.js library. Fabric.js will also allow you to convert an SVG image into JavaScript data that can be used for putting it onto the  element.
+
+More information on the library: [https://github.com/fabricjs/fabric.js](https://github.com/fabricjs/fabric.js)
\ No newline at end of file
diff --git a/release/libfabric.zip b/release/libfabric.zip
new file mode 100644
index 0000000..c9b94e0
Binary files /dev/null and b/release/libfabric.zip differ
diff --git a/release/libjpeg.md b/release/libjpeg.md
new file mode 100644
index 0000000..0d94227
--- /dev/null
+++ b/release/libjpeg.md
@@ -0,0 +1,4 @@
+# libjpeg
+Simple JPEG/DCT data decoder in JavaScript. Also this project includes JPEG 2000 and JBIG2 decoders.
+
+Github page: [https://github.com/notmasteryet/jpgjs](https://github.com/notmasteryet/jpgjs)
\ No newline at end of file
diff --git a/release/libjpeg.zip b/release/libjpeg.zip
new file mode 100644
index 0000000..1718403
Binary files /dev/null and b/release/libjpeg.zip differ
diff --git a/release/libpdfjs.md b/release/libpdfjs.md
new file mode 100644
index 0000000..4bd3d37
--- /dev/null
+++ b/release/libpdfjs.md
@@ -0,0 +1,11 @@
+# PDF.js [![Build Status](https://github.com/mozilla/pdf.js/workflows/CI/badge.svg?branch=master)](https://github.com/mozilla/pdf.js/actions?query=workflow%3ACI+branch%3Amaster)
+
+[PDF.js](https://mozilla.github.io/pdf.js/) is a Portable Document Format (PDF) viewer that is built with HTML5.
+
+PDF.js is community-driven and supported by Mozilla. Our goal is to
+create a general-purpose, web standards-based platform for parsing and
+rendering PDFs.
+
+
+This is a AntOS package wrapper for PDFJS that can be used by another AntOS package, it includes the
+library and the default pdf viewer
\ No newline at end of file
diff --git a/release/libpdfjs.zip b/release/libpdfjs.zip
new file mode 100644
index 0000000..d662c6d
Binary files /dev/null and b/release/libpdfjs.zip differ
diff --git a/release/libplotly.md b/release/libplotly.md
new file mode 100644
index 0000000..c57e28d
--- /dev/null
+++ b/release/libplotly.md
@@ -0,0 +1,5 @@
+# libplotly
+Built on top of d3.js and stack.gl, Plotly.js is a high-level, declarative charting library. plotly.js ships with over 40 chart types, including 3D charts, statistical graphs, and SVG maps.
+plotly.js is free and open source and you can view the source, [report issues or contribute on GitHub](https://github.com/plotly/plotly.js).
+
+This package is the AntOS wrapper of Plotly used as library for AntOS applications
\ No newline at end of file
diff --git a/release/libplotly.zip b/release/libplotly.zip
new file mode 100644
index 0000000..23dc90f
Binary files /dev/null and b/release/libplotly.zip differ
diff --git a/release/libthreejs.md b/release/libthreejs.md
new file mode 100644
index 0000000..8482f75
--- /dev/null
+++ b/release/libthreejs.md
@@ -0,0 +1,12 @@
+# libthreejs
+
+AntOS package wrapper for the famous Three.js library R129.
+
+## About Three.js
+
+The aim of the project is to create an easy to use, lightweight,
+cross-browser, general purpose 3D library. The current builds only
+include a WebGL renderer but WebGPU (experimental), SVG and CSS3D
+renderers are also available in the examples.
+
+Github: [https://github.com/mrdoob/three.js](https://github.com/mrdoob/three.js)
\ No newline at end of file
diff --git a/release/libthreejs.zip b/release/libthreejs.zip
new file mode 100644
index 0000000..fdfc7f7
Binary files /dev/null and b/release/libthreejs.zip differ
diff --git a/release/libwvnc.md b/release/libwvnc.md
new file mode 100644
index 0000000..f56b5a5
--- /dev/null
+++ b/release/libwvnc.md
@@ -0,0 +1,74 @@
+# libwvnc
+
+Overview about WVNC: [https://blog.lxsang.me/r/id/23](https://blog.lxsang.me/r/id/23)
+
+**libwvnc** is the client side protocol API for my [Antd's **wvnc**](https://github.com/lxsang/antd-wvnc-plugin) server side plugin. It allows to acess VNC server from the web using websocket (via the **wvnc** server plugin).
+
+Since the **wvnc** plugin offers data compression using JPEG, **wvnc.js** depends on the **libjpeg** package and **web worker** to speed up the data decoding process, thus speed up the screen rendering on HTML canvas.
+
+
+## Example
+It is straight forward to use the api:
+
+Html code:
+
+```html
+    ...
+    
+```
+
+Javascript:
+
+```javascript
+  var args, client;
+  args = {
+    // the canvas element
+    element: 'screen',
+    // The websocket uri to the wvnc server side plugin
+    ws: 'wss://localhost/wvnc',
+    // the decoder worker
+    libjpeg: 'path/to/jpg.js'
+  };
+  client = new WVNC(args);
+  
+  // This function responds to a VNC server password request
+  // should return a promise
+  client.onpassword = function() {
+    return new Promise(function(r, e) {
+      return r('password');
+    });
+  };
+  
+  // this function responds to the remote OS username and password request
+  // should return a promise
+  client.oncredential = function() {
+    return new Promise(function(r, e) {
+      return r('username', 'password');
+    });
+  };
+  // event fired when a text is copied on
+  // the remote computer
+  client.oncopy = function(text) {
+    console.log(text);
+  };
+  // init the WVNC client
+  client.init()
+    .then(function() {
+        client.connect(
+          // VNC server
+          "192.168.1.20:5901", 
+          {
+            // bits per pixel
+            bbp: 32,
+            // data compression flag
+            // 1 is for both JPEG
+            // 0 is for raw data
+            flag: 1,
+            // JPEG quality %
+            quality: 50
+          });
+    })
+    .catch(function(m, s) {
+      return console.error(m, s);
+    });
+```
diff --git a/release/libwvnc.zip b/release/libwvnc.zip
new file mode 100644
index 0000000..1bf22b2
Binary files /dev/null and b/release/libwvnc.zip differ
diff --git a/release/packages.json b/release/packages.json
new file mode 100644
index 0000000..f0cc672
--- /dev/null
+++ b/release/packages.json
@@ -0,0 +1 @@
+[{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Archive.md","category":"Utility","author":"Xuan Sang LE","name":"Archive","version":"0.0.4-a","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Archive.zip","pkgname":"Archive"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libwvnc.md","category":"Library","author":"","name":"libwvnc","version":"0.1.2-a","dependencies":["libjpeg@0.1.1-a"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libwvnc.zip","pkgname":"libwvnc"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/About.md","category":"Utility","author":"Xuan Sang LE","name":"About AntOS","version":"0.1.2-b","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/About.zip","pkgname":"About"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Blogger.md","category":"Internet","author":"Xuan Sang LE","name":"Blogging application","version":"0.2.11-a","dependencies":["SimpleMDE@2.18.0-r","Katex@0.11.1-r","SQLiteDB@0.1.0-a"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Blogger.zip","pkgname":"Blogger"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GitGraph.md","category":"Development","author":"Dany LE","name":"GIT Visualization","version":"0.1.5-b","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GitGraph.zip","pkgname":"GitGraph"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/LibreOffice.md","category":"Office","author":"Dany LE","name":"Libre Office Online","version":"0.1.4-a","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/LibreOffice.zip","pkgname":"LibreOffice"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AceDiff.md","category":"Library","author":"","name":"AceDiff addon library","version":"3.0.3-r","dependencies":["ACECore@1.4.12-r"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AceDiff.zip","pkgname":"AceDiff"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/OnlyOffice.md","category":"Office","author":"Xuan Sang LE","name":"Office Suite","version":"0.1.8-a","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/OnlyOffice.zip","pkgname":"OnlyOffice"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/vfsx.md","category":"Library","author":"Dany LE","name":"AntOS VFS handles","version":"0.1.0-b","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/vfsx.zip","pkgname":"vfsx"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Antedit.md","category":"Development","author":"Xuan Sang LE","name":"Antos Editor","version":"0.2.4-b","dependencies":["MonacoCore@0.33.0-r"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Antedit.zip","pkgname":"Antedit"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Booklet.md","category":"Office","author":"Xuan Sang LE","name":"Booklet","version":"0.2.5-a","dependencies":["SimpleMDE@2.18.0-r","Katex@0.11.1-r"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Booklet.zip","pkgname":"Booklet"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Docify.md","category":"Office","author":"Dany LE","name":"Docify","version":"0.1.0-b","dependencies":["SQLiteDB@0.1.0-a"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Docify.zip","pkgname":"Docify"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AntunnelPlugins.md","category":"Library","author":"Dany LE","name":"Antunnel Plugins","version":"0.1.2-a","dependencies":["Antunnel@0.2.0-b"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AntunnelPlugins.zip","pkgname":"AntunnelPlugins"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ShowCase.md","category":"Utility","author":"Xuan Sang LE","name":"ShowCase","version":"0.0.7-a","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ShowCase.zip","pkgname":"ShowCase"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/RemoteDesktop.md","category":"Internet","author":"Dany LE","name":"WVNC remote desktop","version":"0.1.16-b","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/RemoteDesktop.zip","pkgname":"RemoteDesktop"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Clipper.md","category":"Utility","author":"Xuan Sang LE","name":"Clipper","version":"0.1.4-a","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Clipper.zip","pkgname":"Clipper"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Antunnel.md","category":"Library","author":"Xuan Sang LE","name":"Antunnel","version":"0.2.1-b","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Antunnel.zip","pkgname":"Antunnel"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/RemoteCamera.md","category":"Graphics","author":"","name":"Remote Camera","version":"0.1.5-a","dependencies":["libjpeg@0.1.1-a","Antunnel@0.1.8-a"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/RemoteCamera.zip","pkgname":"RemoteCamera"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/DiffEditor.md","category":"Development","author":"","name":"Diff Editor","version":"0.1.6-a","dependencies":["AceDiff@3.0.3-r"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/DiffEditor.zip","pkgname":"DiffEditor"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libthreejs.md","category":"Library","author":"","name":"libthreejs","version":"0.0.129-r","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libthreejs.zip","pkgname":"libthreejs"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SimpleMDE.md","category":"Library","author":"","name":"EasyMDE","version":"2.18.0-r","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SimpleMDE.zip","pkgname":"SimpleMDE"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SQLiteDB.md","category":"Library","author":"Dany LE","name":"SQLite3 Browser","version":"0.1.0-a","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SQLiteDB.zip","pkgname":"SQLiteDB"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GPClient.md","category":"Internet","author":"Xuan Sang LE","name":"Generic Purpose client","version":"0.1.4-a","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GPClient.zip","pkgname":"GPClient"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/vTerm.md","category":"System","author":"Xuan Sang LE","name":"Virtual Terminal","version":"0.1.20-a","dependencies":["Antunnel@0.2.1-b","xTerm@5.1.0-r"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/vTerm.zip","pkgname":"vTerm"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ActivityMonitor.md","category":"System","author":"Xuan Sang LE","name":"Activity monitor","version":"0.0.8-b","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ActivityMonitor.zip","pkgname":"ActivityMonitor"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ShaderPlayground.md","category":"Development","author":"Xuan Sang LE","name":"OpenGL Shader Playground","version":"0.0.4-a","dependencies":["libthreejs@0.0.129-r"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ShaderPlayground.zip","pkgname":"ShaderPlayground"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/MonacoCore.md","category":"Library","author":"","name":"Monaco editor core","version":"0.33.0-r","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/MonacoCore.zip","pkgname":"MonacoCore"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/LuaPlayground.md","category":"Development","author":"Xuan Sang LE","name":"LuaPlayground","version":"0.1.1-a","dependencies":["ACECore@1.4.12-r"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/LuaPlayground.zip","pkgname":"LuaPlayground"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/VizApp.md","category":"Graphics","author":"Xuan Sang LE","name":"Viz editor","version":"0.1.0-a","dependencies":["ACECore@1.4.12-r"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/VizApp.zip","pkgname":"VizApp"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ServerLogClient.md","category":"System","author":"","name":"Server log monitor","version":"0.1.3-b","dependencies":["Antunnel@0.2.1-b"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ServerLogClient.zip","pkgname":"ServerLogClient"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Dockman.md","category":"Development","author":"Xuan Sang LE","name":"Remote Docker Manager","version":"0.1.1-b","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Dockman.zip","pkgname":"Dockman"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SystemControl.md","category":"System","author":"","name":"System monitoring","version":"0.1.11-a","dependencies":["Antunnel@0.2.1-b"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/SystemControl.zip","pkgname":"SystemControl"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libpdfjs.md","category":"Library","author":"Xuan Sang LE","name":"PDF JS library","version":"2.6.347-r","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libpdfjs.zip","pkgname":"libpdfjs"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ImageEditor.md","category":"Graphics","author":"Xuan Sang LE","name":"Image editor","version":"0.1.0-a","dependencies":["libfabric@4.4.0-r"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ImageEditor.zip","pkgname":"ImageEditor"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/DBDecoder.md","category":"Other","author":"","name":"DBDecoder","version":"0.0.2-a","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/DBDecoder.zip","pkgname":"DBDecoder"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Katex.md","category":"Library","author":"","name":"Katex","version":"0.11.1-r","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Katex.zip","pkgname":"Katex"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libplotly.md","category":"Library","author":"Dany LE","name":"Plotly","version":"2.6.2-r","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libplotly.zip","pkgname":"libplotly"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/CodePad.md","category":"Development","author":"Xuan Sang LE","name":"Code","version":"0.1.6-b","dependencies":["ACECore@1.4.12-r"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/CodePad.zip","pkgname":"CodePad"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AntunnelTestClient.md","category":"Development","author":"Dany LE","name":"AntunnelTestClient","version":"0.1.0-a","dependencies":["Antunnel@0.2.1-b"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/AntunnelTestClient.zip","pkgname":"AntunnelTestClient"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libjpeg.md","category":"Library","author":"","name":"libjpeg","version":"0.1.1-a","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libjpeg.zip","pkgname":"libjpeg"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libfabric.md","category":"Library","author":"","name":"Fabric.js library","version":"4.4.0-r","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libfabric.zip","pkgname":"libfabric"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libantosdk.md","category":"Development","author":"Xuan Sang LE","name":"AntOS SDK builder","version":"0.1.2-b","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/libantosdk.zip","pkgname":"libantosdk"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/xTerm.md","category":"Library","author":"","name":"xTerm Library","version":"5.1.0-r","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/xTerm.zip","pkgname":"xTerm"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/TinyEditor.md","category":"Other","author":"Xuan Sang LE","name":"Tiny editor","version":"0.0.4-a","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/TinyEditor.zip","pkgname":"TinyEditor"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ACECore.md","category":"Library","author":"","name":"ACE Editor core","version":"1.4.12-r","dependencies":[],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/ACECore.zip","pkgname":"ACECore"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Preview.md","category":"Graphics","author":"Xuan Sang LE","name":"Preview","version":"0.1.3-a","dependencies":["libpdfjs@2.6.347-r"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/Preview.zip","pkgname":"Preview"},{"description":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GraphEditor.md","category":"Graphics","author":"Xuan Sang LE","name":"Graph Editor","version":"0.1.2-a","dependencies":["ACECore@1.4.12-r"],"download":"https://ci.iohub.dev/public/antos-release/packages/2.0.x/GraphEditor.zip","pkgname":"GraphEditor"}]
\ No newline at end of file
diff --git a/release/vTerm.md b/release/vTerm.md
new file mode 100644
index 0000000..bce13b9
--- /dev/null
+++ b/release/vTerm.md
@@ -0,0 +1,24 @@
+# AntOS Virual Terminal
+
+Terminal emulator to connect to remote server using AntOS Tunnel plugin.
+
+Unlike wTerm that uses a dedicated websocket connection for each terminal to
+communicate with remote terminal session via the Antd **wterm** plugin,
+VTerm uses only one websocket connection for multiple terminal session
+thanks to the Antd **tunnel** plugin.
+
+
+VTerm depends on the server side **tunnel** plugin and the AntOS **Antunnel**
+client side package
+
+## Change logs
+- v0.1.20-fix bug with new xterm.js
+- v0.1.19-a Use the new xterm.js libraries v5.1.0
+- v0.1.18-a support AntOS v2.0.x
+- v0.1.17-a update dependencies to latest
+- v0.1.16-a fix incorrect control command
+- v0.1.15-a update dependencies to latest
+- v0.1.14-a: Change app icon
+- v0.1.12-a: Add copy/paste shortcuts (CTRL+SHIFT+C/ CTRL+SHIFT+V)
+- v0.1.9-a: Update dependencies to latest
+- v0.1.6-a: Add dependencies to package meta-data
\ No newline at end of file
diff --git a/release/vTerm.zip b/release/vTerm.zip
new file mode 100644
index 0000000..af5b392
Binary files /dev/null and b/release/vTerm.zip differ
diff --git a/release/vfsx.md b/release/vfsx.md
new file mode 100644
index 0000000..7af9f87
--- /dev/null
+++ b/release/vfsx.md
@@ -0,0 +1,10 @@
+# vfsx
+AntOS VFS handles for various file protocols which are not included by default
+int core release, such as:
+- GoogleDrive
+- Dropbox (TODO)
+
+This package is used mainly by the File application to communicate with different
+file hosting protocols
+
+## Change logs
diff --git a/release/vfsx.zip b/release/vfsx.zip
new file mode 100644
index 0000000..f2ae192
Binary files /dev/null and b/release/vfsx.zip differ
diff --git a/release/xTerm.md b/release/xTerm.md
new file mode 100644
index 0000000..0e4ffe8
--- /dev/null
+++ b/release/xTerm.md
@@ -0,0 +1,11 @@
+Xterm.js is a front-end component written in TypeScript that lets applications bring fully-featured terminals to their users in the browser. It’s used by popular projects such as VS Code, Hyper and Theia.
+
+Features
+* Terminal apps just work: Xterm.js works with most terminal apps such as bash, vim and tmux, this includes support for curses-based apps and mouse event support
+* Performant: Xterm.js is really fast, it even includes a GPU-accelerated renderer
+* Rich unicode support: Supports CJK, emojis and IMEs
+* Self-contained: Requires zero dependencies to work
+* Accessible: Screen reader support can be turned on using the screenReaderMode option
+* And much more: Links, theming, addons, well documented API, etc.
+
+Project Page: [https://xtermjs.org/](https://xtermjs.org/)
\ No newline at end of file
diff --git a/release/xTerm.zip b/release/xTerm.zip
new file mode 100644
index 0000000..2cf28f6
Binary files /dev/null and b/release/xTerm.zip differ
diff --git a/vTerm/build/release/vTerm.zip b/vTerm/build/release/vTerm.zip
index af5b392..f77be8a 100644
Binary files a/vTerm/build/release/vTerm.zip and b/vTerm/build/release/vTerm.zip differ
diff --git a/vfsx/build/release/vfsx.zip b/vfsx/build/release/vfsx.zip
index f2ae192..871737a 100644
Binary files a/vfsx/build/release/vfsx.zip and b/vfsx/build/release/vfsx.zip differ
diff --git a/xTerm/build/release/xTerm.zip b/xTerm/build/release/xTerm.zip
index 2cf28f6..66f50c1 100644
Binary files a/xTerm/build/release/xTerm.zip and b/xTerm/build/release/xTerm.zip differ