<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Arpit Mohan</title>
    <description>The latest articles on Forem by Arpit Mohan (@mohanarpit).</description>
    <link>https://forem.com/mohanarpit</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F30326%2Fe08660f4-cb0a-4b18-84e5-e8f68d02a46c.jpeg</url>
      <title>Forem: Arpit Mohan</title>
      <link>https://forem.com/mohanarpit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/mohanarpit"/>
    <language>en</language>
    <item>
      <title>Appsmith's Deployment Architecture</title>
      <dc:creator>Arpit Mohan</dc:creator>
      <pubDate>Wed, 14 Jun 2023 16:01:57 +0000</pubDate>
      <link>https://forem.com/mohanarpit/appsmiths-deployment-architecture-50c7</link>
      <guid>https://forem.com/mohanarpit/appsmiths-deployment-architecture-50c7</guid>
      <description>&lt;p&gt;Appsmith is a turnkey solution to building internal apps in the cloud. It’s a &lt;a href="https://www.appsmith.com/use-cases"&gt;complete workbench&lt;/a&gt; for building graphical interfaces and tools that connect to your existing data sources, and it &lt;a href="https://www.appsmith.com/integration"&gt;integrates with popular third-party services&lt;/a&gt; for communication, collaboration, and commerce. Appsmith is also the community behind this project, comprising the company that invests in and guides the overarching development of the platform, the open-source contributors who help us ideate and implement, and our end users. &lt;/p&gt;

&lt;p&gt;This article serves as an introduction to the Appsmith platform for technical readers who want to get to know how Appsmith works under the hood by examining the architecture behind our deployment binary and the problems this architecture choice solves. Whether you're looking to contribute to the Appsmith platform, wanting to build with it, or just interested in the technical considerations you might need to make for your own projects, this article will give you a solid understanding of the platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Appsmith’s open-source philosophy and modular architecture
&lt;/h2&gt;

&lt;p&gt;One of the major contributing factors to the structure of our codebase is the open-source nature of Appsmith. We think that open source is the best way to make software that naturally evolves to meet its community's needs for three primary reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code quality&lt;/strong&gt;: With more eyes on the code, the quality is greatly improved. Developers are encouraged to be more conscientious about their code, and mistakes that do make it into the repository can be spotted by others and fixed before they enter production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A strong ecosystem&lt;/strong&gt;: Community suggestions and contributions mean that our platform is always on the leading edge, responding to ever-evolving user requirements for functionality and integration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Longevity&lt;/strong&gt;: For the two reasons above, open-source projects are also durable — the platform and ecosystem surrounding them are public property to which access cannot be revoked, making them a safe investment for organizations to base their toolchains and workflows on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A project as complex as Appsmith must make architectural considerations to ensure that the project can be contained within a single manageable codebase. Teams and contributors need to be able to work on different features without stepping on each other's toes, especially when they are spread across the globe. &lt;/p&gt;

&lt;p&gt;To address this, our codebase is well documented and heavily modular, with a strict hierarchy of directories and ownership, all contained within a single monolithic repository. This concept is reflected in our deployment architecture — a single container comprising all of the moving parts to make Appsmith work.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does Appsmith’s deployment architecture look like?
&lt;/h2&gt;

&lt;p&gt;Appsmith is based on industry-standard technologies to provide front-end and back-end functionality organized in a single codebase. We deploy as a single Docker container which encapsulates:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The Appsmith Java back-end process&lt;/li&gt;
&lt;li&gt;The NGINX server&lt;/li&gt;
&lt;li&gt;The real-time service (RTS)&lt;/li&gt;
&lt;li&gt;The MongoDB server&lt;/li&gt;
&lt;li&gt;The Redis server&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/lpvian6u6i39/3yQAGwqhkcSOQc32GnA4ha/bb7f33604f6e5e8dabed7125f4a50661/imageone.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/lpvian6u6i39/3yQAGwqhkcSOQc32GnA4ha/bb7f33604f6e5e8dabed7125f4a50661/imageone.png" alt="imageone"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Appsmith’s components and architecture&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We call this the “modular monolithic” architecture. A single Docker container powers the whole application, making it easy to install. All dependencies inside the container are under our control, which makes updates easy to implement for developers and more reliable for end users.&lt;/p&gt;
&lt;h2&gt;
  
  
  The deployment challenges this architecture choice solves
&lt;/h2&gt;

&lt;p&gt;Appsmith wasn't always shipped as a single binary. Originally we shipped each component individually — one for the Java backend process, one for NGINX, one for MongoDB, etc. — totalling five Docker containers that you had to install to get up and running. &lt;/p&gt;

&lt;p&gt;This lead to several problems for the end user, which then became problems for our developers to solve:&lt;/p&gt;
&lt;h3&gt;
  
  
  Problem #1: Complexity
&lt;/h3&gt;

&lt;p&gt;Running a separate container for each piece of technology that underpins Appsmith made sense initially: each was a standalone program, so it followed that it should have its own container. This made deployments complex: the Java back end needed to talk to MongoDB and Redis, NGINX needed to talk to the back end, and the RTS needed to talk to the backend and NGINX. Installation wasn't just a matter of deploying containers; they all needed to be configured to communicate with each other.&lt;/p&gt;

&lt;p&gt;With this multi-container architecture, our early users only had a 30% success rate on their installations. This deployment mess would also only grow with time if we decided to swap out or add components to the Appsmith platform.&lt;/p&gt;
&lt;h3&gt;
  
  
  Problem #2: Compatibility and upgrades
&lt;/h3&gt;

&lt;p&gt;Running on outdated dependencies would be to the detriment of Appsmith — we want to be compatible with the latest databases and leverage the performance and functionality gains from the open-source projects we’ve built on. With a multi-container deployment architecture, every time we updated one of our components (for example, moving to the next major release of MongoDB), our users would have to manually update their &lt;code&gt;docker-compose.yml&lt;/code&gt; file, redeploy, and hope that nothing breaks. If we updated all of our components, this would mean upgrading five containers.&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/lpvian6u6i39/18rayGXKXo1yeMXZT2qoSo/c1e82cfb1078f0a05d87558220911ea8/imagetwo.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/lpvian6u6i39/18rayGXKXo1yeMXZT2qoSo/c1e82cfb1078f0a05d87558220911ea8/imagetwo.png" alt="imagetwo"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Keeping multi-container deployments up and running can be an annoying task&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It was unrealistic to document the changes users would have to make to their Docker configuration and expect them to follow through with them to remain up to date. We could see immediately that it would result in many users never updating and some even spending that effort migrating to a platform with a more reliable and predictable upgrade experience instead.&lt;/p&gt;
&lt;h3&gt;
  
  
  Problem #3: Bash scripts are unintuitive
&lt;/h3&gt;

&lt;p&gt;In an attempt to smooth out the multi-container deployment and upgrade process, we wrote a shell script, unimaginatively called &lt;code&gt;install.sh&lt;/code&gt;. It would ask you a sequence of questions about your environment and generate a &lt;code&gt;docker-compose.yml&lt;/code&gt; file. Running this file would configure the multiple Docker containers required to run Appsmith and set up all of the connections between them for you.&lt;/p&gt;

&lt;p&gt;While &lt;code&gt;install.sh&lt;/code&gt; worked on a technical level and was an elegant piece of scripting, it did not work on a user-experience level.&lt;/p&gt;

&lt;p&gt;Bash scripts for deployment do not inspire confidence. Users rightfully see them as a risk, and they give the impression of being a “hacky” solution — no matter how elegant they are. There is also the risk that inconsistencies in user environments could lead to unintended side effects from a Bash script (not everyone reads through them before running them). Something as simple as a user storing files at an unexpected path could result in accidental overwrite or deletion.&lt;/p&gt;

&lt;p&gt;The other issue we foresaw with Bash scripts, especially as our user base grew, was a lack of control. Updates or changes to a user's system could require manual maintenance to keep Appsmith’s containers properly configured and communicating. This, again, would only become a bigger mess as time went on and we upgraded or replaced different Appsmith modules (for example, upgrading the version of MongoDB or swapping Redis for a different ephemeral data store). It would be almost impossible to keep our Bash script updated for every encountered deployment scenario and allow for consistent updates from different prior releases.&lt;/p&gt;

&lt;p&gt;Collectively, these problems were a significant barrier to entry for any user looking at Appsmith. A solution was decided on — consolidating to a single container that was easy to install, easy to upgrade, and not reliant on free-roaming scripts being run on the user’s system.&lt;/p&gt;
&lt;h2&gt;
  
  
  The decision to implement a single-container architecture, and how we did it
&lt;/h2&gt;

&lt;p&gt;Our decision to deploy a ”fat binary” — a single Docker container comprising all of the Appsmith code and dependencies — comes from both the need to meet our users’ expectations for a smooth deployment experience and our own frustrations with overly-simplistic hosting paradigms, which, ironically, are often implemented to replace similarly frustrating complicated setup processes.&lt;/p&gt;

&lt;p&gt;Over-simplified installation processes do not allow for user choice around privacy, security, and performance. Users need to be able to specify how and where data is stored, choose what information is made available to other systems, and make decisions about the performance (and resulting costs) incurred by their infrastructure. Removing these choices in favor of a quick start is not a workable trade-off — there needs to be a balance that offers users a streamlined installation experience, with the option for granular configuration.&lt;/p&gt;

&lt;p&gt;It’s apparent from user feedback that our current solution achieves this, but it does fly against convention, so we had to make sure our decision to implement it was fully informed, justified, and tested.&lt;/p&gt;
&lt;h3&gt;
  
  
  Reconsidering Docker conventions
&lt;/h3&gt;

&lt;p&gt;When containerizing an application using Docker, it is generally considered best practice that each process needed for the application be run as a separate container, then connected to others as required. As discussed, this would currently require five total containers for Appsmith and its dependencies to run.&lt;/p&gt;

&lt;p&gt;Our single-container solution breaks this convention. While the prevalent perception is that Docker works best when running and managing one single process, we found that the advantages of delivering all of our code in a single container outweighed any potential disadvantages. This decision was not taken lightly. We did not want to compromise the performance or stability of the platform in production, so we fully researched and tested the implications of deploying to a single container, adopting the credo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;You can break the rules as long as you know why they were made.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you fully understand why a rule or best practice exists, your justification for breaking it is fully informed. Every problem is different, and blanket rules shouldn’t prevent a practical, reliable, and secure solution. &lt;/p&gt;

&lt;p&gt;Our goal was to abstract work away from users who had no requirement for extra customization, like hosting their own databases and services to support their Appsmith deployments. We broke the rule because, after considering the &lt;a href="https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#decouple-applications"&gt;reasons for the rule&lt;/a&gt;, we found that they didn't apply to our use case. Unlike the majority of Docker usage scenarios we do not need to scale and monitor services independently or segregate services for security, so we decided the fat container approach was appropriate. Additionally, &lt;a href="https://docs.gitlab.com/ee/install/docker.html"&gt;GitLab does the same thing&lt;/a&gt; and we thought,_ if it's good enough for GitLab, it's good enough for us!_&lt;/p&gt;

&lt;p&gt;This meant that instead of using Docker to isolate processes, we used it to isolate the whole application, repurposing Docker to provide a single executable binary for end-user convenience rather than process isolation for DevOps purposes.&lt;/p&gt;
&lt;h3&gt;
  
  
  Maintaining attention to detail
&lt;/h3&gt;

&lt;p&gt;This design doesn’t exclude users who do want to host their own MongoDB, Redis, or other services and connect Appsmith to them. The Appsmith container is smart enough to recognize when an external MongoDB or Redis server is configured and doesn’t start either process inside the Appsmith Docker container.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;We are developers first, building a developer-first experience at Appsmith.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;-- Quote from the Appsmith development team&lt;/p&gt;

&lt;p&gt;This “smart” behavior is a result of our attention to detail. We want users to delight in the small quality-of-life features we have included in Appsmith — features that we’ve added to address our own day-to-day inconveniences and that we know will be appreciated by other developers. We didn’t want an architecture that would limit the ways that we could extend the platform in the future, whether at its foundations (affecting deployment) or higher up (affecting the end-user experience).&lt;/p&gt;

&lt;p&gt;An example of one of these quality-of-life features that affects both those deploying and maintaining Appsmith and those using it is our implementation of SSL. When you configure a custom domain for your instance, Appsmith will attempt to provision an SSL certificate from Let’s Encrypt. If it succeeds, the instance will start with HTTPS enabled on the web server, and redirect all requests with &lt;code&gt;http://&lt;/code&gt; URLs to &lt;code&gt;https://&lt;/code&gt;. If the Let's Encrypt provisioning fails, the instance starts with plain HTTP, without displaying worrying errors or browser warnings that users may be encouraged to ignore, setting dangerous precedents.&lt;/p&gt;

&lt;p&gt;Again, in keeping with our philosophy of making setup as simple as possible but still giving advanced users full control of their infrastructure, it is also possible to &lt;a href="https://docs.appsmith.com/getting-started/setup/instance-configuration/custom-domain#configure-custom-ssl"&gt;supply your own custom SSL certificates&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.appsmith.com/getting-started/setup/instance-management/appsmithctl"&gt;Appsmithctl&lt;/a&gt; is another example of our user-centric features. It provides a convenient interface for managing and maintaining your Appsmith instance and allows you to back up all of your Appsmith data with a single command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose exec appsmith appsmithctl backup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Regular backups are the most important practice for ensuring continuity for any organization that relies on their digital assets, so we wanted to make sure a programmatic way to do this was available out of the box.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implementing process management in the Appsmith container
&lt;/h3&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/lpvian6u6i39/61DXLZdN9vlSOjPVCBvzVO/6faf3fe4243a20d100e65270684abd9d/imagethree.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/lpvian6u6i39/61DXLZdN9vlSOjPVCBvzVO/6faf3fe4243a20d100e65270684abd9d/imagethree.png" alt="imagethree"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Supervisor’s web and CLI interfaces&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Moving everything into a single Docker container means we can't use Docker to monitor the status of each component. Instead, we use &lt;a href="http://supervisord.org/"&gt;Supervisor&lt;/a&gt;, a popular, lightweight process manager. This has proven effective — when given a list of things to run, it will run them, start them again if they crash, and collect their logs in case further troubleshooting is required.&lt;/p&gt;

&lt;p&gt;Supervisor comes with a web interface with a graphical view of all the processes it’s managing. &lt;a href="https://docs.appsmith.com/getting-started/setup/instance-management/supervisor"&gt;We expose this interface&lt;/a&gt;, so you can see what processes Appsmith has launched internally, monitor performance and resource usage, and even restart services manually if something gets stuck.&lt;/p&gt;

&lt;p&gt;All of the features exposed through the Supervisor web interface are also available on the command line from outside of the container. For example, the following command will list the status of each running process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose exec appsmith supervisorctl status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows for programmatic access, useful for advanced users who may want to further orchestrate and automate the running of their Appsmith instances.&lt;/p&gt;

&lt;p&gt;Process management with Supervisor works as follows: When the Appsmith container starts, the processes that need to start with it are identified. If external MongoDB or Redis databases are configured, those services inside the container will not start. The Java backend process, the Node.js RTS, and NGINX will always start. For each of these identified processes, the container's entry-point script — invoked by Docker when the container is started — generates a set of Supervisor configuration files containing only the services that need to run. The configuration for each service contains any environment variables required, the command to launch the service executable, and logging details.&lt;/p&gt;

&lt;p&gt;Again, this illustrates how the move to a single container has not impacted user choice or control over the different components of Appsmith; it just abstracts decision-making away from the majority of users, who just want to start using the platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  The effects on deployment for end users
&lt;/h2&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/lpvian6u6i39/713USgEK4VlazbcgoWjBS9/7b8af4ec2785086689b0f919708caa38/imagefour.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/lpvian6u6i39/713USgEK4VlazbcgoWjBS9/7b8af4ec2785086689b0f919708caa38/imagefour.png" alt="imagefour"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A single container makes deployment fast and hassle-free&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The proof is in the numbers: the abysmal 30% installation success rate for our multi-container deployment architecture has gone up to a 99% success rate with single-container Appsmith deployments.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Appsmith is now a single Docker container that &lt;a href="https://docs.appsmith.com/getting-started/setup/installation-guides/docker"&gt;installs with a single command&lt;/a&gt; (or a single click, if you're &lt;a href="https://docs.appsmith.com/getting-started/setup/installation-guides"&gt;deploying to the cloud&lt;/a&gt;). Hosting and management complexities are largely hidden, so that you can focus on building your own apps, not trying to fix ours.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;_We loved that we could deploy Appsmith on our local instance and build an app. For us, it was an important concern because it would involve our production database credentials, which we were unwilling to share.&lt;/p&gt;

&lt;p&gt;It’s so easy for anyone to set up in the first place. It simply went directly to the AWS marketplace, selected their pre-existing supported AMI, and spun up an EC2. Instantly it was up and running._&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;-- Feedback from user&lt;/p&gt;

&lt;h3&gt;
  
  
  Seamless updates
&lt;/h3&gt;

&lt;p&gt;Updates are now seamless as well. &lt;a href="https://docs.appsmith.com/getting-started/setup/instance-management/maintenance-window"&gt;Optional automatic updates&lt;/a&gt; can be enabled and will be installed during a specified maintenance window. Recently we upgraded to MongoDB v5 within our deployment container — and it was seamless for our end users. &lt;/p&gt;

&lt;p&gt;We can now update all of the components in Appsmith, and even add new microservices, with full confidence that we won't break anything on our users’ systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kubernetes support
&lt;/h3&gt;

&lt;p&gt;The single-container approach has also made &lt;a href="https://docs.appsmith.com/getting-started/setup/installation-guides/kubernetes"&gt;supporting Appsmith on Kubernetes&lt;/a&gt; much easier. This was a highly-demanded feature in our community, and the reasoning resonated with us well enough that we prioritized Kubernetes support.&lt;/p&gt;

&lt;p&gt;One of the primary reasons for using Kubernetes (scalability aside) is rolling deployments. Containers can be dynamically upgraded, or deprovisioned and reprovisioned with updated code, with enough containers always online to meet current demand, resulting in zero downtime. &lt;/p&gt;

&lt;p&gt;An Appsmith upgrade can take up to 20 seconds  — fine for most users, but too long in high-availability scenarios — and can still fail in edge cases. With Kubernetes, nodes that fail to upgrade or become unresponsive are simply not used, and can be deprovisioned or troubleshooted. The single-container approach we have chosen makes managing an Appsmith Kubernetes cluster far easier than it would be if all of the components were hosted in separate containers, giving our users additional reliability through redundancy.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Appsmith strives to earn and maintain community trust
&lt;/h2&gt;

&lt;p&gt;All of the above work is towards one goal — an easy to deploy, production-ready internal app studio that lets developers focus on their business logic and get on with their jobs. This requires a community providing their requirements and ideas, and that requires trust. At Appsmith we’ve worked hard to earn this trust with our users and open-source community. As demonstrated by our architecture decisions, we maintain this trust by ensuring we pay full attention to our core responsibilities and our communities needs:&lt;/p&gt;

&lt;h3&gt;
  
  
  Security and openness
&lt;/h3&gt;

&lt;p&gt;To ensure the security of your vital data, Appsmith can be hosted wherever you are comfortable hosting it — from the public cloud to your own VPC, or on-site. Our monolithic container lends itself to this perfectly.&lt;/p&gt;

&lt;p&gt;Because we are open source, our code can be vetted by anyone, and we are &lt;a href="https://docs.appsmith.com/product/security"&gt;transparent about our security practices&lt;/a&gt; so that our users are informed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance and simplicity
&lt;/h3&gt;

&lt;p&gt;You don't have to run Appsmith on professional infrastructure. You can test and run it with full confidence in any supported Docker environment. Our team members use Appsmith hosted on our laptops, home servers, affordable cloud hosts, and even high-redundancy clusters. Wherever you are deploying Appsmith, we make sure that the process is as simple as possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reliability and control
&lt;/h3&gt;

&lt;p&gt;Our open-source code is of high quality and is contributed to and reviewed by both our internal teams and community volunteers. We keep you in control of your Appsmith deployments, so that you can decide exactly where you want your data stored and whether you want automatic updates to run. This means you're never caught by surprise by unexpected changes or the loss of data stored in-container. &lt;strong&gt;We take user control and choice seriously.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Appsmith: a rock-solid platform that we can all build on
&lt;/h2&gt;

&lt;p&gt;When building an application, finding the balance between practices that benefit the developers and the end users can be difficult. Developers' decisions about the architecture and underlying technologies of an application can either expand or restrict the eventual feature possibilities of a platform.&lt;/p&gt;

&lt;p&gt;This extends to deployment. Deploying Appsmith as a collection of connected microservices hosted in separate Docker containers, while beneficial during development and debugging, did not make for a pleasant or reliable experience for users running our tested application releases. Our move to a modular monolithic architecture and the further decision to deploy Appsmith as a single Docker container have improved both our developer and our end-user experience.&lt;/p&gt;

&lt;p&gt;If you're a developer interested in contributing to the Appsmith open-source project, our &lt;a href="https://github.com/appsmithorg/appsmith/blob/release/contributions/CodeContributionsGuidelines.md"&gt;contribution guidelines&lt;/a&gt; will get you started, and you can join us on &lt;a href="https://discord.com/invite/rBTTVJp"&gt;Discord&lt;/a&gt;. If you build internal apps and are interested in what Appsmith can do to streamline your own development process, our &lt;a href="https://www.appsmith.com/blog?cat=Tutorial"&gt;tutorials&lt;/a&gt; and &lt;a href="https://docs.appsmith.com/"&gt;user documentation&lt;/a&gt; will get you started.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>opensource</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Appsmith Hacktoberfest Week 1 Update</title>
      <dc:creator>Arpit Mohan</dc:creator>
      <pubDate>Tue, 06 Oct 2020 04:57:14 +0000</pubDate>
      <link>https://forem.com/appsmith/appsmith-hacktoberfest-week-1-update-d9b</link>
      <guid>https://forem.com/appsmith/appsmith-hacktoberfest-week-1-update-d9b</guid>
      <description>&lt;p&gt;It's been a busy week at &lt;a href="https://github.com/appsmithorg/appsmith"&gt;Appsmith&lt;/a&gt;, thanks to Hacktoberfest. There's no better way to end this week than by thanking all the developers who chose to contribute to Appsmith during this period. We are a small team of developers and this ❤️ means a lot to us.&lt;/p&gt;

&lt;p&gt;Over the week, we've merged in 16 Pull Requests from contributors. That's insane! &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you'd like to get in on the action, Appsmith is running a special challenge during the month of October where you not only get swag for contributing a valid PR but also a &lt;strong&gt;customized mechanical keyboard;&lt;/strong&gt; for inviting other users to contribute to our repository. &lt;/p&gt;

&lt;p&gt;Check out details of the &lt;a href="https://github.com/appsmithorg/appsmith/discussions/863"&gt;Appsmith Challenge here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here are the contributors (in no particular order) that I'd like to mention &amp;amp; thank.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith/pulls?q=is%3Apr+author%3Aari-hacks"&gt;Ari-Hacks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith/pulls?q=is%3Apr+author%3Ajack1142"&gt;Jack1142&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith/pulls?q=is%3Apr+author%3Awasabigeek"&gt;WasabiGeek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith/pulls?q=is%3Apr+author%3AJain-Sanchit"&gt;Sanchit Jain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith/pulls?q=is%3Apr+author%3AOmkarPh"&gt;Omkar Phansopkar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith/pulls?q=is%3Apr+author%3Aavats-dev"&gt;Aditya Vats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith/pulls?q=is%3Apr+author%3ASaket2"&gt;Saket2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith/pulls?q=is%3Apr+author%3Adaniloff200"&gt;Dimitry Danilov&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith/pulls?q=is%3Apr+author%3Aneok"&gt;Petro Popelyshko&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith/pulls?q=is%3Apr+author%3AMartinTuroci"&gt;Martin Turoci&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith/pulls?q=is%3Apr+author%3Apc9795"&gt;Prashant Choubey&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, a lot of folks improved our &lt;a href="https://docs.appsmith.com"&gt;documentation&lt;/a&gt;. We've merged 20 PRs just for our docs. Some of the top contributors to our documentation are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith-docs/pulls?q=is%3Apr+author%3AStTronn"&gt;Rishav&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith-docs/pulls?q=is%3Apr+author%3ASaket2"&gt;Saket2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith-docs/pulls?q=is%3Apr+author%3Adeepakchethan"&gt;Deepak Chetan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith-docs/pulls?q=is%3Apr+author%3ASamriddhiMishra"&gt;Samriddhi Mishra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith-docs/pulls?q=is%3Apr+author%3Avisibleajay"&gt;Ajay Kumar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith-docs/pulls?q=is%3Apr+author%3Autkarshbajaj"&gt;Utkarsh Bajaj&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith-docs/pulls?q=is%3Apr+author%3AHard-Coder05"&gt;Siddharth Mishra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith-docs/pulls?q=is%3Apr+author%3ATanisha07"&gt;Tanisha07&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmith-docs/pulls?q=is%3Apr+author%3Aravijyoti3"&gt;Ravi Jyoti&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you everyone for being a part of this project. Look forward to more pull requests &amp;amp; contributions.&lt;/p&gt;

&lt;p&gt;Happy Hacking!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PS: Join our &lt;a href="https://discord.gg/rBTTVJp"&gt;Discord channel&lt;/a&gt; and participate in the &lt;a href="https://github.com/appsmithorg/appsmith/discussions/863"&gt;Appsmith Challenge&lt;/a&gt; and become a part of a welcoming community.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Hacktoberfest Kickoff Event</title>
      <dc:creator>Arpit Mohan</dc:creator>
      <pubDate>Thu, 01 Oct 2020 10:28:03 +0000</pubDate>
      <link>https://forem.com/mohanarpit/hacktoberfest-kickoff-event-1kib</link>
      <guid>https://forem.com/mohanarpit/hacktoberfest-kickoff-event-1kib</guid>
      <description>&lt;p&gt;&lt;a href="//hacktoberfest.digitalocean.com/"&gt;Hacktoberfest&lt;/a&gt; is a month-long celebration of open source software. As developers, we stand on the shoulders of giants. Each year, in the month of October, as a community, we pledge to feed this giant.&lt;/p&gt;

&lt;p&gt;Contributing to open source projects is fun and rewarding. At times, it can even be daunting to get started. Lots of people believe that only code that implements large features matter. That's not the truth. No contribution is too small — bug fixes and documentation updates are valid ways of participating.&lt;/p&gt;

&lt;p&gt;I'm doing a &lt;a href="https://www.eventbrite.com/e/appsmith-hacktoberfest-kickoff-tickets-123319849991"&gt;livestream&lt;/a&gt; on Appsmith's &lt;a href="https://discord.gg/rBTTVJp"&gt;Discord channel&lt;/a&gt; today at &lt;strong&gt;8:30 AM PST / 9 PM IST&lt;/strong&gt; to help you get started and show you how to open your 1st PR. This 30 minute stream is a tutorial for new and seasoned developers.&lt;/p&gt;

&lt;p&gt;The agenda for the livestream will be:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How to find the right projects to contribute to&lt;/li&gt;
&lt;li&gt;How to open PRs&lt;/li&gt;
&lt;li&gt;How to communicate to ensure your PRs get accepted&lt;/li&gt;
&lt;li&gt;Best practices when contributing to open source&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As the lead maintainer of &lt;a href="https://github.com/appsmithorg/appsmith"&gt;Appsmith&lt;/a&gt;, I'll use our repository as an example of how to contribute.&lt;/p&gt;

&lt;p&gt;Register for the &lt;a href="https://www.eventbrite.com/e/appsmith-hacktoberfest-kickoff-tickets-123319849991"&gt;event here&lt;/a&gt;. See you on the stream!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shameless plug&lt;/strong&gt;: &lt;a href="https://github.com/appsmithorg/appsmith"&gt;Appsmith&lt;/a&gt; is an open source low code product to build custom internal tools and admin panels. We are a welcoming community &amp;amp; have lots of &lt;a href="https://github.com/appsmithorg/appsmith/issues?q=is%3Aissue+is%3Aopen+label%3A%22Good+First+Issue%22"&gt;issues&lt;/a&gt; that first time contributors can pick up.&lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Appsmith $1000 Bug Bounty Program</title>
      <dc:creator>Arpit Mohan</dc:creator>
      <pubDate>Fri, 18 Sep 2020 14:18:20 +0000</pubDate>
      <link>https://forem.com/mohanarpit/appsmith-1000-bug-bounty-program-coj</link>
      <guid>https://forem.com/mohanarpit/appsmith-1000-bug-bounty-program-coj</guid>
      <description>&lt;p&gt;&lt;strong&gt;Above Them&lt;/strong&gt; is a bug bounty program where you get rewarded for reporting the hairiest bugs that you face with the open source project, &lt;a href="https://github.com/appsmithorg/appsmith" rel="noopener noreferrer"&gt;Appsmith&lt;/a&gt;. &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/appsmithorg" rel="noopener noreferrer"&gt;
        appsmithorg
      &lt;/a&gt; / &lt;a href="https://github.com/appsmithorg/appsmith" rel="noopener noreferrer"&gt;
        appsmith
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Platform to build admin panels, internal tools, and dashboards. Integrates with 25+ databases and any API.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
&lt;a href="https://www.appsmith.com?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;
  &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fappsmithorg%2Fappsmithstatic%2Fappsmith_logo_white.png" alt="Appsmith Logo" width="350"&gt;
&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;a href="https://discord.gg/rBTTVJp" rel="nofollow noopener noreferrer"&gt;
&lt;img alt="Discord" src="https://camo.githubusercontent.com/811e673fd6efb1608cbb709318b87eea30f845c40d1de000507494d6e5572c23/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f3732353630323934393734383735323531353f636f6c6f723d353836354632266c6162656c3d446973636f7264267374796c653d666f722d7468652d6261646765"&gt;
&lt;/a&gt;
&lt;a href="https://github.com/appsmithorg/appsmith/releases" rel="noopener noreferrer"&gt;
&lt;img alt="GitHub commit activity" src="https://camo.githubusercontent.com/10d8a4918df71c3c614a1a7eb750252fef1659a13734c58ad48df2ae60997aeb/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f6d2f617070736d6974686f72672f617070736d6974683f636f6c6f723d3030464630267374796c653d666f722d7468652d6261646765"&gt;
&lt;/a&gt;
&lt;a href="https://docs.appsmith.com/getting-started/setup/installation-guides/docker?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme&amp;amp;utm_content=badge" rel="nofollow noopener noreferrer"&gt;
&lt;img src="https://camo.githubusercontent.com/24e8cfe914a6d7d52a763248b19ff9f123c24f32356b493cf0a60c4f89a87155/68747470733a2f2f696d672e736869656c64732e696f2f646f636b65722f70756c6c732f617070736d6974682f617070736d6974682d63653f636f6c6f723d343539316466267374796c653d666f722d7468652d6261646765"&gt;
&lt;/a&gt;
&lt;/p&gt;




&lt;p&gt;Organizations build internal applications such as dashboards, database GUIs, admin panels, approval apps, customer support dashboards, and more to help their teams perform day-to-day operations. Appsmith is an open-source tool that enables the rapid development of these internal apps. Read more on our &lt;a href="https://www.appsmith.com?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;website&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=NnaJdA1A11s?v=Dxe_NzdGzL4&amp;amp;utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme/?target=_blank" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fappsmithorg%2Fappsmith%2Fstatic%2Fimages%2Fappsmith-in-100-seconds.png" alt="Appsmith in 100 secs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;There are two ways to start using Appsmith:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signup on &lt;a href="https://app.appsmith.com/?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;Appsmith Cloud&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Install Appsmith on your machine. See the installation guides below.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;Installation Methods&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Documentation&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://docs.appsmith.com/getting-started/setup/installation-guides/docker?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c9a85f6869aa992f1500dd9d4d4bdff7d405605292ca152587394c1f92552d4f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646f636b65722d2532333064623765642e7376673f7374796c653d666f722d7468652d6261646765266c6f676f3d646f636b6572266c6f676f436f6c6f723d7768697465" alt="Docker"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;
&lt;br&gt;
&lt;a href="https://docs.appsmith.com/getting-started/setup/installation-guides/docker?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;Docker&lt;/a&gt; (&lt;em&gt;Recommended&lt;/em&gt;)&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://docs.appsmith.com/getting-started/setup/installation-guides/kubernetes?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d6d8bad228e7b8393fc66fb6b2a8628b821c4e3ca736a9c765d4a97c6e0afc1d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6b756265726e657465732d2532333332366365352e7376673f7374796c653d666f722d7468652d6261646765266c6f676f3d6b756265726e65746573266c6f676f436f6c6f723d7768697465" alt="Kubernetes"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://docs.appsmith.com/getting-started/setup/installation-guides/kubernetes?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;Kubernetes&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://docs.appsmith.com/getting-started/setup/installation-guides/aws-ami?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/873c09f11f469258183d6e64e34c12195f5f7f3d311b4c7a1461339a7255ee00/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4157532d2532334646393930302e7376673f7374796c653d666f722d7468652d6261646765266c6f676f3d616d617a6f6e2d617773266c6f676f436f6c6f723d7768697465" alt="AWS"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://docs.appsmith.com/getting-started/setup/installation-guides/aws-ami?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;AWS AMI&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;For other deployment options, see the &lt;a href="https://docs.appsmith.com/getting-started/setup/installation-guides?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;Installation Guides&lt;/a&gt; documentation.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Development&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;To build and run Appsmith in your local dev environment, see &lt;a href="https://github.com/appsmithorg/appsmith/blob/master/contributions/CodeContributionsGuidelines.md#-setup-for-local-development" rel="noopener noreferrer"&gt;Setup for local development&lt;/a&gt;.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Learning Resources&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.appsmith.com?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.appsmith.com/getting-started/tutorials?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;Tutorials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/appsmith?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;Videos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.appsmith.com/templates?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme&amp;amp;utm_content=support" rel="nofollow noopener noreferrer"&gt;Templates&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Need Help?&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://discord.gg/rBTTVJp?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;Discord&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.appsmith.com/?utm_source=github&amp;amp;utm_medium=organic&amp;amp;utm_campaign=readme" rel="nofollow noopener noreferrer"&gt;Community Portal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/appsmithorg/appsmithmailto:support@appsmith.com" rel="noopener noreferrer"&gt;support@appsmith.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contributing&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;We ❤️ our contributors. We're committed to fostering an open, welcoming, and safe environment in the community.&lt;/p&gt;

&lt;p&gt;📕 We expect everyone participating in the community to abide by our &lt;a href="https://github.com/appsmithorg/appsmith/blob/release/CODE_OF_CONDUCT.md" rel="noopener noreferrer"&gt;Code of Conduct&lt;/a&gt;…&lt;/p&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/appsmithorg/appsmith" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;
 

&lt;p&gt;These could be performance issues, documentation problems, small niggles or even a UX issue you faced. File away with no holds barred. &lt;/p&gt;

&lt;p&gt;The most number of bugs reported before &lt;em&gt;&lt;strong&gt;30th September, 2020&lt;/strong&gt;&lt;/em&gt; earns you $1000.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Appsmith?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/appsmithorg/appsmith" rel="noopener noreferrer"&gt;Appsmith&lt;/a&gt; is a low code way to build internal tools. It's the only open source alternative to Microsoft Power Apps, Salesforce Lightning platform, Service Now platform and many more. &lt;/p&gt;

&lt;p&gt;With Appsmith, you can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a page using pre-built UI components like table, charts, map viewers and forms.&lt;/li&gt;
&lt;li&gt;Connect the UI components to any REST API or databases like MySQL, Postgres, and MongoDB. Write any logic in JS.&lt;/li&gt;
&lt;li&gt;Deploy the interal tool to a custom URL and invite users to sign in with their Google acounts.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why Participate?
&lt;/h2&gt;

&lt;p&gt;Recently, one of our users expressed their love &amp;amp; frustration with Appsmith on Twitter.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1305804208944357376-191" src="https://platform.twitter.com/embed/Tweet.html?id=1305804208944357376"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1305804208944357376-191');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1305804208944357376&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;We are an open source project because we believe that software built in the open becomes better. This user's tweet clearly shows that our code has issues and as a small team we can't find them all.&lt;/p&gt;

&lt;p&gt;Also, lots of folks want to contribute to OSS but they aren't developers or just don't know how to begin. That's why we are starting our journey by rewarding users for simply reporting bugs.&lt;/p&gt;

&lt;p&gt;If that wasn't incentive enough, we have some prizes to sweeten the deal:&lt;/p&gt;

&lt;h3&gt;
  
  
  1 Grand prize for most number of qualified bugs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;$1000 USD gift card or equivalent&lt;/li&gt;
&lt;li&gt;Earn an Appsmith badge&lt;/li&gt;
&lt;li&gt;Recognition on our README page&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10 Runner up prizes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;$50 USD gift card or equivalent&lt;/li&gt;
&lt;li&gt;Earn an Appsmith badge&lt;/li&gt;
&lt;li&gt;Recognition on our README page
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You need to report a minimum of 2 bugs to qualify.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How can you participate?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Try out the product by checking out our &lt;a href="https://docs.appsmith.com/quick-start" rel="noopener noreferrer"&gt;Getting Started&lt;/a&gt; guide.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Report any bugs by creating a &lt;a href="https://github.com/appsmithorg/appsmith/issues" rel="noopener noreferrer"&gt;Github issue&lt;/a&gt; on this repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Label those issues with the tag &lt;code&gt;above-them&lt;/code&gt; to help us identify these issues quickly. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Join our &lt;a href="https://discord.gg/rBTTVJp" rel="noopener noreferrer"&gt;Discord channel&lt;/a&gt; and claim your prize.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Who is eligible?
&lt;/h2&gt;

&lt;p&gt;Everyone is eligible for this program. &lt;/p&gt;

&lt;p&gt;You don't necessarily need to be a developer to participate. Infact, most of our  insightful bug reports in the past have come from non-developers. &lt;/p&gt;

</description>
      <category>githunt</category>
      <category>opensource</category>
      <category>news</category>
      <category>javascript</category>
    </item>
    <item>
      <title>One open source project for admin panels, CRUD apps, &amp; internal tools</title>
      <dc:creator>Arpit Mohan</dc:creator>
      <pubDate>Fri, 21 Aug 2020 13:44:38 +0000</pubDate>
      <link>https://forem.com/appsmith/show-dev-open-source-tool-to-build-admin-panels-crud-apps-internal-tools-13fh</link>
      <guid>https://forem.com/appsmith/show-dev-open-source-tool-to-build-admin-panels-crud-apps-internal-tools-13fh</guid>
      <description>&lt;p&gt;We’ve all spent time on building internal tools which could be CRUD apps, admin panels, or complex workflows. &lt;br&gt;
These kind of internal tools are used for: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analytics and reporting&lt;/li&gt;
&lt;li&gt;Customer data views for sales &amp;amp; support teams&lt;/li&gt;
&lt;li&gt;Configuration managers for client-visible UI used by technical and non-technical people&lt;/li&gt;
&lt;li&gt;Multi-step data workflows which involve multiple participants(like content moderation tools or customer KYC at fin-tech startups)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These tools often aren’t very interesting to build because of the repetitive work involved  like building UI, writing CRUD APIs, setting up authentication, &amp;amp; managing deployments. I decided to create Appsmith because &lt;strong&gt;I couldn’t find a project which did most of the work for me and also easily customizable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;How does Appsmith work?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;First setup Appsmith using Docker. Read instructions here for a 2 min setup process.(&lt;a href="https://docs.appsmith.com/quick-start#docker" rel="noopener noreferrer"&gt;https://docs.appsmith.com/quick-start#docker&lt;/a&gt;). Or try our &lt;a href="https://app.appsmith.com/user/signup" rel="noopener noreferrer"&gt;online sandbox&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;a href="https://localhost" rel="noopener noreferrer"&gt;https://localhost&lt;/a&gt; or your machine’s public IP to see the login page. &lt;a href="https://app.appsmith.com/user/signup" rel="noopener noreferrer"&gt;online sandbox&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new application and name it. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fiuojuixhp3eblh7b4dhe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fiuojuixhp3eblh7b4dhe.png" alt="Create an application"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Connect to a database or API. Today MySQL, Mongo, Postgres, and REST apis are supported. The gif below shows me connecting to an API. &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Febg7sosssnarwjxl9jfj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Febg7sosssnarwjxl9jfj.gif" alt="API creation"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to the canvas section and choose a UI widget. Appsmith ships with 16 components like tables, different charts, map viewer, forms, etc. In the example below I’ve used a table component.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj0f5nzu19wmkmxmus85b.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj0f5nzu19wmkmxmus85b.gif" alt="DnD table"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Modify the table property to display your query results by writing &lt;code&gt;{{queryname.data}}&lt;/code&gt;. You can code in JS and use Lodash functions inside &lt;code&gt;{{ }}&lt;/code&gt;.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fowe6tmq3bo4qg4c52fqo.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fowe6tmq3bo4qg4c52fqo.gif" alt="API-table"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trigger an action through events like onClick, onTextchange, onSelectedrow, etc for CRUD operations.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdd3gm0lyyer4brmkxx2x.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fdd3gm0lyyer4brmkxx2x.gif" alt="Event trigger"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click deploy to see your app in a URL. (You can set up a custom domain in the setup script)&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvl9dz1ketugmtx1qte2g.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fvl9dz1ketugmtx1qte2g.gif" alt="Deploy"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Invite users after assigning them a role. They can sign up via a form login or with their Google/Github accounts. Make your app publicly viewable to allow access without a login.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F19qyleb6gfqiyl5fqs62.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F19qyleb6gfqiyl5fqs62.gif" alt="Share &amp;amp; invite"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So this is how you build a simple app in less than 10mins. Access an app I built on Appsmith &lt;a href="https://bit.ly/3gVPt52" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Appsmith is the first open source project to build internal tools. If you like the project, please &lt;a href="https://github.com/appsmithorg/appsmith" rel="noopener noreferrer"&gt;star our GitHub project&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What features should we add to Appsmith?&lt;/p&gt;

&lt;p&gt;TL;DR: &lt;strong&gt;Appsmith is an open source framework to build apps for analytics, workflows or CRUD operations.&lt;/strong&gt; Replace all your internal tools with one project. See &lt;a href="https://github.com/appsmithorg/appsmith" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt; or try an &lt;a href="https://bit.ly/3gVPt52" rel="noopener noreferrer"&gt;example app here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>news</category>
      <category>contributorswanted</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Open source + proprietary code structure</title>
      <dc:creator>Arpit Mohan</dc:creator>
      <pubDate>Tue, 16 Jun 2020 06:57:19 +0000</pubDate>
      <link>https://forem.com/mohanarpit/open-source-proprietary-hybrid-code-structure-3epj</link>
      <guid>https://forem.com/mohanarpit/open-source-proprietary-hybrid-code-structure-3epj</guid>
      <description>&lt;p&gt;I am considering open sourcing a project that I've been working on. Ideally, I'd like to create a hybrid structure that allows for a community edition &amp;amp; enterprise edition (much like Kafka, Gitlab etc). The community version will have the basic features while the enterprise edition will have some premium features and workflows.&lt;/p&gt;

&lt;p&gt;I'd love to hear from the community on how do we, as a team, split the code and/or how do we structure the code to keep the community versions &amp;amp; enterprise versions independent, clean and maintainable.&lt;/p&gt;

&lt;p&gt;For reference, the technologies we use are Java11 &amp;amp; React.&lt;/p&gt;

&lt;p&gt;Look forward to learning from your responses.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>opensource</category>
      <category>help</category>
    </item>
    <item>
      <title>Lessons learned while working on large-scale server software</title>
      <dc:creator>Arpit Mohan</dc:creator>
      <pubDate>Mon, 06 Apr 2020 13:00:21 +0000</pubDate>
      <link>https://forem.com/mohanarpit/lessons-learned-while-working-on-large-scale-server-software-44h3</link>
      <guid>https://forem.com/mohanarpit/lessons-learned-while-working-on-large-scale-server-software-44h3</guid>
      <description>&lt;p&gt;&lt;em&gt;TL;DR notes from articles I read today.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://bit.ly/2R9Amub"&gt;Lesson learned while working on large-scale server software&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Always have a plan for worst-case scenarios for error conditions, and find a general solution, such as automatically shutting down all operations and return an error code with when to retry or a contact to call.&lt;/li&gt;
&lt;li&gt;Document your decision making and add idempotence wherever possible.&lt;/li&gt;
&lt;li&gt;Approach debugging in a scientific way: first, gather data, form the right hypothesis and design an experiment to prove it, and then apply your fix; use tools to dig deep into traces and memory without stopping the system.&lt;/li&gt;
&lt;li&gt;Impose a strict implementation of Postel’s Law: Be conservative in what you send, be liberal in what you accept.&lt;/li&gt;
&lt;li&gt;Be wary of a major deployment that seems to go smoothly. Errors are inevitable and the bigger and quieter the error, the more dangerous they are. If you are not sure how to handle an error, let the system crash. It makes it easy to catch and correct errors.&lt;/li&gt;
&lt;li&gt;Be prepared to restart the entire system from a blank slate under heavy load. &lt;/li&gt;
&lt;li&gt;Notice technical decisions and components that have global effects, not just global variables. &lt;/li&gt;
&lt;li&gt;Build channels for persistent communication as new people are onboarded and leave teams. When building systems, do not assume operators will do things correctly and give them the tools to undo mistakes.  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://bit.ly/2R9Amub"&gt;Full post here&lt;/a&gt;, 10 mins read&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;a href="https://bit.ly/3dRrx1I"&gt;Being a great engineering mentor&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Be ready to listen. Your mentee should always feel free to ask you questions, especially in the first few weeks of onboarding. &lt;/li&gt;
&lt;li&gt;Help anchor them socially in the new place. If possible, carve out a weekly team ritual.  &lt;/li&gt;
&lt;li&gt;Let them feel safe enough to pursue novel solutions by showing them how to evaluate risks within the context of your organization and team. &lt;/li&gt;
&lt;li&gt;Explicitly inform your mentee of technical safeguards in place as well as providing non-technical assurance of help with failures. &lt;/li&gt;
&lt;li&gt;Understand their strengths and weaknesses, and encourage as well as challenge them technically with tasks that let them level up while having fun, gradually adding more unfamiliar or challenging jobs. Offer code hints but don’t unnecessarily prime them with warnings of difficulties ahead, and occasionally add stretch goals and praise their resolution to build confidence.&lt;/li&gt;
&lt;li&gt;Have 1-on-1 discussions and reinforce when you notice they are doing a great job while challenging them to do even better and share business context they might not readily see, as well as the engineering context of their project predating their on-boarding. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://bit.ly/3dRrx1I"&gt;Full post here&lt;/a&gt;, 8 mins read&lt;/em&gt;&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>career</category>
      <category>security</category>
    </item>
    <item>
      <title>How to feel less overwhelmed as a developer</title>
      <dc:creator>Arpit Mohan</dc:creator>
      <pubDate>Fri, 03 Apr 2020 13:00:29 +0000</pubDate>
      <link>https://forem.com/mohanarpit/how-to-feel-less-overwhelmed-as-a-developer-3991</link>
      <guid>https://forem.com/mohanarpit/how-to-feel-less-overwhelmed-as-a-developer-3991</guid>
      <description>&lt;p&gt;&lt;em&gt;TL;DR notes from articles I read today.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://bit.ly/39E0Zh5"&gt;How to feel less overwhelmed as a developer&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;When you feel overwhelmed, either there is too much going on at once or you are overstimulated. Refocus and reprioritize. &lt;/li&gt;
&lt;li&gt;Identify the specific problem - be it too steep a learning curve, too much information incoming, too many responsibilities, peer pressure or your own expectations of yourself.&lt;/li&gt;
&lt;li&gt;Zero in on your key goals, set your boundaries, focus your ambitions, and recognize what’s not really relevant to you. &lt;/li&gt;
&lt;li&gt;Find a process for self-education. Don’t try to memorize everything, learn where to find the right information. Make a list of what you don’t know, and add to it every time you come across a new idea or a skill you don’t have. Sift through the content and establish your key resources so you aren’t overwhelmed. &lt;/li&gt;
&lt;li&gt;Beware of getting overwhelmed by other people. Make sure you have a balanced perspective on social pressure. Know that a lot of people write bad code, even great developers in great companies. People have different priorities and you don’t have to keep up with theirs. Remember that people will write about what is possible but you don’t need most of it on a day-to-day basis.&lt;/li&gt;
&lt;li&gt;Work smarter by spending time on core skills like problem-solving, critical thinking and testing. Use proper project management tools to plan, manage tasks and track bugs. Take breaks for fresh air, exercise, and conversation so you don’t lose sight of the big picture. Ask your community for help with good resources, pointers or support with your workload. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://bit.ly/39E0Zh5"&gt;Full post here&lt;/a&gt;, 9 mins read&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;a href="https://bit.ly/2R9bO4n"&gt;Don’t be a jerk: write documentation&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Documentation can be minimal and yet helpful. Take whatever you have in volatile formats (email, chat logs, shell I/O) and paste it into more durable ones (README files, diagrams, websites, FAQs, wikis). &lt;/li&gt;
&lt;li&gt;Document based on your audience:

&lt;ol&gt;
&lt;li&gt;For newcomers, focus on what it does, why you wrote it, who should be using it and for what, how it should be used (how to build, configure, run and get started), and where additional information may be found; do not display the source.&lt;/li&gt;
&lt;li&gt;Regular users could do with a reference manual, examples, EDoc/JavaDoc/Doc, wiki or website, and API descriptions. &lt;/li&gt;
&lt;li&gt;Contributors should have access to the source repository, as well as project structure and architecture (where to find out about specific functionalities and where new features should go), the project principles, tests, issues, and a roadmap.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;An easy way to get started is to imagine you are talking to a new user. Then vary the user and add different scenarios (of their business context and experience/knowledge, budgets) to expand the documentation until it is comprehensive. Finally, you might split it up into categories for different people or reimagine/format it for different media/platforms.&lt;/li&gt;
&lt;li&gt;Another approach is to find a problem a user might face and show them how to solve it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://bit.ly/2R9bO4n"&gt;Full post here&lt;/a&gt;, 11 mins read&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://mailchi.mp/appsmith/insnippets?utm_source=devto&amp;amp;utm_medium=post08&amp;amp;utm_campaign=is"&gt;Get these notes directly in your inbox every weekday by signing up for my newsletter, in.snippets().&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to make decisions in the face of uncertainty</title>
      <dc:creator>Arpit Mohan</dc:creator>
      <pubDate>Fri, 03 Apr 2020 05:21:28 +0000</pubDate>
      <link>https://forem.com/mohanarpit/how-to-make-decisions-in-the-face-of-uncertainty-1eh6</link>
      <guid>https://forem.com/mohanarpit/how-to-make-decisions-in-the-face-of-uncertainty-1eh6</guid>
      <description>&lt;p&gt;&lt;em&gt;TL;DR notes from articles I read today.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://bit.ly/2UTfGrs"&gt;Three types of risk: making decisions in the face of uncertainty&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fatal risks can kill a company, so you need to be extra careful to watch for them as your company grows and ages. It is easy to get complacent but there is no recovery from such decisions gone wrong. &lt;/li&gt;
&lt;li&gt;Painful risks have lower but significant repercussions: missing a key goal or losing key people. But you can recover from them. &lt;/li&gt;
&lt;li&gt;Embarrassment risks have no significant impact beyond just what the name states. You just need to acknowledge the mistake, change course and move on.&lt;/li&gt;
&lt;li&gt;Another way to think about risk is Jeff Bezos categorization of decision making into Type 1 (irreversible, so spend time on them) and Type 2 (reversible, as with painful and embarrassing risks, so make the decision quickly and move on).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://bit.ly/2UTfGrs"&gt;Full post here&lt;/a&gt;, 4 mins read&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;a href="https://bit.ly/2w7cgZL"&gt;Four magic numbers for measuring software delivery&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lead time&lt;/strong&gt; to validate, design, implement and ship a new valuable thing. Consider two types of lead time: (a) feature lead time: the time to move an item from high-level requirements to feature release and (b) deployment lead time: the time from merging to master to the component being in production. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deployment frequency&lt;/strong&gt;, understood as number of times per developer per day you ship to production. Your deployment frequency may ebb and flow, from 5-10 on a busy day to none the rest of the week. Establish a baseline over 4 weeks: say, 1 production deployment per day on average.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change failure percentage&lt;/strong&gt;, ie, the proportion of red deployments, bugs, alerts, etc. Defining change failure rate as bugs per production deployment over a given period, aim for about 10% or less with medium or high-priority of customer impact. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mean time to recovery/resolution&lt;/strong&gt;. For mean time to resolution, aim for less than a working week.  &lt;/li&gt;
&lt;li&gt;Considering feature lead time as a key performance indicator can help you break features up and deliver faster. This might also decrease lead time per deployment.&lt;/li&gt;
&lt;li&gt;Convert generic support tickets into bugs with customer impact implications so they can be tracked better. Make bugs more visible can also make bottlenecks in the resolution process more apparent.&lt;/li&gt;
&lt;li&gt;Count red production deployments and production alerts as a change failure.  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://bit.ly/2w7cgZL"&gt;Full post here&lt;/a&gt;, 9 mins read&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://mailchi.mp/appsmith/insnippets?utm_source=devto&amp;amp;utm_medium=post08&amp;amp;utm_campaign=is"&gt;Get these notes directly in your inbox every weekday by signing up for my newsletter, in.snippets().&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>career</category>
      <category>programming</category>
    </item>
    <item>
      <title>Inefficient efficiency</title>
      <dc:creator>Arpit Mohan</dc:creator>
      <pubDate>Wed, 01 Apr 2020 13:00:14 +0000</pubDate>
      <link>https://forem.com/mohanarpit/inefficient-efficiency-154i</link>
      <guid>https://forem.com/mohanarpit/inefficient-efficiency-154i</guid>
      <description>&lt;p&gt;&lt;em&gt;TL;DR notes from articles I read today.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://bit.ly/3dKhtaS"&gt;Inefficient efficiency&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Latency (measured in time units) is the time between a stimulus and a response, while throughput (measured in deliveries per time unit) is the rate at which the system meets its goals.&lt;/li&gt;
&lt;li&gt;Sometimes latency and throughput interfere with each other. Do you field a request and respond before taking the next request (low latency for the first customer but overall lower throughput), or do you accept the second request while processing the first for higher throughput?&lt;/li&gt;
&lt;li&gt;You make latency/throughput tradeoffs every day and most of us are biased towards throughput. For example - you carefully plan all foreseeable architectural improvements instead of initiating the first profitable change you come across.&lt;/li&gt;
&lt;li&gt;Instead, you should optimize for latency. For example - if preferences are likely to change between requests (high rate of change), so you can adapt, which is less wasteful.&lt;/li&gt;
&lt;li&gt;To decide between throughput and latency, consider the cost of delay, whether you might learn something that changes your approach subsequently, and whether external factors might force a new approach. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://bit.ly/3dKhtaS"&gt;Full post here&lt;/a&gt;, 4 mins read&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;a href="https://bit.ly/2UQe0Pf"&gt;Tips on API monitoring&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Track your functional uptime with comprehensive, end-to-end testing for both functionality and performance. Simple ping tests are usually not enough to meet your service level agreements (SLAs).&lt;/li&gt;
&lt;li&gt;Since 95% of API vulnerabilities are due to human error, add monitoring at 5-minute intervals for breaches and downtime. Integrate automated testing into every step of your CI/CD pipeline to filter out human errors and make sure you have load-testing capabilities too. &lt;/li&gt;
&lt;li&gt;But you should beware of 

&lt;ul&gt;
&lt;li&gt;tools that perform ‘synthetic testing’ and cannot reproduce actual consumer flows.&lt;/li&gt;
&lt;li&gt;tools that use third-party clouds, adding another layer of insecurity to your API (have internal APIs use on-premise tools instead).&lt;/li&gt;
&lt;li&gt;having separate testing and monitoring solutions. &lt;/li&gt;
&lt;li&gt;tests that are not detailed enough for intelligent results.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://bit.ly/2UQe0Pf"&gt;Full post here&lt;/a&gt;, 4 mins read&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://mailchi.mp/appsmith/insnippets?utm_source=devto&amp;amp;utm_medium=post08&amp;amp;utm_campaign=is"&gt;Get these notes directly in your inbox every weekday by signing up for my newsletter, in.snippets().&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>api</category>
      <category>programming</category>
      <category>coding</category>
    </item>
    <item>
      <title>Big myths surrounding technical debt</title>
      <dc:creator>Arpit Mohan</dc:creator>
      <pubDate>Tue, 31 Mar 2020 13:00:30 +0000</pubDate>
      <link>https://forem.com/mohanarpit/big-myths-surrounding-technical-debt-5145</link>
      <guid>https://forem.com/mohanarpit/big-myths-surrounding-technical-debt-5145</guid>
      <description>&lt;p&gt;&lt;em&gt;TL;DR notes from articles I read today.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://bit.ly/2QX5NaR"&gt;Five big myths surrounding technical debt&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Myth #1 is that tech debt is amorphous, when in actuality it is usually a collection of many discrete problems. This means you can quantify tech debt (frequency, impact, cost to fix) on a spreadsheet or tracker and then prioritize based on impact.&lt;/li&gt;
&lt;li&gt;Myth #2 is that all tech debt has a single cause. In fact, there are three major sets of causes (or enablers):

&lt;ul&gt;
&lt;li&gt;Intentional tech debt, where the team knowingly took shortcuts to meet deadlines.&lt;/li&gt;
&lt;li&gt;Unintentional, where poor code results from inexperience or incompetence or misunderstood requirements.&lt;/li&gt;
&lt;li&gt;From age, where incremental enhancements and bug fixes cause a bit rot.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Myth #3 is that you should never intentionally take on tech debt. But there are three situations where it may be justified: you are building a prototype or demo module to solicit feedback on a new feature or product, time to market is critical or you are building based on guesswork and anticipate client requirements will change sooner than later.&lt;/li&gt;
&lt;li&gt;Myth #4 is it only hurts engineers. In fact, it affects developers, product managers, customer support teams and customers, technical operations, and any executive team you may set up.  &lt;/li&gt;
&lt;li&gt;Myth #5 is that only a full rewrite can repay the debt, whereas more often, a detailed plan of incremental fixes will solve it.   &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://bit.ly/2QX5NaR"&gt;Full post here&lt;/a&gt;, 8 mins read&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;a href="https://bit.ly/2WU7LNd"&gt;Indirect benefits of building API-first&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A major benefit of building API-first is agility, both digital and strategic. You are not constrained to a single usage pattern and have the basis for a variety of applications with use cases you can’t even imagine yet, offering both flexibility and reusability.&lt;/li&gt;
&lt;li&gt;Your end-user has a better experience since APIs encourage interactivity across internal and external applications, creating a stickier, unified experience for consumers.&lt;/li&gt;
&lt;li&gt;Building your organization around APIs creates a potential for partnerships, big and small, whether using the marketplace model (your platform allows others to build and distribute custom add-ons, in turn extending your own platform) or one where partner APIs share data with a common, collaborative goal.&lt;/li&gt;
&lt;li&gt;Outward-facing APIs enable the growth and inception of self-sustaining developer communities, providing you with awareness, API support, product suggestions and more. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://bit.ly/2WU7LNd"&gt;Full post here&lt;/a&gt;, 4 mins read&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://mailchi.mp/appsmith/insnippets?utm_source=devto&amp;amp;utm_medium=post08&amp;amp;utm_campaign=is"&gt;Get these notes directly in your inbox every weekday by signing up for my newsletter, in.snippets().&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>api</category>
      <category>techdebt</category>
    </item>
    <item>
      <title>Feedback is not a dirty word</title>
      <dc:creator>Arpit Mohan</dc:creator>
      <pubDate>Mon, 30 Mar 2020 13:00:28 +0000</pubDate>
      <link>https://forem.com/mohanarpit/feedback-is-not-a-dirty-word-88c</link>
      <guid>https://forem.com/mohanarpit/feedback-is-not-a-dirty-word-88c</guid>
      <description>&lt;p&gt;&lt;em&gt;TL;DR notes from articles I read today.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://bit.ly/2wEZ6n8"&gt;Feedback is not a dirty word&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Without a good feedback system, pockets of disagreement can grow into resentment, distrust and eventually organizational failure. Feedback is also the only way to achieve true personal growth.&lt;/li&gt;
&lt;li&gt;For critical feedback to be effective, give it in private and with positive intentions, be specific and factual, and use a non-violent communication format: &lt;em&gt;‘when you do , I feel  because the story in my head is ’&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Set up review sessions regularly (ideally weekly) at an expected time.&lt;/li&gt;
&lt;li&gt;Be receptive to feedback and sidestep your ego’s fight or flight response by evaluating ideas objectively and viewing feedback as a gift. &lt;/li&gt;
&lt;li&gt;Once you have heard the feedback, repeat what you heard, request confirmation and keep asking ‘Is that all?’ until you are sure the other person is done. Finally, think objectively about the feedback and suggest an action to resolve it.&lt;/li&gt;
&lt;li&gt;Ensure that feedback is a part of your culture and an expectation from managers. Hold weekly one-on-one meetings, with structured time in the end for mutual feedback and put it all on record.&lt;/li&gt;
&lt;li&gt;Publicly seek feedback from your team and discuss it. As a leader, publish written feedback from other leaders for the entire company and discuss ways you are trying to improve.  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://bit.ly/2wEZ6n8"&gt;Full post here&lt;/a&gt;, 5 mins read&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;a href="https://bit.ly/2xxZjsk"&gt;Absolute truths I unlearned as a junior developer&lt;/a&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The title of ‘senior developer’&lt;/strong&gt;: Don’t be led by job titles alone. Value collaborative experience, being reviewed and having a mentor. Avoid an early position where you have to work alone.  &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Everyone writes tests&lt;/strong&gt;: Loads of companies have little or no testing, because they have either never felt the pain of not having tests or felt the pain of having legacy tests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We’re far behind everyone else&lt;/strong&gt;: Beware of ‘tech FOMO’ as academic settings and conferences often cover proof of concepts rather than real-world scenarios. Dealing with legacy is normal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code quality matters most&lt;/strong&gt;: Often, good enough code that works and is maintainable is good enough. Overarching architecture is more important than nitpicking. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technical debt is bad&lt;/strong&gt;: Disorganized or messy code is not the same as technical debt. Technical debt actually slows you down or causes errors or makes changes difficult. A certain amount of tech debt is healthy because it assures delivery.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Seniority means being the best programmer&lt;/strong&gt;: Senior engineers need many skills, from communication and dependency management to estimation and project management. And the truth is that we all remain junior in some areas.  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://bit.ly/2xxZjsk"&gt;Full post here&lt;/a&gt;, 14 mins read&lt;/em&gt;&lt;/p&gt;




&lt;p&gt; &lt;br&gt;
&lt;em&gt;&lt;a href="https://mailchi.mp/appsmith/insnippets?utm_source=devto&amp;amp;utm_medium=post08&amp;amp;utm_campaign=is"&gt;Get these notes directly in your inbox every weekday by signing up for my newsletter, in.snippets().&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>todayilearned</category>
    </item>
  </channel>
</rss>
