<?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>DEV Community: Ziad</title>
    <description>The latest articles on DEV Community by Ziad (@ziadghalleb).</description>
    <link>https://dev.to/ziadghalleb</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%2F670798%2F51394986-92f6-4962-9c7d-81e19ee1ee12.png</url>
      <title>DEV Community: Ziad</title>
      <link>https://dev.to/ziadghalleb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ziadghalleb"/>
    <language>en</language>
    <item>
      <title>How does Bokeh, the Python Interactive Visualization Library, Secure its Open-Source Repositories?</title>
      <dc:creator>Ziad</dc:creator>
      <pubDate>Tue, 09 Nov 2021 12:31:45 +0000</pubDate>
      <link>https://dev.to/gitguardian/how-does-bokeh-the-python-interactive-visualization-library-secure-its-open-source-repositories-1c9m</link>
      <guid>https://dev.to/gitguardian/how-does-bokeh-the-python-interactive-visualization-library-secure-its-open-source-repositories-1c9m</guid>
      <description>&lt;p&gt;Open-source is everywhere, it is one of the driving forces of software innovation from the academic to the enterprise world (75% of codebases audited by Synopsys in the &lt;a href="https://www.synopsys.com/software-integrity/resources/analyst-reports/open-source-security-risk-analysis.html" rel="noopener noreferrer"&gt;2021 OSSRA report&lt;/a&gt; rely on open-source components. Its prevalence in commercial software is reaching unprecedented levels, to the extent that the European Commission has recently identified it as a public good, in a recent study assessing its impact on the region's economy.&lt;/p&gt;

&lt;p&gt;But the interstitial nature of open-source in modern software also makes it a subject of security and compliance concerns, as it is capable of exposing organizations that use it to a host of unknown risks and vulnerabilities. Most discussions we are hearing today around security in this space are focused on the identification, fixing, and remediation of vulnerabilities - all seen from the "consumer" perspective.&lt;/p&gt;

&lt;p&gt;This time, we decided to go on the other side of the fence. We had the pleasure to exchange a few words with &lt;a href="https://github.com/bryevdv" rel="noopener noreferrer"&gt;Bryan Van de Ven&lt;/a&gt;, co-creator and core maintainer of the Bokeh project, a Python library for data visualization. Bryan gave us an insider look at how open-source maintainers such as himself shield their projects against the attempts of malicious actors trying to exploit security gaps. The goal of attackers is straightforward: introduce vulnerabilities downstream, and in turn, attack the software supply chains that depend on the same open-source packages and libraries.&lt;br&gt;
Bokeh, the interactive visualization library for the modern browser&lt;/p&gt;

&lt;p&gt;&lt;a href="https://bokeh.org" rel="noopener noreferrer"&gt;Bokeh&lt;/a&gt; (pronounced /ˈboʊkeɪ/ BOH-kay) is an interactive visualization library for modern web browsers, written in Python. It provides elegant and concise construction of plots while maintaining high-performance interactivity over large datasets. Bokeh can help anyone who would like to quickly and easily make interactive plots, dashboards, and data applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fblog.gitguardian.com%2Fcontent%2Fimages%2Fsize%2Fw1600%2F2021%2F09%2FScreenshot-2021-09-21-at-14.46.28.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%2Fblog.gitguardian.com%2Fcontent%2Fimages%2Fsize%2Fw1600%2F2021%2F09%2FScreenshot-2021-09-21-at-14.46.28.png" alt="Standalone examples of data plots made with the Bokeh library"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before starting his endeavor with Bokeh in 2012, Bryan was no stranger to open-source libraries. He authored the conda package manager and worked full-time at Anaconda on its distribution, simplifying package management and deployment for more than 25 million users worldwide. Inspired by his previous contribution to Chaco (Python data visualization library) and the rise of JavaScript-heavy frameworks for frontend in the early 2010s, Bryan teamed up with Peter Wang to offer an alternative for Python developers, who were working on interactive data applications for the modern browser. The rest is history.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is security important for open-source projects like Bokeh?
&lt;/h2&gt;

&lt;p&gt;With 37,000+ public GitHub repositories declaring its use and 2.5 million monthly downloads, Bokeh has made a name for itself. Bryan believes this has a lot to do with the project's early days, where patience, responsiveness, and receptiveness to the contributions from a community in its embryonic stages play a determining role in later successes.&lt;br&gt;
Now comes the difficult part, ensuring Bokeh is open-source code on which individual developers and enterprise teams alike can safely build. Together, we discussed some of the threats keeping open-source maintainers up at night:&lt;/p&gt;

&lt;h3&gt;
  
  
  Typosquatting
&lt;/h3&gt;

&lt;p&gt;This attack implies bad actors pushing malicious packages with similar names to the original one to a trusted registry and crossing fingers for users to fall for their dirty trick. Packages hosted on the npm and PyPI registries have been notable targets, reminding us that developers too can fall prey to a different breed of phishing.&lt;/p&gt;

&lt;p&gt;With more than 2.5 million monthly downloads shared between conda and pip and ~150 million requests for BokehJS resources at cdn.bokeh.org every year, the bokeh library looks like it is ripe for the picking, at least from an attacker's perspective.&lt;br&gt;
Once the malicious packages are installed and executed in runtime, attackers can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Siphon environment variables for further lateral movement (crossenv attack)&lt;/li&gt;
&lt;li&gt;Hijack cloud computing resources for crypto-mining (PyPI attacks in 2021)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unfortunately, there is not much the package maintainers can do here. It is recommended users scan their project dependencies to verify their integrity with tools such as WhiteSource, Sonatype, Snyk or Vdoo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compromised build &amp;amp; deployment pipelines
&lt;/h3&gt;

&lt;p&gt;Like other developers, core maintainers may not be application security experts. They are not particularly immune to introducing bugs in their code or inadvertently committing secrets in their project's git repository. Insecurely handling credentials can lead to their public broadcasting on GitHub, with consequences for projects like Bokeh ranging from Cloud Jacking (e.g abuse of AWS cloud computing resources) to compromising their publishing rights on PyPI or Anaconda.&lt;/p&gt;

&lt;p&gt;With a team of 5 to 6 core maintainers and a total number of ~500 contributors spanning the project's life, things can get messy for Bokeh if credentials are spilled. Bryan assures us only a handful of contributors are cleared to handle the project's secrets and the team uses GitHub's Encrypted Secrets to store and retrieve credentials in their GitHub Actions CI pipelines.&lt;/p&gt;

&lt;p&gt;In addition to this measure, Bokeh is hardening the CI pipelines with GitGuardian, effectively catching any leaked secrets as soon as the code wrapping them reaches the build stages. More on this later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Threats to Asset Integrity
&lt;/h3&gt;

&lt;p&gt;Open-source software is not just a public code repository hosted on GitHub. It is also a collection of assets, guiding both starters and experienced members of the community through their learning journey. To name just a few from Bokeh:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website&lt;/li&gt;
&lt;li&gt;CloudFront CDN for distributing the BokehJS runtime at cdn.bokeh.org&lt;/li&gt;
&lt;li&gt;Public documentation&lt;/li&gt;
&lt;li&gt;Blog (hosted on Medium)&lt;/li&gt;
&lt;li&gt;Social media accounts (YouTube, Twitter…)&lt;/li&gt;
&lt;li&gt;Community and support (Discourse)&lt;/li&gt;
&lt;li&gt;Other tools (Zapier for automation, Pingdom for forms and surveys)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike open-source code, such services will never run in the users' production environments. But they are equally important in terms of the protection they deserve since they could offer openings to attackers with a strong taste for Social Engineering tactics.&lt;/p&gt;

&lt;p&gt;For everything other than the documentation, Bokeh is using the free tier 1Password offers to open-source projects to securely store and manage all their credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does GitGuardian shield Bokeh's public repositories?
&lt;/h2&gt;

&lt;p&gt;Bryan tells us his first encounter with spilled credentials was in a coffee shop, coincidence? While testing new automation functions and uploading documentation to the CloudFront CDN, he accidentally pushed an AWS secret key and its token.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Flh3.googleusercontent.com%2F_8QSNsT90pvX7Ia3onP9AcKSojrq-TUti4sFcOcFmVfHGQzY7ihwAnhA4vnoOQG7Z_hO6HXvR0wbGQ3mS9wXFYmUCiAA1b_vxTqAEbAALFTm0g3_47kax3Mp8nZEdk-oHKIi0Hg4%3Ds0" 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%2Flh3.googleusercontent.com%2F_8QSNsT90pvX7Ia3onP9AcKSojrq-TUti4sFcOcFmVfHGQzY7ihwAnhA4vnoOQG7Z_hO6HXvR0wbGQ3mS9wXFYmUCiAA1b_vxTqAEbAALFTm0g3_47kax3Mp8nZEdk-oHKIi0Hg4%3Ds0" alt="Incident view example in the GitGuardian dashboard (fictitious data)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Luckily, GitGuardian had his back. Our pro-bono service caught this secret in the public bokeh repository and sent him a timely alert with the incident's details.&lt;br&gt;
Bryan was able to remediate in time, revoking and rotating his secret, and finally rewriting the git history to remove all evidence of the leak. In less than an hour, his fast response allowed him to nullify the damage and close the window for any exploits.&lt;/p&gt;

&lt;p&gt;Since this incident, his team has had GitGuardian's CLI, gg-shield, running on every Pull Request, in their GitHub Actions workflows. The secret scanning checks and their results are also displayed in the VCS, making sure all contributors have full and equal visibility - without ever leaving their developer environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next for Bokeh and GitGuardian?
&lt;/h2&gt;

&lt;p&gt;The Bokeh team is actively adding core contributors and one of the recent joiners is a git hooks power-user, which works out perfectly since GitGuardian offers secret scanning at the pre-commit level. The Bokeh team can now shift further left and prevent secrets from reaching their VCS and CI pipelines.&lt;br&gt;
Bryan was also excited about our latest product updates, namely the Presence and Validity checkers. &lt;/p&gt;

&lt;p&gt;These features provide hints as to whether the leaked secrets are still present in the git history or not and if they are valid, meaning they can still be exploited by malicious actors.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Interesting! This will help teams modulate the fervor of the response to incidents and focus their efforts where they are most needed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  What about you? Are you actively maintaining an open-source project or looking to make your source code public?
&lt;/h3&gt;

&lt;p&gt;Here are a few resources on securing open-source code that can get you started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.gitguardian.com/safely-open-source-software-best-practices" rel="noopener noreferrer"&gt;How to safely open-source internal software, some best practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://safecode.org/fundamental-practices-secure-software-development" rel="noopener noreferrer"&gt;Fundamental Practices for Secure Software Development&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>How is Carrot getting Bitcoin to the next billion people with the help of Forest Admin? 🥕</title>
      <dc:creator>Ziad</dc:creator>
      <pubDate>Wed, 23 Dec 2020 12:04:35 +0000</pubDate>
      <link>https://dev.to/forestadmin/how-is-carrot-getting-bitcoin-to-the-next-billion-people-with-the-help-of-forest-admin-279e</link>
      <guid>https://dev.to/forestadmin/how-is-carrot-getting-bitcoin-to-the-next-billion-people-with-the-help-of-forest-admin-279e</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;It is really our sort of secret plan, to get Bitcoin to the next billion people!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Tyler Evans, co-founder &amp;amp; CTO of BTC Inc.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The mission at hand is daunting, if not impossible. But those who have met Tyler Evans know he wouldn't flinch at such a challenge.&lt;/p&gt;

&lt;p&gt;Tyler is the co-founder and CTO of BTC Inc - the media group behind Bitcoin Magazine, providing news and commentary on Bitcoin and blockchain technology since 2012 to millions of readers across the globe. With a deep background in the technology and an enthusiastic community, BTC Inc. was in the perfect position to build the next on-ramp for Bitcoin.&lt;/p&gt;

&lt;p&gt;In 2020, he and his team at BTC Inc. decided to launch Carrot, a rewards platform where users can earn bitcoin simply by supporting the brands and creators they love. Creators of all sorts (writers, podcasters, open-source collectives...) can publish challenges to be carried out by their audiences and offer bitcoin for their completion.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2FCarrotScreenshot.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2FCarrotScreenshot.png%3Fraw%3Dtrue" alt="In-app screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For its public release, Carrot chose Forest Admin to build its admin panel. Here's why and how they did it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Carrot needed serious internal tooling to launch its app 🚀&lt;br&gt;
Carrot's alpha phase saw it distribute millions of sats* to more than 10,000 users, proving the demand for a micropayment rewards platform.&lt;/p&gt;

&lt;p&gt;Launching its public release however, is a different matter. &lt;em&gt;"We needed to stop interacting directly with the database and APIs and build the right set of internal tools for our team"&lt;/em&gt;, said Tyler. This would prove critical for the Carrot team to provide responsive customer support at scale, mainly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reviewing the challenges and bounties sent by creators&lt;/li&gt;
&lt;li&gt;Moderating user submissions to the challenges&lt;/li&gt;
&lt;li&gt;Triggering bitcoin payouts for the winning submissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fortunately, Forest Admin was here to help.&lt;/p&gt;

&lt;h1&gt;
  
  
  The day-to-day operations on Forest Admin 🌲
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Reviewing the bounties sent by creators
&lt;/h2&gt;

&lt;p&gt;The first conversations we had with Carrot revolved around making the bounty creation process as streamlined as possible. For this to happen, external partners had to be granted access to Forest Admin to submit challenges with little help or no support.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2Fcreator-bounty-form.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2Fcreator-bounty-form.png%3Fraw%3Dtrue" alt="In-app screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Leveraging Forest Admin's team-based permissions, Carrot restricted their access to a user-friendly form where it was possible to write a description, set the reward size and upload a few images.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2FBTCMEDIA1.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2FBTCMEDIA1.png%3Fraw%3Dtrue" alt="In-app screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once submitted, the challenges were reviewed by the Carrot Operations team and the approved ones would become visible to all users on the platform.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2Fteambasedpermissions.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2Fteambasedpermissions.png%3Fraw%3Dtrue" alt="In-app screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Moderating users' submissions and triggering payouts
&lt;/h2&gt;

&lt;p&gt;Users scrolling through the platform's available bounties were then able to pick their favorite and give it a try. One typical challenge was to complete a product testing survey where a user provides valuable feedback in return for a fraction of a bitcoin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2Fcarrot-part2.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2Fcarrot-part2.png%3Fraw%3Dtrue" alt="In-app screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This type of submission goes through Typeform and its content is viewed in Forest Admin by the creators and Carrot team. Submissions are moderated to filter out the spammy and unhelpful ones.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2FBTCMEDIA3.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2FBTCMEDIA3.png%3Fraw%3Dtrue" alt="In-app screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once a submission is accepted, it's payday for the user! Carrot operators fire a call from Forest Admin to their APIs, sending the bitcoin micropayment over a Lightning Network channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measuring the traction 📈
&lt;/h2&gt;

&lt;p&gt;Aside from streamlining operations, measuring the platform's traction was essential to nailing the public release. For this, the Carrot team created dashboards using Forest Admin's no-code chart builder.&lt;br&gt;
By displaying the total number of users, live bounties and tracking bitcoin payouts amongst other KPIs, they were able to quickly gain insights before committing to any important decision.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2Fcarrot-dashboard1.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fziadgh1%2FbtcmediaCaseStudy%2Fblob%2Fmain%2Fcarrot-dashboard1.png%3Fraw%3Dtrue" alt="In-app screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Delivered in record time
&lt;/h1&gt;

&lt;p&gt;Forest Admin was a no-brainer for Carrot. It provided them with the right set of tools for a stress-free public release. Its ease of set up and customizability also allowed them to build all business workflows in record time; less than 14 days were needed to go live!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We were able to go so quickly with Forest Admin's help from an out-of-the-box solution to something fairly custom that did exactly what we wanted for Carrot without us having to change our workflows or adapt our technical stack to fit!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Tyler Evans, co-founder &amp;amp; CTO of BTC Inc.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All we can hope for Tyler and the Carrot team now is to run a successful launch and distribute more bitcoin through Lightning Network ⚡ than it has ever been done before!&lt;/p&gt;

&lt;h2&gt;
  
  
  Is your company operating in the Crypto &amp;amp; Blockchain space? Let's get in touch!
&lt;/h2&gt;

&lt;p&gt;While we continue to power the most exciting startups in the FinTech industry, we're also excited to build our presence in the Crypto space and are on track to become one of its cornerstone tools.&lt;/p&gt;

&lt;p&gt;We're eager to learn what use cases you have in mind and would love to take a chance at demonstrating what Forest can do for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  💻  Book a 1:1 demo with our team &lt;a href="https://calendly.com/ziadghalleb/forest-onboarding" rel="noopener noreferrer"&gt;here&lt;/a&gt;
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Curious to know why other FinTechs chose Forest?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.forestadmin.com/how-moka-launched-its-operations-in-europe-with-forest-admin" rel="noopener noreferrer"&gt;How Moka launched its operations in Europe with Forest Admin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.forestadmin.com/how-the-neobank-qonto-is-reinventing-business-banking-thanks-to-forest-admin" rel="noopener noreferrer"&gt;How the neobank Qonto is reinventing B2B banking with Forest Admin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.forestadmin.com/how-spendesk-consolidated-its-customer-data-into-forest-admin-for-customer-success-and-support" rel="noopener noreferrer"&gt;How Spendesk consolidated its data for Customer Success &amp;amp; Support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Glossary
&lt;/h3&gt;

&lt;p&gt;sats or satoshis* = smallest bitcoin unit, equal to 100 millionth of a bitcoin&lt;/p&gt;

</description>
      <category>node</category>
      <category>blockchain</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Build internal tools with privacy in mind using Forest Admin 🌲 </title>
      <dc:creator>Ziad</dc:creator>
      <pubDate>Fri, 04 Sep 2020 11:34:39 +0000</pubDate>
      <link>https://dev.to/forestadmin/build-internal-tools-with-privacy-in-mind-using-forest-admin-116o</link>
      <guid>https://dev.to/forestadmin/build-internal-tools-with-privacy-in-mind-using-forest-admin-116o</guid>
      <description>&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;p&gt;Internal tools like admin panels are oft overlooked. Because time spent on building them equates to time not spent on shipping the next shiny feature.&lt;/p&gt;

&lt;p&gt;So what happens when non-technical teams need to see or manipulate an app's data? They are stuck with rushed and frustrating tools.&lt;/p&gt;

&lt;p&gt;Forest Admin empowers developers to build and ship admin panels. Ones that are easy for non-developers to use, easy to adapt, and easy to extend. For a fraction of the time it would cost to develop them in-house.&lt;/p&gt;

&lt;p&gt;Here we'll explain the architecture we chose to provide such a service.  Without forcing you to choose between the privacy and security of an in-house solution and the convenience of a SaaS. Yes, you can get the best of both worlds and no, there's no catch.&lt;/p&gt;

&lt;h1&gt;
  
  
  How does Forest Admin work?
&lt;/h1&gt;

&lt;p&gt;Forest Admin provides you with an admin panel for your internal teams to see and manage your data. But what happens under the hood to build the interface for your teams?&lt;/p&gt;

&lt;p&gt;The whole architecture consists in 4 different components as shown below. The database, the admin backend, the Forest Admin API server and the Forest Admin UI server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fziadgh1%2FForest-Admin-Architecture---sep2020%2Fblob%2Fmaster%2FForest%2520Admin%2520architecture.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fziadgh1%2FForest-Admin-Architecture---sep2020%2Fblob%2Fmaster%2FForest%2520Admin%2520architecture.png%3Fraw%3Dtrue" alt="Architecture Schema"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Your database
&lt;/h2&gt;

&lt;p&gt;The database is the most vital part of any stack. It's where your application data lives and resides. It reflects real world transactions from your customers.&lt;/p&gt;

&lt;p&gt;It's also the first building block needed to create your admin panel on Forest Admin. Because it will be the main data source for it.&lt;/p&gt;

&lt;p&gt;Forest Admin currently supports RDBMS such as MySQL, Postgres &amp;amp; MsSQL. In the NoSQL databases family, it supports MongoDB.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Forest admin backend
&lt;/h2&gt;

&lt;p&gt;When you install Forest Admin, you generate a node.js application on your local machine. It includes a RESTful API that connects to your database. We call this app the admin backend. It feeds all the data to your admin panel interface.&lt;/p&gt;

&lt;p&gt;To get more technical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it translates client requests (from the user browser) into queries to your database.&lt;/li&gt;
&lt;li&gt;it also provides the Forest Admin API Server with the information needed to build the User Interface. This information includes table names, column names and types, and relationships.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A JSON file called the forestadmin-schema.json carries this metadata within the admin backend.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Forest Admin API server
&lt;/h2&gt;

&lt;p&gt;The Forest Admin API Server stores the information to build the user interface. This includes both the database structure (sent by the admin backend) and the UI customization made by the user.&lt;/p&gt;

&lt;p&gt;To get more technical, the information stored includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Display &amp;amp; Order - Which tables and columns should be displayed or hidden? In what order should the columns appear in the 'Table' view?&lt;/li&gt;
&lt;li&gt;Collection Settings (permissions) - Are the records in this table read-only? Can they be deleted? Can they be exported in a .csv file?&lt;/li&gt;
&lt;li&gt;Widget preferences - Which UI component should be rendered for each column (e.g a file viewer for a column that contains images urls).&lt;/li&gt;
&lt;li&gt;Chart configurations - How are the dashboard charts configured and in which position should they appear?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Forest Admin API Server also manages the Forest Admin app's logic like user authentication or billing.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Forest Admin UI server
&lt;/h2&gt;

&lt;p&gt;The Forest Admin UI server stores static assets. These include HTML documents, CSS stylesheets and JS script files. It provides the UI components needed to build the interface that displays the data.&lt;/p&gt;

&lt;p&gt;Now that you have a good overview of the architecture, you may be wondering how the pieces actually interact to make it work.&lt;/p&gt;

&lt;h1&gt;
  
  
  How do all the pieces come together?
&lt;/h1&gt;

&lt;p&gt;Let's figure it out by checking the http calls made between each of the above-mentioned elements when operating a Forest Admin project. Namely calls made:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;between the user's browser and the Forest Admin servers (both UI and API servers),&lt;/li&gt;
&lt;li&gt;between the user's browser and the admin backend,&lt;/li&gt;
&lt;li&gt;between the admin backend and the Forest Admin API servers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Calls made from the user's browser
&lt;/h2&gt;

&lt;p&gt;The following details the calls made by the browser when a user accesses the admin panel from his browser (at app.forestadmin.com).&lt;/p&gt;

&lt;h3&gt;
  
  
  To the Forest Admin UI servers
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fziadgh1%2FForest-Admin-Architecture---sep2020%2Fblob%2Fmaster%2FCalls%2520made%2520to%2520the%2520Forest%2520UI%2520Server.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fziadgh1%2FForest-Admin-Architecture---sep2020%2Fblob%2Fmaster%2FCalls%2520made%2520to%2520the%2520Forest%2520UI%2520Server.png%3Fraw%3Dtrue" alt="Architecture Schema-2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Calls need to go out to the Forest Admin UI server to fetch static assets including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML documents&lt;/li&gt;
&lt;li&gt;CSS stylesheets&lt;/li&gt;
&lt;li&gt;JS scripts&lt;/li&gt;
&lt;li&gt;A map of the assets&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  To the Forest Admin API servers
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fziadgh1%2FForest-Admin-Architecture---sep2020%2Fblob%2Fmaster%2FCalls%2520made%2520to%2520Forest%2520API%2520Server.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fziadgh1%2FForest-Admin-Architecture---sep2020%2Fblob%2Fmaster%2FCalls%2520made%2520to%2520Forest%2520API%2520Server.png%3Fraw%3Dtrue" alt="Architecture Schema-3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Calls need to go out to the Forest Admin API servers to retrieve information regarding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the user logged in,&lt;/li&gt;
&lt;li&gt;the project he's logged into,&lt;/li&gt;
&lt;li&gt;the environment he's logged into,&lt;/li&gt;
&lt;li&gt;the configuration of the rendering to be displayed (i.e. the configuration of the UI),&lt;/li&gt;
&lt;li&gt;the widgets configuration,&lt;/li&gt;
&lt;li&gt;the billings info of the project,&lt;/li&gt;
&lt;li&gt;any updates happening on the UI configuration. This is done through websockets to notify the user a new version of his tool is available.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  To the admin backend
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fziadgh1%2FForest-Admin-Architecture---sep2020%2Fblob%2Fmaster%2FCalls%2520made%2520from%2520the%2520admin%2520backend.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fziadgh1%2FForest-Admin-Architecture---sep2020%2Fblob%2Fmaster%2FCalls%2520made%2520from%2520the%2520admin%2520backend.png%3Fraw%3Dtrue" alt="Architecture Schema-4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Calls need to go out to the admin backend to retrieve/ modify data from the database including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GET calls to retrieve a list of records, the count of a list or the details of record,&lt;/li&gt;
&lt;li&gt;PUT calls to modify a record,&lt;/li&gt;
&lt;li&gt;POST calls to create a new record or trigger a custom action,&lt;/li&gt;
&lt;li&gt;DELETE calls to delete records.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Calls made from the admin backend
&lt;/h2&gt;

&lt;h3&gt;
  
  
  To the database
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fziadgh1%2FForest-Admin-Architecture---sep2020%2Fblob%2Fmaster%2FCalls%2520made%2520from%2520the%2520admin%2520backend-ToDB.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fziadgh1%2FForest-Admin-Architecture---sep2020%2Fblob%2Fmaster%2FCalls%2520made%2520from%2520the%2520admin%2520backend-ToDB.png%3Fraw%3Dtrue" alt="Architecture Schema-5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When calls are made from the browser to the admin backend, the latter translates the call into a database query.&lt;/p&gt;

&lt;h3&gt;
  
  
  To the Forest Admin API servers
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Fziadgh1%2FForest-Admin-Architecture---sep2020%2Fblob%2Fmaster%2FCalls%2520made%2520from%2520the%2520admin%2520backend-ToFA-API.png%3Fraw%3Dtrue" 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%2Fgithub.com%2Fziadgh1%2FForest-Admin-Architecture---sep2020%2Fblob%2Fmaster%2FCalls%2520made%2520from%2520the%2520admin%2520backend-ToFA-API.png%3Fraw%3Dtrue" alt="Architecture Schema-6"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In order to ensure that the UI reflects the structure of the database, the admin backend needs to send calls containing the information from the forestadmin-schema.json to the Forest Admin API servers. This file is sent upon every restart of the admin backend server.&lt;/p&gt;

&lt;p&gt;At the startup of the admin backend and periodically afterwards, calls are also made to the Forest Admin API servers to retrieve permissions. This protects the data from being accessed by unauthorized users through curl requests for example.&lt;/p&gt;

&lt;p&gt;Now that we've detailed how Forest Admin works, let's discuss why we went that way.&lt;/p&gt;

&lt;h1&gt;
  
  
  What are the benefits of such an architecture?
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Build internal tools with privacy baked in right from the start
&lt;/h2&gt;

&lt;p&gt;We can't store any of your data because we never get to see it. You own your admin backend. That means no Forest Admin backend (on our servers) proxying requests to your database.&lt;/p&gt;

&lt;p&gt;You can host it in the cloud architecture you want. You can shield your admin backend to comply with any of your security requirements - VPN, VPC, DMZ...you name it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your internal tools, your rules
&lt;/h2&gt;

&lt;p&gt;You own the admin backend and can extend it like any node.js app. Using JavaScript and npm packages, you can add any custom logic you want. When you create a record you want to add an automatic email alert on top of inserting a row in your database? You can do so by easily overriding the default create route from your admin backend for example.&lt;/p&gt;

&lt;p&gt;This means you can also keep track of any changes using Git, containerize your app using Docker, deploy on your favorite Cloud Hosting Provider... You remain in control.&lt;/p&gt;

&lt;h2&gt;
  
  
  You do half the work, we take care of the other half
&lt;/h2&gt;

&lt;p&gt;This architecture lets you benefit from improvements and new features by updating to our newer versions of the API. All it takes is one command &lt;code&gt;npm install forest-express-[sequelize|mongoose]@latest&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You also benefit from continuous updates brought to the UI by refreshing your browser page. Again, one command Cmd+Shift+R.&lt;/p&gt;

&lt;h1&gt;
  
  
  So, what next?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Want to try our admin panel framework? Head &lt;a href="//app.forestadmin.com/signup"&gt;here&lt;/a&gt;!🌲&lt;/li&gt;
&lt;li&gt;Curious what it looks like? Take a peek at our &lt;a href="https://app.forestadmin.com/Live%20Demo/Production/Operations?livedemo" rel="noopener noreferrer"&gt;live demo&lt;/a&gt; 💻&lt;/li&gt;
&lt;li&gt;Interested in deep diving into the tech behind Forest? Peruse our &lt;a href="https://docs.forestadmin.com/documentation/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; 📚&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>adminpanel</category>
      <category>internaltools</category>
    </item>
  </channel>
</rss>
