<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Neutralinojs GSoC final submission]]></title><description><![CDATA[Neutralinojs GSoC final submission]]></description><link>https://neutralinojs-gsoc.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6877d70413e741d867cf1201/ed2a7ed5-f484-4db1-851d-cee3cb97cef6.png</url><title>Neutralinojs GSoC final submission</title><link>https://neutralinojs-gsoc.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 06:51:28 GMT</lastBuildDate><atom:link href="https://neutralinojs-gsoc.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[GSoC 2026 Final Report: CLI Plugin for neu-builder with Neutralinojs]]></title><description><![CDATA[1. Introduction
Google Summer of Code 2026 has been one of my biggest experiences in open source so far.
This summer, I had the opportunity to work with Neutralinojs as a GSoC contributor and build ne]]></description><link>https://neutralinojs-gsoc.hashnode.dev/gsoc-2026-final-report-cli-plugin-for-neu-builder-with-neutralinojs</link><guid isPermaLink="true">https://neutralinojs-gsoc.hashnode.dev/gsoc-2026-final-report-cli-plugin-for-neu-builder-with-neutralinojs</guid><category><![CDATA[gsoc]]></category><category><![CDATA[Google]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Neutralinojs]]></category><dc:creator><![CDATA[Anirudh Lakhanpal]]></dc:creator><pubDate>Sun, 23 Aug 2026 07:30:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6877d70413e741d867cf1201/863ee8ad-e108-40f1-80de-4e0fed6fb1a2.svg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>1. Introduction</h2>
<p>Google Summer of Code 2026 has been one of my biggest experiences in open source so far.</p>
<p>This summer, I had the opportunity to work with <a href="https://neutralino.js.org/"><strong>Neutralinojs</strong></a> as a GSoC contributor and build <a href="https://github.com/neutralinojs-community/neutralinojs-builder">neutralinojs-builder</a>, a CLI plugin for generating platform-specific installers for Neutralinojs applications.</p>
<p>The goal of the project was to make the journey from building a Neutralinojs application to distributing it much simpler. Instead of developers having to manually work with different packaging tools and platform-specific formats, the builder provides a unified interface through the <code>neu</code> CLI.</p>
<p>This was a collaborative project, and I worked closely with <strong>Subhash</strong> and mentors throughout the development. We built <a href="https://www.npmjs.com/package/@neutralinojs-contrib/builder">@neutralinojs-contrib/builder</a> from scratch and divided the work across the different parts of the project.</p>
<p>The project was developed incrementally through multiple pull requests, with each part of the implementation reviewed and improved as we worked through the different stages of the project.</p>
<h2>2. My GSoC Journey</h2>
<p>I first came across Neutralinojs in mid-2025 while working on a college project where I needed to build a desktop user interface. While exploring different options, I discovered Neutralinojs and was really interested in how easily it allowed developers to build desktop applications using familiar web technologies like HTML, CSS, and JavaScript. The lightweight approach and simplicity of the framework immediately caught my attention, and I started exploring the project further.</p>
<p>As I became more familiar with the project, I started contributing as an early contributor and gradually became more involved with the Neutralinojs community. My experience with C++ and modern C++ also helped me a lot during this process. Since Neutralinojs has a native codebase, having a strong understanding of C++ made it much easier for me to navigate the codebase, understand how different components worked, and start contributing to the project.</p>
<p>Over time, I also got the opportunity to interact with the Neutralinojs mentors and community members through <a href="https://discord.gg/cybpp4guTJ">Discord</a>. These interactions helped me understand the project better, discuss ideas, get feedback on my contributions, and become more comfortable working within an open-source community. What initially started as discovering a framework for a college project gradually turned into a much deeper involvement with the project and eventually led me to work on <code>neutralinojs-builder</code> as part of Google Summer of Code 2026.</p>
<h2>3. Understanding the Problem</h2>
<p>Neutralinojs already provides the neu <code>build command</code>, which builds an application and produces the platform-specific binary along with its required resources. However, building an application is only one part of the process. Once the application is built, developers still need to package those files into something that can actually be distributed to users, such as a <code>.deb</code>, <code>.AppImage</code>, <code>.exe</code>, or <code>.dmg</code>.</p>
<p>The problem is that each platform has its own packaging workflow and tools. Linux requires tools such as dpkg-deb or appimagetool, Windows uses NSIS and makensis, while macOS requires creating an application bundle and generating a DMG. These workflows have different structures, configuration requirements, and failure cases, making the packaging process difficult to handle consistently and automate.</p>
<p>The solution was therefore designed as a plugin for the neu CLI rather than as part of its core. Packaging introduces platform-specific tools and dependencies, which would make the core CLI larger and more difficult to maintain. By keeping the functionality in a separate plugin, neutralinojs-builder can provide the required packaging capabilities while still integrating naturally with the existing Neutralinojs workflow.</p>
<h2>4. Project Goals</h2>
<p>The main goal of this project was to build <code>neutralinojs-builder</code>, a CLI plugin that simplifies packaging and distributing Neutralinojs applications across desktop platforms.</p>
<h3>Supported Packaging Targets</h3>
<table>
<thead>
<tr>
<th>Target</th>
<th>OS</th>
<th>Packaging Tool</th>
</tr>
</thead>
<tbody><tr>
<td><code>deb</code></td>
<td>Linux</td>
<td><code>dpkg-deb</code></td>
</tr>
<tr>
<td><code>appimage</code></td>
<td>Linux</td>
<td><code>appimagetool</code></td>
</tr>
<tr>
<td><code>nsis</code></td>
<td>Windows</td>
<td><code>makensis</code></td>
</tr>
<tr>
<td><code>dmg</code></td>
<td>macOS</td>
<td><code>hdiutil</code> / DMG tooling</td>
</tr>
</tbody></table>
<h3>Unified CLI Experience</h3>
<p>The builder integrates with the existing <code>neu</code> CLI as a plugin instead of introducing a separate packaging system.</p>
<p>Developers can use commands such as:</p>
<pre><code class="language-bash">neu builder deb
neu builder appimage --x64
neu builder nsis --x64
neu builder dmg
</code></pre>
<p>This provides a consistent interface while the builder handles the platform-specific packaging workflow internally.</p>
<h3>Centralized Configuration</h3>
<p>A key design goal was to use a <strong>single</strong> <code>neutralino.config.json</code> for the application.</p>
<p>The same configuration can provide:</p>
<ul>
<li><p>Application metadata</p>
</li>
<li><p>Packaging targets</p>
</li>
<li><p>Target architectures</p>
</li>
<li><p>Output configuration</p>
</li>
<li><p>Application icons</p>
</li>
<li><p>Platform-specific builder options</p>
</li>
</ul>
<p>This avoids requiring developers to maintain separate configuration files for each packaging format.</p>
<h3>Modular Architecture</h3>
<p>The builder was designed so that each packaging target remains independent while sharing common functionality.</p>
<p>The shared builder layer handles:</p>
<ul>
<li><p>Configuration resolution</p>
</li>
<li><p>Application staging</p>
</li>
<li><p>Dependency validation</p>
</li>
<li><p>Logging</p>
</li>
<li><p>Build orchestration</p>
</li>
</ul>
<p>Individual target implementations handle the platform-specific packaging logic, validation and assets management.</p>
<h2>5. Designing neutralinojs-builder</h2>
<p>Before implementing <code>neutralinojs-builder</code>, I first had to understand how the existing <code>neu</code> CLI works and how its plugin system integrates with it. The builder was designed as an extension of the existing CLI rather than a separate build system, so it needed to follow the same conventions for command registration, configuration handling, and execution.</p>
<p>I also looked at how <code>neu build</code> produces the application binary and resources. The builder does not replace this process; instead, it takes the output from <code>neu build</code> and uses it as the input for the packaging stage. The existing <code>neutralino.config.json</code> is also reused as the central configuration file, allowing the builder to work with the existing Neutralinojs workflow without introducing another configuration system.</p>
<p>After understanding how the existing <code>neu</code> CLI works, the next step was to design the architecture of <code>neutralinojs-builder</code>. The main idea was to keep the builder <strong>independent of any particular packaging format</strong>. Debian, AppImage, NSIS, and DMG all have very different packaging requirements, so putting all of their logic into one large module would make the project difficult to maintain and extend.</p>
<p>The architecture was therefore divided into a common builder layer and separate target implementations. The common layer is responsible for everything that is shared between packaging formats and controlling the overall build flow. Then the builder selects the appropriate target implementation and passes the prepared application to it.</p>
<p>The architecture can be understood as a simple pipeline:</p>
<img src="https://cdn.hashnode.com/uploads/covers/6877d70413e741d867cf1201/00952fe8-780c-4279-a068-81859bcfbb6e.png" alt="builder architecture" style="display:block;margin:0 auto" />

<p>The <strong>Configuration Resolver</strong> is responsible for determining what the user wants to build. It reads the builder configuration from <code>neutralino.config.json</code> and resolves the selected target and architecture from the CLI and configuration.</p>
<p>The <strong>Build / Staging</strong> layer prepares the application for packaging. It works with the output produced by <code>neu build</code> and collects the required application binary, resources, icons, metadata, and other assets. These files are arranged into the structure expected by the selected packaging format.</p>
<p>After staging, the <strong>Target Loader</strong> determines which packaging implementation needs to be executed.</p>
<h3>How the Builder Integrates with <code>neu</code></h3>
<p>The builder was designed as a plugin for the existing <code>neu</code> CLI rather than as an independent command-line tool. When <code>neutralinojs-builder</code> is installed as a plugin, the Neutralinojs CLI loads it through its plugin system and registers the builder command. This allows the builder to be invoked using the existing CLI, for example with neu builder deb, without requiring developers to learn a separate tool.</p>
<p>At a high level, the flow looks like this:</p>
<img src="https://cdn.hashnode.com/uploads/covers/6877d70413e741d867cf1201/91b38707-f089-4c76-8bf5-cd299253640e.png" alt="neuplugin" style="display:block;margin:0 auto" />

<p>The plugin itself is responsible for registering the <code>builder</code> command with neu. Once the command is invoked, the builder passes the requested target into its core build pipeline. The pipeline first resolves the application configuration, performs environment and dependency checks, prepares a temporary staging directory from the existing neu build output, and finally loads the implementation for the selected target.</p>
<p>The Target Loader keeps the packaging implementations separate from the common builder logic. For example, when <code>deb</code> is selected, the loader resolves <code>targets/deb/index.js</code> and invokes its <code>build()</code> function. The same mechanism is used for AppImage, NSIS, and DMG. This keeps the common workflow shared while allowing each packaging target to implement its own platform-specific requirements.</p>
<h3>Cross-platform Configuration</h3>
<p>Another important part of the design is that developers can configure the packaging targets through the existing neutralino.config.json. The builder reads the application metadata from the main configuration and uses the cli.builder section for target-specific packaging settings.</p>
<p>A simplified configuration for a cross-platform application looks like:</p>
<pre><code class="language-json">{
  "applicationId": "com.example.myapp",
  "applicationName": "My First Builder App",
  "version": "1.0.0",
  "defaultMode": "window",

  "cli": {
    "builder": {
      "windows": {
        "targets": [
          {
            "target": "nsis",
            "arch": [
              "x64",
              "ia32"
            ],
            "icon": "./installerassets/windows/nsis/app.ico",
            "sidebarImage": "./installerassets/windows/nsis/sidebar.bmp",
            "headerImage": "./installerassets/windows/nsis/header.bmp",
            "license": "./installerassets/LICENSE.txt",
            "output": "./dist/windows"
          }
        ]
      },
      "linux": {
        "targets": [
          {
            "target": "deb",
            "arch": [
              "x64",
              "ia32",
              "armhf"
            ],
            "icon": "./installerassets/linux/deb/app.png",
            "category": "Utility",
            "output": "./dist/linux",
            "maintainer": "GSoC",
            "preinst": "./installerassets/linux/deb/scripts/preinst", 
            "postinst": "./installerassets/linux/deb/scripts/postinst", 
            "prerm": "./installerassets/linux/deb/scripts/prerm", 
            "postrm": "./installerassets/linux/deb/scripts/postrm"
          },
          {
            "target": "appimage",
            "arch": [
              "x64",
              "arm64"
            ],
            "icon": "./installerassets/linux/appimage/app.png",
            "license": "./installerassets/LICENSE.txt",
            "output": "./dist/linux",
            "maintainer": "GSoC"
          }
        ]
      },
      "mac": {
        "targets": [
          {
            "target": "dmg",
            "arch": [
              "x64",
              "arm64",
              "universal"
            ],
            "icon": "./installerassets/mac/dmg/app.icns",
            "background": "./installerassets/mac/dmg/dmg-background.png",
            "output": "./dist/mac"
          }
        ]
      }
    }
  }
}
</code></pre>
<h2>6. Implementation / What I Built</h2>
<h3>Debian Packaging</h3>
<p>One of the major parts of my work on <code>neutralinojs-builder</code> was implementing the <strong>Debian packaging target</strong>. The goal was to take the output generated by <code>neu build</code> and turn it into a standard <code>.deb</code> package that can be installed on Debian-based Linux distributions such as Ubuntu.</p>
<p>The builder handles the required Debian package structure and metadata and then uses the Debian packaging tools to generate the final <code>.deb</code> file. I also worked on the supporting pieces around the package, including application staging, architecture handling, launcher generation, and Debian maintainer scripts. This allowed the generated package to behave like a normal Debian package rather than simply being a compressed copy of the application files.</p>
<p>After generating the package, I tested the complete installation workflow on Ubuntu. The following screenshots show the generated application being detected by Ubuntu's App Center and the package installation interface.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6877d70413e741d867cf1201/abf937be-229a-4878-92e7-6a71e63ece83.png" alt="Generated Debian package shown in Ubuntu App Center" style="display:block;margin:0 auto" />

<p><em>The generated</em> <code>.deb</code> <em>package is recognized by Ubuntu's App Center, where the application metadata, package size, description, and installation option are displayed.</em></p>
<img src="https://cdn.hashnode.com/uploads/covers/6877d70413e741d867cf1201/421a4679-efb5-4f2f-af43-ec0f22d0a4b8.png" alt="Screenshot_20260822_201223" style="display:block;margin:0 auto" />

<p><em>After installation, the packaged Neutralinojs application is available through the Ubuntu application launcher, demonstrating the complete flow from the Neutralinojs build output to an installable desktop application.</em></p>
<p>The Debian implementation was developed incrementally through multiple pull requests, covering the core packaging logic, staging improvements, launcher support, maintainer scripts, and packaging tests. The relevant pull requests are listed in the contributions section below.</p>
<h3>AppImage Packaging</h3>
<p>Another part of my work was implementing the <strong>AppImage packaging target</strong> for Linux. Unlike Debian packages, AppImage is designed to provide a more portable way of distributing Linux applications, where the application and its required files are bundled into a single executable <code>.AppImage</code> file.</p>
<p>The builder prepares the application using the same common staging workflow and then packages the staged application into an AppImage. The generated file can then be distributed directly to users without requiring a traditional package installation workflow.</p>
<p>After generating the AppImage, I tested it on Linux to verify that the package was created correctly and could be launched as an application. The following screenshot shows the generated <code>.AppImage</code> file in the output directory.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6877d70413e741d867cf1201/1e91bcb4-878d-4b04-a130-375f721d0793.png" alt="Generated AppImage package" style="display:block;margin:0 auto" />

<p><em>The generated</em> <code>.AppImage</code> <em>package is produced as a single executable file containing the Neutralinojs application and its required resources.</em></p>
<p>I also verified that the generated application could be recognized by the Linux desktop environment and launched like a regular desktop application. I also verified that the generated AppImage could be launched and integrated into the Linux desktop environment using AppImageLauncher.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6877d70413e741d867cf1201/35d55430-89b2-49cf-96b3-bf3d5339562e.png" alt="AppImage application in the Linux application launcher" style="display:block;margin:0 auto" />

<p><em>The packaged Neutralinojs application appears in the Linux application launcher, demonstrating that the generated AppImage can be integrated into the desktop environment and launched by the user.</em></p>
<p>This implementation builds on the shared builder architecture, allowing AppImage packaging to reuse the same configuration resolution and application staging logic while keeping the AppImage-specific packaging process isolated within its own target implementation.</p>
<h3>macOS DMG Packaging</h3>
<p>I also implemented the <strong>DMG packaging target</strong> for macOS. The goal was to take the output generated by <code>neu build</code> and package it into a standard macOS <code>.dmg</code> file containing the Neutralinojs application and the required application bundle structure.</p>
<p>The builder handles the creation of the macOS application bundle and packages it into a DMG that can be distributed to users. I also worked on integrating the application metadata, icon, and required resources into the generated package so that the resulting application behaves like a normal macOS application.</p>
<p>I tested the generated DMG on macOS to verify that the package could be opened and that the application could be copied to the system's <code>Applications</code> directory and launched successfully.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6877d70413e741d867cf1201/c924eb3f-0c0e-42b6-8350-d8724c81851e.png" alt="Screenshot_20260824_191234" style="display:block;margin:0 auto" />

<p><em>The generated</em> <code>.dmg</code> <em>file is shown alongside the packaged Neutralinojs application, demonstrating that the DMG was successfully created.</em></p>
<img src="https://cdn.hashnode.com/uploads/covers/6877d70413e741d867cf1201/43c57904-0526-427d-829a-c6b1f11d3be5.png" alt="Packaged Neutralinojs application in app finder" style="display:block;margin:0 auto" />

<p><em>The Neutralinojs application is installed and can be executed on macOS from the app finder, demonstrating that the generated DMG works correctly from packaging through application launch and appears correctly in the applications section under the macos app finder</em></p>
<h2>7. My Contributions and Pull Requests</h2>
<table>
<thead>
<tr>
<th>PR</th>
<th>Pull Request</th>
<th>Description</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/2">PR #2</a></td>
<td>Added the initial README and updated filenames to lowercase.</td>
</tr>
<tr>
<td>2</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/3">PR #3</a></td>
<td>Added basic CLI argument and configuration file parsing.</td>
</tr>
<tr>
<td>3</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/6">PR #6</a></td>
<td>Added the initial test suite for the builder.</td>
</tr>
<tr>
<td>4</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/8">PR #8</a></td>
<td>Added dependency pre-checking for packaging tools.</td>
</tr>
<tr>
<td>5</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/10">PR #10</a></td>
<td>Added support for additional packaging options and assets.</td>
</tr>
<tr>
<td>6</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/12">PR #12</a></td>
<td>Refactored the staging manager and added tests.</td>
</tr>
<tr>
<td>7</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/13">PR #13</a></td>
<td>Implemented the core Debian packaging using <code>deboa</code>.</td>
</tr>
<tr>
<td>8</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/17">PR #17</a></td>
<td>Added a Debian launcher script to simulate a symlink.</td>
</tr>
<tr>
<td>9</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/20">PR #20</a></td>
<td>Added Debian packaging maintainer scripts.</td>
</tr>
<tr>
<td>10</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/21">PR #21</a></td>
<td>Added support for detecting SEA builds without <code>resources.neu</code>.</td>
</tr>
<tr>
<td>11</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/26">PR #26</a></td>
<td>Added Debian packaging tests and removed an unused file.</td>
</tr>
<tr>
<td>12</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/28">PR #28</a></td>
<td>Updated <code>publish.yml</code> to mirror the CLI release workflow.</td>
</tr>
<tr>
<td>13</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/33">PR #33</a></td>
<td>Adds the support for <code>.AppImage</code> generation into the <code>neu-builder</code>.</td>
</tr>
<tr>
<td>14</td>
<td><a href="https://github.com/neutralinojs-community/neutralinojs-builder/pull/34">PR #34</a></td>
<td>Introduces some refactoring and minor fixes in CLI parsing and SEA detection below is the summary of changes.</td>
</tr>
</tbody></table>
<h3>Project Links</h3>
<ul>
<li><p><a href="https://github.com/neutralinojs-community/neutralinojs-builder">neutralinojs-builder</a></p>
</li>
<li><p><a href="https://www.npmjs.com/package/@neutralinojs-contrib/builder">npm package</a></p>
</li>
<li><p><a href="https://github.com/neutralinojs/neutralinojs">Neutralinojs repository</a></p>
</li>
<li><p><a href="https://github.com/neutralinojs/neutralinojs-cli">Neutralinojs CLI repository</a></p>
</li>
<li><p><a href="https://summerofcode.withgoogle.com/programs/2026/organizations/neutralinojs">GSoC 2026 Project Page</a></p>
</li>
<li><p><a href="https://github.com/SharonIV0x86">My Github</a></p>
</li>
<li><p><a href="https://github.com/SharonIV0x86/neutralinojs-builder">My fork of neutralinojs-builder</a></p>
</li>
</ul>
<h2>8. Challenges and Lessons Learned</h2>
<p>One of the main challenges while implementing Debian packaging was finding a <strong>cross-platform solution</strong> that could generate <code>.deb</code> packages from different operating systems. We explored different approaches but could not find a suitable solution that met our requirements. After some investigation, my mentor suggested using <strong>deboa</strong>. However, deboa was not very well documented, so I had to manually inspect its source code to understand how its API handled package metadata and maintainer scripts such as <code>preinst</code>, <code>postinst</code>, licensing, and maintainer information.</p>
<p>We also had to evaluate the trade-offs between using <strong>deboa</strong> and the native <code>dpkg-deb</code> approach. I created a detailed comparison report covering both approaches and the reasons for choosing one over the other, which I will link here: <a href="https://github.com/SharonIV0x86/deb-packaging-comparison">deboa vs dpkg-deb detailed comparison</a>.</p>
<p>For AppImage, the main challenge was investigating whether a truly cross-platform packaging solution was possible. We found that the AppImage runtime is Linux-native, meaning the final AppImage packaging process cannot simply be executed directly on Windows or macOS without a Linux environment or additional tooling such as Docker. This became an important consideration when designing the cross-platform packaging workflow.</p>
<h2>9. Current State and Future Work</h2>
<p>At the end of the GSoC period, all four planned packaging targets, <strong>Debian, AppImage, NSIS, and DMG</strong> have been implemented, with tests written for each target. A working version of <code>neutralinojs-builder</code> has been completed and the package has been released to the npm marketplace, making it available for Neutralinojs developers to use.</p>
<p>The current implementation will continue to be improved incrementally based on <strong>community feedback and real-world usage</strong>. One of the main areas that still needs further work is finding a truly <strong>cross-platform approach for AppImage generation</strong>. Currently, AppImage packaging requires a Linux environment because the AppImage runtime and packaging workflow are Linux-native, which limits the ability to generate AppImages directly from Windows or macOS.</p>
<p>Going forward, the builder can also be expanded with <strong>more packaging features and developer configuration options</strong>. The goal is to continue improving the developer experience while making the existing targets more flexible and easier to configure.</p>
<p>I hope to continue contributing to Neutralinojs, eventually become a core maintainer of the project and <code>neutralinojs-builder</code>, and hopefully return as a GSoC mentor in the future.</p>
<h2>10. Acknowledgements</h2>
<p>GSoC 2026 has been a really meaningful experience for me, and I am thankful to everyone who made this journey possible.</p>
<p>I would first like to thank <strong>Google</strong> for creating GSoC and giving students the opportunity to work on real open-source projects alongside experienced contributors. This experience gave me the chance to work on a project that went beyond a college assignment and taught me how software is designed, reviewed, and developed in a real open-source environment.</p>
<p>I am especially grateful to my mentors <a href="https://shalithasuranga.medium.com/"><strong>Shalitha Suranga</strong></a>, <strong>Athif Shaffy</strong>, and <strong>Sajath Ahamed</strong> for their guidance, reviews, suggestions. Their feedback helped me improve not only the implementation of <code>neutralinojs-builder</code>, but also the way I approach problems and contribute to an existing codebase.</p>
<p>I would also like to thank <strong>Subhash</strong>, my collaborator on the project, for working alongside me throughout the development of <code>neutralinojs-builder</code>.</p>
]]></content:encoded></item></channel></rss>