<?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: Tanisha</title>
    <description>The latest articles on DEV Community by Tanisha (@tanisha).</description>
    <link>https://dev.to/tanisha</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%2F737841%2F23aaefe6-88c2-429a-869e-fd15c864d476.jpg</url>
      <title>DEV Community: Tanisha</title>
      <link>https://dev.to/tanisha</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tanisha"/>
    <language>en</language>
    <item>
      <title>How to add Role Based Access Control (RBAC)</title>
      <dc:creator>Tanisha</dc:creator>
      <pubDate>Mon, 17 Jul 2023 06:19:56 +0000</pubDate>
      <link>https://dev.to/canonic/how-to-add-role-based-access-control-rbac-1g6e</link>
      <guid>https://dev.to/canonic/how-to-add-role-based-access-control-rbac-1g6e</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Canonic is a low-code platform for building tools and automation. You can create tools end-to-end without writing any or very little code. This helps you save countless hours and allows you to focus on the more critical tasks at hand.&lt;/p&gt;

&lt;p&gt;Internal tools are often tightly secured with role-based access control and different users might have access to additional features and pages. It becomes essential to have an easy way to maintain access to the tools that you build.&lt;/p&gt;

&lt;p&gt;In this tutorial, we will go over adding access control to your internal tools on Canonic. We will use the user authentication addon to enable role-based access control in a few short steps.&lt;/p&gt;

&lt;p&gt;Let's begin! 🚀&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
## Adding login workflows and pages

We will use the login addon to add authentication. It comes bundled with all the pages, workflows, and tables required to add role-based access control.

**Create a project**
First, let's create a project. If you already have an existing project you would like to add auth to, you can safely skip this step.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xnv1t5ki3mg0ntunixfv.gif)

- Login to Canonic
- Click on +Project to create a new project
- Select Start from scratch, and don't add anything else.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cc9gleqw91ra330k1niu.gif)

``
**Add the Login addon**
To add the login addon, press ⌥ + A to open the addon browser and select the login addon. Hit + Add to add the addon to your project.

If the addon was added correctly, you will see a couple of new pages, endpoints, and tables. The login addon should now be configured.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4gll2x63tcfrfjam2lb7.gif)

**Creating a user**
It's time to create a test user! Before we can create a user, we need to deploy the project. Once that's done, you can create a new user using the Create user page. This page is only available to builders and can be used to create new users on demand.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2nneyhwqawc066h83msg.gif)

- Go to the create user page.
- Add a dummy email and password and click on the create button.
- A success alert should indicate that the user has been created successfully.

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Configuring Roles&lt;/strong&gt;&lt;br&gt;
Roles allow you to determine different access levels. Roles and their names differ based on tools so Canonic allows you to define your own roles.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For example, a user with a read-only role should not be allowed to edit any data on the tool. This role might be called viewer or read-only.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Add roles&lt;/strong&gt;&lt;br&gt;
To add a role, navigate to the newly created user table. This table should be under the data sources section in the left-hand navigation.&lt;/p&gt;

&lt;p&gt;Click on the roles field in the user table. This is the field that stores what role each user is assigned. Let's add a few roles. We can also set the default role for each user.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2jdog-Uh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/scsuwfz6xw891y4i5w53.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2jdog-Uh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/scsuwfz6xw891y4i5w53.gif" alt="Image description" width="600" height="347"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**Assign roles to users**
When a new user is created, the default role is assigned unless manually specified. You can always change the role for a user by navigating to the CMS.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zl2tibt80rq9yzouwbwg.gif)

``



**Adding Access Control**
At this stage, you should have a fully working login page. However, how do you implement access control?

&amp;gt; Access control allows users to have access to only certain pages and functionalities based on their role.

**Make login your default page**
Let's make login the default page to open when loading the app. It should redirect to the actual homepage if the user is already logged in. Let's configure that:

- Right-click on the login page and select Mark as homepage
- Open the page settings for the login page. Under Access Control, add a new rule to redirect to the homepage once logged in. (This should already be configured if you've used the addon)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5zclt5778lo93bw8jq8w.gif)

``
**Configure access to pages**
By default all pages that you create are public. Let's use access control to redirect users to the login page if they don't have the right permissions.

- Open the page settings for the page you want to add access control to.
- Add a role check in the condition endpoints.authenticate.role.value === "ADMIN"
- This will check to make sure the user's role is admin.
- Trigger a redirect to the login page if the check fails.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ff1zu8xrwcp7in82n8ci.gif)

``

**Configure access to components**
Sometimes you want to show certain components based on the user's access. For example, you might want to show the Refund button next to orders only if they have refund access.

- Open configuration for the component you want to access control
- Scroll down to the hidden field, and add your role check there.
endpoints.authenticate.role.value === "ADMIN"

That's it, you should have access control working for all the pages you configured.

``
**Test the implementation**
Let's quickly test the implementation.

- Deploy the project.
- Open the link to your deployed app. It should open the login page by default
- Enter the credentials you created in the earlier step. It should log you in and take you to the homepage.
- Try opening this URL in incognito, since you're not signed in there, you should be taken to the login page

``

Conclusion
That's all folks. As you can see, role-based access control is incredibly easy on Canonic despite being a complex feature. It's always important to maintain access control rules for all your internal tools and dashboards to ensure that only authorized users have access to your data.

Canonic never stores your data and all authentication data is encrypted at rest for maximum security.

As usual, let us know your feedback in the comments, and feel free to reach out to us at hello@canonic.dev

Onwards &amp;amp; upwards 🚀

``
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>tutorial</category>
      <category>nocode</category>
      <category>lowcode</category>
    </item>
    <item>
      <title>How to Create a Database Tables in Canonic</title>
      <dc:creator>Tanisha</dc:creator>
      <pubDate>Tue, 31 May 2022 12:53:33 +0000</pubDate>
      <link>https://dev.to/canonic/how-to-create-a-database-tables-in-canonic-2n60</link>
      <guid>https://dev.to/canonic/how-to-create-a-database-tables-in-canonic-2n60</guid>
      <description>&lt;p&gt;&lt;a href="https://canonic.dev/?utm_source=dev.to&amp;amp;utm_medium=organic_article&amp;amp;utm_campaign=may15-30&amp;amp;utm_term=firstlink&amp;amp;utm_content=may30"&gt;Canonic&lt;/a&gt;:The simplest way for agile teams to build internal tools.&lt;/p&gt;

&lt;p&gt;You can model your database in form of tables. The Graph tab is the default page that will pop up once you are inside your project. Working on a graph with Canonic comes at super ease with a mindmap-like interface.&lt;/p&gt;

&lt;p&gt;Let's look into the various aspects of building a table, the required setting, and more.&lt;/p&gt;

&lt;p&gt;→ Once you are inside your project in Canonic, you will see something like this:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k2pMVShM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4pl0n7ii9c0ekj3opo3z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k2pMVShM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4pl0n7ii9c0ekj3opo3z.png" alt="Image description" width="750" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Create a table for your database
&lt;/h2&gt;

&lt;p&gt;Click on the + icon on the left-hand side panel. It will give you the following three options to choose from:&lt;/p&gt;

&lt;p&gt;+TABLE&lt;br&gt;
+ENDPOINT&lt;br&gt;
+TRIGGER&lt;/p&gt;

&lt;p&gt;While we will look into each of them in our upcoming articles, in this one we will explore the table section of the graph.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2vr_VKrJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2jcfe0ixds7u1us5uva5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2vr_VKrJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2jcfe0ixds7u1us5uva5.png" alt="Image description" width="570" height="494"&gt;&lt;/a&gt;&lt;br&gt;
Select the first option - TABLE to create a table to hold all your fields.&lt;/p&gt;

&lt;p&gt;Name the table and select the type:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Individual Tables: Stores a single piece of content for the graph that you define.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;List Tables: Stores an array or a list of content entries for the graph that you define.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Identity Tables: A unique type of User table that enables you to manage and store your users' data as well as support multiple login providers.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You'll also have to define the KEY, a unique identifier that is used in APIs&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UzRX6gYj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u2c263du4luc6bpa2y6d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UzRX6gYj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u2c263du4luc6bpa2y6d.png" alt="Image description" width="750" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Explore the Table settings
&lt;/h2&gt;

&lt;p&gt;This is what the setting section looks like on the right-hand side panel:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GSZrQnQ2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xdr6tidycnrvvu1csb5y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GSZrQnQ2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xdr6tidycnrvvu1csb5y.png" alt="Image description" width="750" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first option you get is to select the Type that fits best the data requirements, within which you've three options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;LIST&lt;/li&gt;
&lt;li&gt;STANDALONE&lt;/li&gt;
&lt;li&gt;IDENTITY&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oHOioUec--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3y0dem0hzwyfni2qfxb1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oHOioUec--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3y0dem0hzwyfni2qfxb1.png" alt="Image description" width="515" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ Use LIST: If multiple data points can be defined&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sXczLbBf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p56v45zcpz5emle2ea6y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sXczLbBf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p56v45zcpz5emle2ea6y.png" alt="Image description" width="138" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;→ Use STANDALONE: If there's only a single data point per project&lt;br&gt;
 &lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oTOk476k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ok14tpqsxwupzt0lviji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oTOk476k--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ok14tpqsxwupzt0lviji.png" alt="Image description" width="126" height="92"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, you've to give the NAME &amp;amp; KEY for your project:&lt;/p&gt;

&lt;p&gt;NAME - Choose a name that best describes the table&lt;br&gt;
KEY - The unique identifier (used in APIs)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to Modify your generated Tables: &lt;/strong&gt;&lt;br&gt;
If you wish to edit your created tables: &lt;/p&gt;

&lt;p&gt;-&amp;gt; Editing Table - The table can be edited by clicking on the table and an editing panel will appear on the right side. There is a properties panel at the bottom of the table where all the necessary fields can be edited.&lt;/p&gt;

&lt;p&gt;-&amp;gt; Deleting a Table - You can delete a table by right-clicking on it and selecting delete. All fields and fieldsets within the table will be deleted permanently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generating Endpoints for your database table&lt;/strong&gt;&lt;br&gt;
The last option in the table setting is 'GENERATE ENDPOINTS'. Here, you can select the endpoint that you require. In Canonic, you can generate default CRUD endpoints for the table:&lt;/p&gt;

&lt;p&gt;CREATE, UPDATE, DELETE, GETALL, GETONE&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nXiH0e4K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/thz98l8pvceymr9yqr6l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nXiH0e4K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/thz98l8pvceymr9yqr6l.png" alt="Image description" width="521" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose the one you require and hit 'Generate'. These endpoints can also be generated later on as you move ahead with your product development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Create Fields for your database table
&lt;/h2&gt;

&lt;p&gt;When you'll click the + button next to the table node on the graph, you'll get three options:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Field - Choose when you want to create an individual field.&lt;/li&gt;
&lt;li&gt;FieldSet - Choose when you want to group the fields.&lt;/li&gt;
&lt;li&gt;Integrations - Choose when you wish to create an external integration.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BSdLGiLe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bmedxsggk92nlf71qfm5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BSdLGiLe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bmedxsggk92nlf71qfm5.png" alt="Image description" width="277" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Set 4: Exploring Fields and FieldSets
&lt;/h2&gt;

&lt;p&gt;Fields define what data your table will contain and can be of different types such as text, image, file, date, time, etc. They directly impact how the CMS and the APIs work.&lt;/p&gt;

&lt;p&gt;Click the + button next to a table or fieldset node on the graph to create a field. A new field will appear on the graph with the properties panel visible below it. Fill in the fields as needed and close the properties panel to save your changes.&lt;/p&gt;

&lt;p&gt;When a table entry is created, all fields support setting default values that will be used if no value is provided for the field.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WJaa63wl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3jvv9gs9iej5kzodtnsm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WJaa63wl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3jvv9gs9iej5kzodtnsm.png" alt="Image description" width="750" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Field Validation:&lt;/strong&gt;&lt;br&gt;
By adding validations to the field, we ensure the correct data is being saved corresponding to the field.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MKW8DCLA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9qk0gikt494e10z7inrp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MKW8DCLA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9qk0gikt494e10z7inrp.png" alt="Image description" width="750" height="991"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FieldSets:&lt;/strong&gt;&lt;br&gt;
You can either use FieldSets to group together some fields based on semantics or to store a list of entries for that group of data. When you create a FieldSet, you'll see a section on the right that lets you select the type of FieldSet you're looking for:&lt;br&gt;
List - To define multiple datapoints&lt;br&gt;
Standalone - To define a single data point&lt;/p&gt;

&lt;p&gt;Other than the type, you will have to give a 'Name' that describes the fieldset and the KEY as the unique identifier used in APIs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hOT7vhK8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mp3cl7oqkor4vbp3h7et.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hOT7vhK8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mp3cl7oqkor4vbp3h7et.png" alt="Image description" width="750" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQs:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. How to link a database table to other tables?&lt;/strong&gt;&lt;br&gt;
Tables in databases are often linked together using foreign keys; in Canonic, this is done using Resource Fields, allowing the field to contain the information that's populated from your other tables.&lt;/p&gt;

&lt;p&gt;How to create a link:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make sure the table you're linking has been created.&lt;/li&gt;
&lt;li&gt;Create a new Resource field that will act as the foreign key.&lt;/li&gt;
&lt;li&gt;Now to create a Resource field - In the type properties of that field, select the table you wish to link to from the dropdown list.&lt;/li&gt;
&lt;li&gt;Publish your graph.&lt;/li&gt;
&lt;li&gt;You can now create CMS entries. Dropdown options for the field will be synced with entries for the table you linked to and will be presented as a drop-down in the CMS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. What are computed fields?&lt;/strong&gt;&lt;br&gt;
A computed field is the one that is computed whenever you request it. You can create a computed field by marking the input type as Computed while creating a new field. This computed field will always return an object and one can't directly set a value to these fields.&lt;/p&gt;

&lt;p&gt;Learn more about computed fields here&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l9KeNS0Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/12auuwouy64n6kju784l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l9KeNS0Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/12auuwouy64n6kju784l.png" alt="Image description" width="536" height="333"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  And with that, you've modeled your database table 💃
&lt;/h2&gt;

&lt;p&gt;Thanks for reading! We hope you're able to build the tables for your projects at ease. &lt;/p&gt;

&lt;p&gt;You can also integrate your external databases with Canonic, know-how 👇&lt;br&gt;
&lt;a href="https://blog.canonic.dev/articles/integrating-external-databases-with-canonic/"&gt;Integrating external databases with Canonic&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have any suggestions, or feedback for us please feel free to reach out, it's always great to hear back from you.👯‍♀️&lt;br&gt;
Give &lt;a href="https://canonic.dev/?utm_source=dev.to&amp;amp;utm_medium=organic_article&amp;amp;utm_campaign=may15-30&amp;amp;utm_term=secondlink&amp;amp;utm_content=may30"&gt;Canonic &lt;/a&gt;a try? 🚀&lt;/p&gt;




</description>
      <category>api</category>
      <category>integrations</category>
      <category>lowcode</category>
      <category>appgyver</category>
    </item>
    <item>
      <title>How to integrate external API endpoints in AppGyver</title>
      <dc:creator>Tanisha</dc:creator>
      <pubDate>Tue, 26 Apr 2022 09:43:36 +0000</pubDate>
      <link>https://dev.to/canonic/how-to-integrate-external-api-endpoints-in-appgyver-1226</link>
      <guid>https://dev.to/canonic/how-to-integrate-external-api-endpoints-in-appgyver-1226</guid>
      <description>&lt;p&gt;With the advent of low-code/no-code platforms, building applications has become much easier. The AppGyver platform is one such no-code platform where you can develop applications without having to code.&lt;/p&gt;

&lt;p&gt;Now that we have a clear understanding of the platform, let’s dive into the functioning and step-by-step guide to integrate external API endpoints in the platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to integrate external API endpoints in AppGyver
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Open your Project in AppGyver &amp;amp; Go to the Data button&lt;/strong&gt;&lt;br&gt;
Once you are inside your project, go to the Data button at the top of the toolbar, to create new external data resources or to edit the existing ones.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9xSvkhVE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ljti4wtayc8tgqtr7oyf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9xSvkhVE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ljti4wtayc8tgqtr7oyf.png" alt="Image description" width="656" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Add Data Resources&lt;/strong&gt;&lt;br&gt;
Once you’re into the data tab go to the Add Data Resources by clicking on plus sign in the top right corner, which will have a dropdown of 5 different options from which we will select — Rest API direct Integration to integrate external API endpoint.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zKzB7BHM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p5tlbpn27a2kj8t0zodk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zKzB7BHM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p5tlbpn27a2kj8t0zodk.png" alt="Image description" width="656" height="283"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Step 3: Base Configuration&lt;/strong&gt;&lt;br&gt;
The resource configuration is split into base configuration and method configurations for GET collection, GET record, POST, PUT/PATCH and DELETE.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UwdWWblh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bcygxadqskg4c309cwo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UwdWWblh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bcygxadqskg4c309cwo.png" alt="Image description" width="656" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Base Configuration:
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Here, you define the base configuration:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resource ID: unique ID for the resource in your app&lt;/li&gt;
&lt;li&gt;Base URL: URL shared between all methods&lt;/li&gt;
&lt;li&gt;Path variables: Use to make parts of the URL dynamic&lt;/li&gt;
&lt;li&gt;Headers: HTTP headers to be included in every API call made to this external resource&lt;/li&gt;
&lt;li&gt;Query parameters: Parameters to be included in every API call made to this external resource&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Canonic for the Backend
&lt;/h2&gt;

&lt;p&gt;Here, we will be using &lt;a href="https://canonic.dev/?utm_source=dev.to&amp;amp;utm_medium=organic_article&amp;amp;utm_campaign=april16-31&amp;amp;utm_term=firstlink&amp;amp;utm_content=april26"&gt;Canonic&lt;/a&gt; to generate all the required APIs endpoints that we need to integrate with AppGyver.&lt;/p&gt;

&lt;p&gt;Canonic is the simplest way for agile teams to build internal tools.&lt;/p&gt;

&lt;p&gt;In Canonic, you can directly get your Base Configuration by:&lt;br&gt;
Going to your project in Canonic → Docs section → Copy the URL&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ek5hxoRv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t4ogzhzq40hu3o8ys2z9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ek5hxoRv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t4ogzhzq40hu3o8ys2z9.png" alt="Image description" width="656" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you have your URLs ready, get back on AppGyver and place them at the required spot as shown in the picture below.&lt;br&gt;
With that, you have your base configuration ready! 💃&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6gOJFvnG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rocr7tlcrkh9s08yqk93.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6gOJFvnG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rocr7tlcrkh9s08yqk93.png" alt="Image description" width="656" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploring the API methods
&lt;/h2&gt;

&lt;p&gt;Now that we have our base config in place, let’s see how can we integrate all these different methods in our project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Collection (GET):
&lt;/h2&gt;

&lt;p&gt;The base URL will automatically reflect in all other tabs. So, all you now have to do is fill in the Relative path/ Response key and Test API call response.&lt;/p&gt;

&lt;p&gt;For Get Collection, there’s no specific id required because we are retrieving the collection of data from a server.&lt;/p&gt;

&lt;p&gt;Thus, will go in with the Relative path and Response key.&lt;br&gt;
Response key — The JSON response from an API might include the actual data we are interested in inside a key of the main response object.&lt;/p&gt;

&lt;p&gt;Which in Canonic’s case is data:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ykyWbBgA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6tk1bgfeyvhc5u9l8zdx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ykyWbBgA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6tk1bgfeyvhc5u9l8zdx.png" alt="Image description" width="507" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4jun5HEV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mkdblydukbug4lxa27na.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4jun5HEV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mkdblydukbug4lxa27na.png" alt="Image description" width="656" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’ve correctly followed and tested, you’ll get something like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L7SUoG5X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rybqz8taiyaq85besqrs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L7SUoG5X--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rybqz8taiyaq85besqrs.png" alt="Image description" width="656" height="303"&gt;&lt;/a&gt;&lt;br&gt;
 Similarly, all you have to do is copy the required URL which you get readily available with Canonic, put them in dedicated fields.&lt;/p&gt;

&lt;h2&gt;
  
  
  GET RECORD (GET):
&lt;/h2&gt;

&lt;p&gt;GET method is used to retrieve data from a server at the specified resource.&lt;/p&gt;

&lt;p&gt;Now to retrieve some data, we need to specify which data we are required to fetch, and hence we’ll need to pass the id and Access Tokens (represent the authorization of a specific application to access specific parts of a user’s data).&lt;/p&gt;

&lt;p&gt;Go to Canonic — Select Product (GET) — Copy the URL from the endpoint section.&lt;/p&gt;

&lt;p&gt;As the base URL is already set we will just paste /products/:_id on AppGyver’s Relative path section.&lt;/p&gt;

&lt;p&gt;Now, we need to pass the id, which you can get by following:&lt;br&gt;
Canonic → Project → CMS section → Under the CMS entry title you can see the id (shown in the image below).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2MxdDlIU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eq85awji3dv5fvn6u442.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2MxdDlIU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eq85awji3dv5fvn6u442.png" alt="Image description" width="656" height="253"&gt;&lt;/a&gt;&lt;br&gt;
Copy the id and pass in the Relative path of Appygyver&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access Tokens: This broadly has two steps&lt;/strong&gt;&lt;br&gt;
&lt;em&gt;1. Creating Access Token in the backend&lt;/em&gt;: &lt;br&gt;
As we are using Canonic as our backend, the access tokens can be created within minutes.&lt;/p&gt;

&lt;p&gt;Go to settings→ AccessTokens → Create A New Token → Give it a name and provide access → click on create → copy the value.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fzeCaZnd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pzg9fn98wprtshklrmwd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fzeCaZnd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pzg9fn98wprtshklrmwd.png" alt="Image description" width="578" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2. Embedding access Token in AppGyver:&lt;/em&gt;&lt;br&gt;
In AppGyver, the access tokens need to be embedded in the HTTP Header section, where you’ll require the below fields:&lt;/p&gt;

&lt;p&gt;In the config tab of AppGyver → Http Header → On the right-hand side panel fill all the required details:&lt;/p&gt;

&lt;p&gt;Key: The exact key name of the authorization Label: Name this as per your understanding Value type: Text Description: Description of the token&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3mk8iXl0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i379tvq57orrqf20kpdm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3mk8iXl0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i379tvq57orrqf20kpdm.png" alt="Image description" width="656" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to the Test tab to run a test and in the URL placeholder, mention the id of the product that we copied earlier.&lt;/p&gt;

&lt;p&gt;Once the access token is in place, run a test (here you need to mention the id as well) and that’s it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1-aiYhYL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/owxb8ufudjupdcp0vew6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1-aiYhYL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/owxb8ufudjupdcp0vew6.png" alt="Image description" width="656" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You’ve successfully retrieved data from a server ✅&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XotI-MXb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/80jsxua95y2szd0phfi5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XotI-MXb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/80jsxua95y2szd0phfi5.png" alt="Image description" width="656" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  CREATE RECORD (POST):
&lt;/h2&gt;

&lt;p&gt;A POST is used to create or update a resource on a server. POST data is sent to the server in the request body of the HTTP request.&lt;/p&gt;

&lt;p&gt;Here, we will require to specify the data that we want to store in the server.&lt;/p&gt;

&lt;p&gt;Let’s see how to do that 👇&lt;br&gt;
Go to Canonic — Docs Section — Select Create product (post)- Copy the URL from the endpoint section.&lt;br&gt;
Go to AppGyver -&amp;gt; CREATE RECORD (POST) → paste the relative path ****&lt;br&gt;
As the base URL is already set we will just paste the required specific field on the Relative path’s section.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sending the Payload&lt;/strong&gt;&lt;br&gt;
Now as additional steps to send the payload, go to the schema tab → Create record (POST) request schema&lt;br&gt;
Here, we will specify our data requirements which are name and description with the input object.&lt;/p&gt;

&lt;p&gt;Go to add Property → mention key as input and value type as object. Within which we will add the rest of the values, in our example’s case, name and description with key as name and description and value type as text.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--woWe-sVA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y9effzzj1bezj8kl7q6k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--woWe-sVA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y9effzzj1bezj8kl7q6k.png" alt="Image description" width="656" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once done, Go to the test tab and custom object and mention the required name and description which will get updated in your backend, in this case — Canonic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0Xaet4jX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/36zm9o4liy20as0pcd9d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0Xaet4jX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/36zm9o4liy20as0pcd9d.png" alt="Image description" width="656" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  DELETE RECORD (DELETE):
&lt;/h2&gt;

&lt;p&gt;Similarly to delete the record, we will need to pass a specific id (which we want to delete).&lt;/p&gt;

&lt;p&gt;Go to Canonic — Docs Section — Select Delete product (delete)- Copy the URL from the endpoint section.&lt;/p&gt;

&lt;p&gt;Go to AppGyver -&amp;gt; DELETE RECORD (DELETE)→ In the config section tab, paste /products/:_id on the Relative path’s section.&lt;/p&gt;

&lt;p&gt;Follow the same pattern of updating id and custom object&lt;br&gt;
(Ref above to get Product id from Canonic)&lt;/p&gt;

&lt;p&gt;One all the fields are set, run Test API call response&lt;/p&gt;

&lt;h2&gt;
  
  
  UPDATE RECORD (PUT):
&lt;/h2&gt;

&lt;p&gt;The same process will apply to PUT in which the method will search for the input if found will update it or will create a new record, quite similar to the steps we did in the POST method.&lt;/p&gt;

&lt;p&gt;If you will follow the steps right, you will be able to external API endpoints in AppGyver with ease! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  Voila, you’re done!✨
&lt;/h2&gt;

&lt;p&gt;Yes, that was it. Here are all the links you’ll require:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.appgyver.com/"&gt;AppGyver &lt;/a&gt;— A no-code platform, enabling you to build apps for all form factors, including mobile, desktop, browser, TV, and others.&lt;/p&gt;

</description>
      <category>api</category>
      <category>integrations</category>
      <category>appgyver</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Test Low Code APIs using Canonic?</title>
      <dc:creator>Tanisha</dc:creator>
      <pubDate>Thu, 21 Apr 2022 07:19:56 +0000</pubDate>
      <link>https://dev.to/canonic/how-to-test-low-code-apis-using-canonic-2gj5</link>
      <guid>https://dev.to/canonic/how-to-test-low-code-apis-using-canonic-2gj5</guid>
      <description>&lt;p&gt;Low-code programming represents &lt;strong&gt;underlying code and functionality visually in a graphical user interface. In a low-code API integration tool, users manipulate the visual elements in the graphical user interface&lt;/strong&gt; to specify the functionality they want the integration to achieve. In the case of &lt;a href="https://canonic.dev/?utm_source=dev.to&amp;amp;utm_medium=organic_article&amp;amp;utm_campaign=april16-31&amp;amp;utm_content=april20"&gt;Canonic&lt;/a&gt;, the user interacts with the graph interface and builds a backend setup that they can deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is it tough to test low code APIs?
&lt;/h2&gt;

&lt;p&gt;Usually, with low-code APIs, the problem comes when changes are required in the API. Whenever any changes are made to the graphical user interface, in order for them to be tested they need to be deployed. When these APIs are deployed, all the frontend applications relying on them become vulnerable to any bugs that could've been shipped with the changes to the API. This could potentially result in downtime and is not ideal for a production setup.&lt;br&gt;
To solve this problem of not being able to test changes before they are deployed, Canonic came up with the environment set up on their platform.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is an environment setup?
&lt;/h2&gt;

&lt;p&gt;Environments in terms of software engineering can be simply explained with the example of an isolated sandbox. Each environment is an isolated instance where you can run your software and consume APIs.&lt;br&gt;
Here are some of the keywords about environment setup and what they usually mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deployment&lt;/strong&gt; : All the activities that make software available for use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment&lt;/strong&gt; : The Operating System, API calls, and databases used by the software&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Development Environment&lt;/strong&gt; : The environment catering to developers for building software&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Staging Environment&lt;/strong&gt; : A replica of production environment where changes are tested before production deployment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production Environment&lt;/strong&gt; : The environment catering to the end-user of your software&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For now, we know we only have one environment available to us where if we deploy any new changes they are reflected in the APIs. Let's call this environment "production" (as seen in canonic).&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fogt3750v7r6q8e0iqb9v.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%2Fuploads%2Farticles%2Fogt3750v7r6q8e0iqb9v.png" alt="Environments in Canonic Project"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How will an environment setup help me?
&lt;/h2&gt;

&lt;p&gt;To solve the problem of not having a medium to test APIs for the project, &lt;a href="https://canonic.dev/?utm_source=dev.to&amp;amp;utm_medium=organic_article&amp;amp;utm_campaign=april16-31&amp;amp;utm_content=april20"&gt;Canonic&lt;/a&gt; allows you to set up multiple environments for your project.&lt;br&gt;
Setting up an additional environment gives us a lot of leverage in terms of experimentation and pushing code changes to APIs without actually worrying about the side effects on production APIs and their consumers.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to set up environments in my Canonic project?
&lt;/h2&gt;

&lt;p&gt;To add an environment, you simply need to go to your project's settings and go to the environments tab. As you can see we only have one environment existing in our current setup which is production&lt;/p&gt;

&lt;p&gt;Now we click on the &lt;code&gt;+&lt;/code&gt; sign right next to environments, and we will see a new environment popup. As seen below, you can name this env &lt;code&gt;staging&lt;/code&gt; or you can also name it development alternatively based on your preference.&lt;/p&gt;

&lt;p&gt;Once you are done with the naming, click on &lt;code&gt;+ CREATE&lt;/code&gt; button as you can see in the attached screenshot.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foc79qd1bs56bvjtre5rv.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%2Fuploads%2Farticles%2Foc79qd1bs56bvjtre5rv.png" alt="Name and create your new environment"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the env creation is successful you will see a popup saying "Environment Created" as shown in the screenshot below.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnzshmdkhv2281dtsxtdh.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%2Fuploads%2Farticles%2Fnzshmdkhv2281dtsxtdh.png" alt="Environment Created Success Popup"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This means now our project has a new environment that we can use to test our changes.&lt;/p&gt;

&lt;p&gt;Till this point, we have created a new env, but we have not deployed it yet. To deploy it, we need to go to the Deploy button on the top right of the page and deploy the project again. As you can see in the below screenshot, we now have Staging in our list of environments, and it is not deployed, so we simply select staging and then click on the deploy CTA.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbti27vf4hr5k1tjv8b5.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%2Fuploads%2Farticles%2Fhbti27vf4hr5k1tjv8b5.png" alt="Deploy Project Popup when new env is added"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the new env is deployed, you will see a deployment successful message along with the URL for your new environment.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5iey6qeasrlx0t6qfzjm.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%2Fuploads%2Farticles%2F5iey6qeasrlx0t6qfzjm.png" alt="New Environment Successfully deployed"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And Voila! we have a staging environment setup to test our changes before they go live on production.&lt;/p&gt;




&lt;p&gt;Thanks for reading! If you find this story helpful, please click the 👏 button and share it to help others find it! Feel free to leave a comment 💬 below.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>api</category>
      <category>nocode</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Integrate Github with Asana to track issues in repositories</title>
      <dc:creator>Tanisha</dc:creator>
      <pubDate>Thu, 16 Dec 2021 12:41:41 +0000</pubDate>
      <link>https://dev.to/canonic/integrate-github-with-asana-to-track-issues-in-repositories-6p1</link>
      <guid>https://dev.to/canonic/integrate-github-with-asana-to-track-issues-in-repositories-6p1</guid>
      <description>&lt;p&gt;Over time the need for different services grows in a SaaS startup, from something as simple as sending out a slack notification to something more complex as &lt;strong&gt;Integrate Github with Asana&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;In this case, maintaining and scaling these numerous Micro-services and Integrations is a huge developer overhead task.&lt;/p&gt;

&lt;p&gt;Our previous guide covered sending a notification to Slack, and today we will move on to a bit more complex integrations ie; how you can integrate Github with Asana to track issues in repositories&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's get started! 🚀
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create a Asana account&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;We'll be setting up an automated pipeline to create tasks on your Asana project whenever a new issue is created on your Github repository. So make sure you have your you have an asana account, or you can create from &lt;a href="https://asana.com/create-account" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Let’s begin with the integrations! 👩‍🔧&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All you have to do is, go to this &lt;a href="https://app.canonic.dev/projects/61ba6a6ab6586d0026b0f9cd?utm_source=dev.to&amp;amp;utm_medium=organic_article&amp;amp;utm_campaign=30daysofcanonic_uc_3&amp;amp;utm_term=step2_sample_project&amp;amp;utm_content=day_17"&gt;sample project&lt;/a&gt; and click on the top right corner to clone it.&lt;/p&gt;

&lt;p&gt;This project already has &lt;strong&gt;Github&amp;lt;&amp;gt;Asana integration set up&lt;/strong&gt;. So after cloning the project, we are set to move forward and get started. &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9ysyn60k7lx8u0nhhmo.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%2Fuploads%2Farticles%2Ft9ysyn60k7lx8u0nhhmo.png" alt="Project Clone"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Explore the API tab 👩‍💻&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the same project, from the left-hand navigation bar, move to the API tab. &lt;/p&gt;

&lt;p&gt;There on the left-hand panel, you’ll find different divisions like - &lt;strong&gt;Endpoints, Scheduled triggers, DB triggers, Integration triggers, etc&lt;/strong&gt;. In the integrations triggers, you should find an integration setup!&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ucrkfqb55glxkmiw7vb.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%2Fuploads%2Farticles%2F5ucrkfqb55glxkmiw7vb.png" alt="Step 3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Setup GitHub Integration ✨&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let's see how you can modify this Github integration trigger that runs whenever the count of issues in the repository changes, i.e. Whenever a new issue is added to the repository.&lt;/p&gt;

&lt;p&gt;Click on the &lt;a href="https://app.canonic.dev/projects/61ba6a6ab6586d0026b0f9cd/api-2?utm_source=dev.to&amp;amp;utm_medium=organic_article&amp;amp;utm_campaign=30daysofcanonic_uc_3&amp;amp;utm_term=step4_githubIssues&amp;amp;utm_content=day_17"&gt;&lt;strong&gt;GithubIssues&lt;/strong&gt;&lt;/a&gt; trigger node and it’ll open up the Properties panel for it. &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffy99di4cxfekp5tnfvxb.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%2Fuploads%2Farticles%2Ffy99di4cxfekp5tnfvxb.png" alt="Github Integration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see that we've selected the &lt;code&gt;ListRepositoryIssues&lt;/code&gt; API from Github here. It'll &lt;strong&gt;listen to any changes&lt;/strong&gt; to the response of this API and will &lt;strong&gt;trigger your workflow&lt;/strong&gt; if the changes match any of the filters you've added. For this example, we are checking the list of the issues returned from Github is changing or not.&lt;/p&gt;

&lt;p&gt;Now &lt;strong&gt;add your own repositories details&lt;/strong&gt; in the API Configuration Section:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzg0hxd0ay0ooyqb8var5.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%2Fuploads%2Farticles%2Fzg0hxd0ay0ooyqb8var5.png" alt="API Configuration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Setup Asana Integration ✨&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click on the &lt;code&gt;Asana&lt;/code&gt; node and you can see the &lt;code&gt;Create a Task&lt;/code&gt; API of Asana is already setup. &lt;strong&gt;Add API Key&lt;/strong&gt; in the authentication section to connect with your account. &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzablepxi5ion2jtxk7on.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%2Fuploads%2Farticles%2Fzablepxi5ion2jtxk7on.png" alt="Asana Integration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Move on to the &lt;code&gt;Optional&lt;/code&gt; tab of the panel and add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;{{0.title}}&lt;/code&gt; in the &lt;code&gt;name&lt;/code&gt; field&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;{{0. body}}&lt;/code&gt; in the &lt;code&gt;notes&lt;/code&gt; field&lt;/li&gt;
&lt;/ul&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvxj5bx9am8dkjzfq1939.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%2Fuploads%2Farticles%2Fvxj5bx9am8dkjzfq1939.png" alt="Optional"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you've reached here, you've successfully Integrated Github with Asana to track issues in repositories. 🥳&lt;/p&gt;

&lt;p&gt;Now every time an issue is created on your repository, you'll have it on your Asana Project too!&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi5j3c0w677cgi7o40zod.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%2Fuploads%2Farticles%2Fi5j3c0w677cgi7o40zod.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check out the sample project &lt;a href="https://app.canonic.dev/projects/61ba6a6ab6586d0026b0f9cd/api-2?utm_source=dev.to&amp;amp;utm_medium=organic_article&amp;amp;utm_campaign=30daysofcanonic_uc_3&amp;amp;utm_term=step5_here&amp;amp;utm_content=day_17"&gt;here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Hope this guide helped you guys to track issues in repositories in an optimized and faster way. You can also &lt;strong&gt;check out our other guides&lt;/strong&gt; &lt;a href="https://dev.to/canonic/"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Join us on &lt;a href="https://discord.gg/9dyytsM" rel="noopener noreferrer"&gt;discord&lt;/a&gt; to discuss or share with our community. Write to us for any support requests at &lt;a href="https://support@canonic.dev/" rel="noopener noreferrer"&gt;support@canonic.dev&lt;/a&gt;. Check out our &lt;a href="https://www.canonic.dev/30-days-of-canonic/?utm_source=dev.to&amp;amp;utm_medium=organic_article&amp;amp;utm_campaign=30daysofcanonic_uc_3&amp;amp;utm_term=conclusion_website&amp;amp;utm_content=day_17"&gt;website&lt;/a&gt; to know more about Canonic. &lt;/p&gt;

</description>
      <category>github</category>
      <category>asana</category>
      <category>integrations</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Picking your tech stack - Canonic vs Strapi</title>
      <dc:creator>Tanisha</dc:creator>
      <pubDate>Tue, 28 Sep 2021 13:01:09 +0000</pubDate>
      <link>https://dev.to/canonic/picking-your-tech-stack-canonic-vs-strapi-1b44</link>
      <guid>https://dev.to/canonic/picking-your-tech-stack-canonic-vs-strapi-1b44</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Canonic and Strapi are often compared as direct competitors. However, the two are quite different in terms of intended usage &amp;amp; audience. This article aims to highlight these differences from an unbiased perspective and help &lt;em&gt;you choose&lt;/em&gt; the perfect tool for &lt;em&gt;your particular use case.&lt;/em&gt;&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv0ffwvjhir6dw6t4z6o0.jpg" 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%2Fuploads%2Farticles%2Fv0ffwvjhir6dw6t4z6o0.jpg" alt="1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Strapi positions itself as a developer first open-source headless CMS platform; essentially trying to make content management &amp;amp; subsequent development faster and easier. Canonic, on the other hand, positions itself as a low-code backend development platform trying to take care of all your backend requirements in a single place. The two platforms are, therefore, positioned differently which should give you a clear indication of the requirement each platform is trying to fulfil.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pre Requisites
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Strapi requires certain softwares to be pre-installed.
&lt;/h3&gt;

&lt;p&gt;Strapi requires three softwares to be pre-installed on your computer before you can use the platform. These are Node.js, Npm/Yarn and a database (SQLite, PostgreSQL, MySQL, etc). As Strapi is "developer-first", these softwares do have a certain learning curve to them (if you're not a developer) on top of the minimal learning curve of the platform itself. However, the well maintained Docs section or &lt;a href="https://www.youtube.com/watch?v=yH6cQRRWNFI" rel="noopener noreferrer"&gt;these video tutorials&lt;/a&gt; can help you get started in no time.&lt;/p&gt;

&lt;p&gt;Post the installation of the pre-requisites, you can get your Strapi Dashboard up and running!&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6im9uktqlxi1w6jsal01.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%2Fuploads%2Farticles%2F6im9uktqlxi1w6jsal01.png" alt="2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Canonic requires no pre-requisites.
&lt;/h3&gt;

&lt;p&gt;Canonic does not have any pre-requisites. Since &lt;strong&gt;Canonic is a web app&lt;/strong&gt;, it can be accessed through any internet browser, removing the need to switch between applications. Everything created on the platform remains on the platform itself; therefore making it a complete backend development tool. &lt;/p&gt;

&lt;p&gt;The only learning curve here is of the platform itself which can be navigated through by reading the documentation or completing the onboarding. &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgzsxvo4sbx61b3ew9r0.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%2Fuploads%2Farticles%2Fmgzsxvo4sbx61b3ew9r0.png" alt="3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Canonic dashboard.&lt;/p&gt;

&lt;p&gt;For anyone without substantial development experience, Strapi might be a little overwhelming to get started with, in comparison to Canonic. However, if you are a fully-fledged developer, there is a good chance that you already have the Strapi pre-requisites installed on your computer and can get your project up &amp;amp; running in no time. &lt;/p&gt;




&lt;h2&gt;
  
  
  Hosting &amp;amp; Security
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Strapi projects are self-hosted.
&lt;/h3&gt;

&lt;p&gt;Strapi projects are self-hosted which means that the data is hosted on your computer or your server(s). They do have a Cloud Server functionality coming soon; the dates of which haven't yet been released. &lt;br&gt;
Due to the projects being self-hosted, there lies a hidden pre-requisite to use Strapi in terms of DevOps / deployment experience as well as the knowledge of hosting your server. &lt;/p&gt;

&lt;h3&gt;
  
  
  Canonic projects are serverless backends.
&lt;/h3&gt;

&lt;p&gt;Canonic, on the other hand, is a cloud-based platform with a server-less architecture. The projects are serverless backends securely hosted on the AWS platform and your data is securely saved on your database; reducing the risk of losing data and allowing you to scale without worrying about the stability (in case of higher traffic or other such cases). &lt;br&gt;
There is no hidden requirement of DevOps experience to use Canonic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Platform
&lt;/h2&gt;

&lt;p&gt;Both platforms utilise graphical interfaces. However, due to the differences in product orientation, the way data is represented varies immensely. &lt;/p&gt;

&lt;h3&gt;
  
  
  Strapi uses a list-based view to make content management faster.
&lt;/h3&gt;

&lt;p&gt;Strapi uses a list-based view to show the CMS collection types (essentially folders or elements of your database). This is helpful while maintaining a large number of entries as Strapi is more focused on content management as a 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvgyqssogdza4bu2uzo4.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%2Fuploads%2Farticles%2Fcvgyqssogdza4bu2uzo4.png" alt="4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Canonic uses a graphical node-based representation for your database.
&lt;/h3&gt;

&lt;p&gt;Canonic, on the other hand, differs completely. It uses a graph-like view to help see your database structure more clearly. With each table having separate nodes for fields, one can see the entire data structure in a single glance.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvz31vqrl808bzgronkef.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%2Fuploads%2Farticles%2Fvz31vqrl808bzgronkef.png" alt="5"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Therefore, a database with many fields of varying field types becomes faster to identify on Canonic as it is inherently a visual interface. The same can become a little difficult on Strapi.&lt;/p&gt;

&lt;p&gt;An instance of this is to see what fields in a table are of the "linked" type in a database. Visual interfaces can afford signifiers, which in this case, Canonic provides with the help of a dotted line to signify a linked table. Therefore, time to locate specific fields is reduced on Canonic's visual interface while the same can become a little tedious on Strapi. &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa7p113mya2prxp956u9z.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%2Fuploads%2Farticles%2Fa7p113mya2prxp956u9z.png" alt="6"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Linked table types (or Relational Fields on Strapi).&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn0zaz1bsvskiet8rowdy.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%2Fuploads%2Farticles%2Fn0zaz1bsvskiet8rowdy.png" alt="7"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Linked field types on Canonic on the graph-view use a dotted line and show what table the field is linked to. &lt;/p&gt;




&lt;h2&gt;
  
  
  APIs
&lt;/h2&gt;

&lt;p&gt;Both platforms offer auto-generated CRUD APIs with the added functionality of adding custom-coded business logic and creating your own APIs. However, here is where a major difference lies between both platforms. &lt;/p&gt;

&lt;h3&gt;
  
  
  Strapi uses a plugin to view APIs and is editable through your code editor.
&lt;/h3&gt;

&lt;p&gt;Strapi provides you with a list of APIs by using a plugin built into the platform called Swagger. Since Strapi is developer-first, any modification/creation of APIs has to be done via your code editor. To aid this process, Strapi autogenerates folders inside your preferred code editor where you can meddle around with the APIs. &lt;/p&gt;

&lt;p&gt;The APIs documented on Swagger show up like this: &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fymhnhmxhhqbyilavzj2q.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%2Fuploads%2Farticles%2Fymhnhmxhhqbyilavzj2q.png" alt="8"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;API List on Swagger.&lt;/p&gt;

&lt;p&gt;The APIs are then incorporated inside your code editor, as shown below:&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq8sr8b6tsongdrrdzwdv.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%2Fuploads%2Farticles%2Fq8sr8b6tsongdrrdzwdv.png" alt="9"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Strapi autogenerates folders directly inside your code editor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Canonic allows you to create/modify APIs all in one place.
&lt;/h3&gt;

&lt;p&gt;Canonic works a little differently. Even though the platform has an &lt;a href="https://canonic.dev/features/sdk?utm_campaign=canonicvsstrapi" rel="noopener noreferrer"&gt;SDK&lt;/a&gt; to integrate your project directly into your code editor, the true power of the platform lies in the platform itself. Canonic is essentially a one-stop platform for all backend requirements. Your database, CMS, APIs and documentation exists in one place: on the Canonic web app.&lt;/p&gt;

&lt;p&gt;Each API and subsequent trigger/webhook is seen as an endpoint, again in a similar node-like structure. This makes it easy to see webhooks and APIs in logic blocks. However, this preference can be quite subjective. &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbdugfmy7b8mopn1drrs.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%2Fuploads%2Farticles%2Fcbdugfmy7b8mopn1drrs.png" alt="10"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;The documentation for the APIs exist on the platform itself, as shown below in the screenshot: &lt;/p&gt;

&lt;p&gt;Another point to highlight is that Canonic allows you to create complex workflows straight from the platform itself which you would otherwise have to write in code on Strapi or other headless CMS platforms. &lt;/p&gt;

&lt;p&gt;Therefore, the difference between the platforms also lies in the requirement of DevOps experience. While Strapi requires you to build out your APIs inside your code editor, Canonic allows you to do the same on the platform itself along with the added functionality of creating complex workflows and triggers; all on a visual interface. Custom business logic has to be written in code for both platforms. &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%2Fuploads%2Farticles%2Fnokdofr2sn5bdj6cg93m.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%2Fuploads%2Farticles%2Fnokdofr2sn5bdj6cg93m.png" alt="11"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;Both platforms feature a free forever plan along with several paid options. However, because of the difference in functionality and what each platform has to offer, there are differences in pricing options. &lt;/p&gt;

&lt;h3&gt;
  
  
  Strapi is an open-source platform and has a "free forever" plan.
&lt;/h3&gt;

&lt;p&gt;Strapi's free forever plan allows you to have a self-hosted Strapi project with unlimited CMS entries and API Calls with 3 default roles. The paid plans offer features to scale up your project with more custom roles and 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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqj77rn6ff9cv0wokeyrk.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%2Fuploads%2Farticles%2Fqj77rn6ff9cv0wokeyrk.png" alt="12"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Canonic features a freemium plan.
&lt;/h3&gt;

&lt;p&gt;Canonic's free plan allows you to create 3 projects with one additional collaborator and 5000 requests a day. Paid pricing plans allow more API calls and CMS entries.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwufhhrb1psnzu2sxxmiq.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%2Fuploads%2Farticles%2Fwufhhrb1psnzu2sxxmiq.png" alt="13"&gt;&lt;/a&gt; &lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Based on the points above, it becomes evident that Canonic and Strapi are quite different in terms of positioning and what they're striving to do.&lt;/p&gt;

&lt;p&gt;If you are a developer with knowledge about backend systems and DevOps, Strapi integrates into your workflow more easily. It sits inside your code editor; leaving you to dabble between your Strapi CMS and frontend framework straight from your code editor. &lt;/p&gt;

&lt;p&gt;With Canonic, your entire backend system is in one single place complete with your database, CMS, APIs and documentation. This can be created regardless of development experience, making it a better choice for people who lack the knowledge or resources required to create a backend. While Canonic also allows you to use SDKs and incorporate your project with your frontend framework, the true power of the platform lies in the relative ease and rapid speed with which you can make a backend on the Canonic web app.&lt;/p&gt;

&lt;p&gt;The next major point of differentiation is hosting. Strapi allows you to self-host your project which means that the data is only with you (your server) and not on any other place on the internet. Canonic, on the other hand, hosts your backend for you and you can even select the region of deployment. Therefore, API response time is faster and the risk of losing your data becomes next to impossible. A serverless backend also removes the hindrance of unstable systems as you scale up your backend, accommodating higher API calls and CMS entries.&lt;/p&gt;

&lt;p&gt;Finally, the preference of Strapi over Canonic or vice-versa largely depends on your specific use case. If you are looking for a developer-first content management tool, look no further than Strapi. However, if you're looking for a fully-fledged low-code backend development tool, regardless of your development experience, Canonic might be a better fit for you.&lt;/p&gt;

&lt;p&gt;I hope this clarifies some of the confusion surrounding the similarity &amp;amp; differences between the two platforms. Let us know which one would you prefer and why in the comments below. Godspeed to your backends and you!&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Heading to Disrupt 2021</title>
      <dc:creator>Tanisha</dc:creator>
      <pubDate>Tue, 21 Sep 2021 17:57:47 +0000</pubDate>
      <link>https://dev.to/canonic/heading-to-disrupt-2021-391l</link>
      <guid>https://dev.to/canonic/heading-to-disrupt-2021-391l</guid>
      <description>&lt;p&gt;The past few months have been quite intensive at the Canonic HQ. We worked on new features, performance &amp;amp; stability improvements, an entirely new onboarding, multiple environments support and &lt;em&gt;finally&lt;/em&gt; came out of beta through a &lt;strong&gt;Product Hunt launch in August 2021.&lt;/strong&gt; And it's not over yet. This year, Canonic is headed to TechCrunch Disrupt 2021 and we can't wait to see you all there. &lt;/p&gt;

&lt;p&gt;If you're new to Canonic, I recommend reading about our &lt;a href="https://canonic.dev"&gt;product&lt;/a&gt; and how we're trying to reduce backend development time and effort ,through an intuitive low-code platform, before you move on further to learn about our new developments for Disrupt 2021.&lt;/p&gt;




&lt;h3&gt;
  
  
  Getting ready for TechCrunch Disrupt 2021
&lt;/h3&gt;

&lt;p&gt;Disrupt is unarguably every tech startup's dream place to be. A chance to show off your product in one of the biggest tech conferences, network with inspiring people around the world and play a part in shaping the tech of the future and the future of tech. We'd be lying if we told you that all of us aren't crossing off days on our personal calendars. &lt;/p&gt;

&lt;p&gt;That being said, we know it isn't easy to leave your mark on the tech world without putting in some serious work. Don't worry, we've been preparing.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N2iLvvVL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lc4qlmin7jzrl62b6gfu.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N2iLvvVL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lc4qlmin7jzrl62b6gfu.jpg" alt="A scene from the office during a bug-identifying session"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A scene from the office during a bug-identifying session.&lt;/p&gt;

&lt;p&gt;Here are some new things that we've worked on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Database Integrations:&lt;/strong&gt; Import or link an existing PostGres / MySQL / MSSQL / Mongo database into your Canonic project and generate APIs for them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved SDKs:&lt;/strong&gt; New backend and frontend SDKs allow you to focus on your frontend code while building a low-code backend, without ever leaving your dear console.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding:&lt;/strong&gt; With more tutorial projects to choose from and an improved experience, learning how to supercharge your backends with Canonic has never been easier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database &amp;amp; Scheduled Triggers:&lt;/strong&gt; Automate your workflow by adding database triggers with Slack, Twilio and Mailgun integrations as well as adding scheduled triggers to trigger periodic or one-off events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple Environments Support:&lt;/strong&gt; Let's face it, deploying changes for a large-scale project can be scary. Test out all your changes by deploying it to an internal testing environment before you make it live.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;New Sample Projects:&lt;/strong&gt; We've created multiple sample templates that you can replicate for your particular use-case. Want to build an Airbnb replica? Check. WhatsApp replica? Check. Twitter, Spotify, Netflix, Kindle? Check. Check out all available sample projects here.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved security, performance and scalability:&lt;/strong&gt; Let's face it. Crashes and bugs can be annoying roadblocks on the way to productive nirvana. We've stayed up days &amp;amp; nights to ensure a smooth experience. Let's get to building that backend at lightning fast speed, eh?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The features saw a lot of positive feedback from the ProductHunt community. Furthermore, a lot of our recent weeks have been spent on testing and validation of these features; ensuring their functionality and ease of use. &lt;/p&gt;

&lt;p&gt;ProductHunt comments post-launch. Check out the entire thread on &lt;a href="https://www.producthunt.com/posts/canonic-2"&gt;ProductHunt&lt;/a&gt;. &lt;/p&gt;




&lt;h3&gt;
  
  
  The Canonic Booth @Disrupt 2021
&lt;/h3&gt;

&lt;p&gt;This year, due to the disrupting pandemic (see what I did there), the event shall be held virtually. The Canonic team will set up a virtual booth where you can interact with the founders, take a demo of the product and check out one of the fastest backend developing low-code tools out there, all in real time. It's about time that the world gets to know about this tiny company based in India trying to make backend development easier, faster and more accessible. &lt;/p&gt;

&lt;p&gt;If you've already grabbed your passes, do stop by at our virtual booth! We'd love to chat with you and help you make your backends faster. And if you still haven't purchased those all-important passes, what're you waiting for? The tech-world is at &lt;a href="https://techcrunch.com/events/tc-disrupt-2021/"&gt;Disrupt&lt;/a&gt;; where are you?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Hello World! We've launched🚀</title>
      <dc:creator>Tanisha</dc:creator>
      <pubDate>Thu, 19 Aug 2021 13:46:43 +0000</pubDate>
      <link>https://dev.to/canonic/hello-world-we-ve-launched-3c3b</link>
      <guid>https://dev.to/canonic/hello-world-we-ve-launched-3c3b</guid>
      <description>&lt;p&gt;Hello World!&lt;/p&gt;

&lt;p&gt;It brings us immense joy to announce that we are ready to get out of Beta. After 8 months of successfully launching our product, we worked on new features, bug fixes and great feedback from all of you. The result was a much stable and smoother platform equipped with features to help you build a production-ready backend in minutes without any knowledge of code.&lt;/p&gt;

&lt;p&gt;We'd love to hear your feedback here - &lt;a href="https://www.producthunt.com/posts/canonic-2"&gt;https://www.producthunt.com/posts/canonic-2&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Wait! ….what’s Canonic?
&lt;/h3&gt;

&lt;p&gt;Canonic is a low-code intuitive platform to build scalable backend and craft APIs for your web apps, mobile apps and microservices. It enables developers to ship production-ready backend instantly. All without writing a single line of code!&lt;/p&gt;

&lt;h3&gt;
  
  
  So what’s new in Canonic?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Execute Database and Scheduled Triggers without diving into cron&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integrate with external databases&lt;/strong&gt; - Postgres, SQL, MySQL, MongoDB &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose the region for deployment and keep your app secure&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;New Marketplace of integrations&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SDK to help integrate backend with frontend&lt;/strong&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Accelerate Development time&lt;/strong&gt; - With our intuitive interface, defining database models and crafting APIs becomes quick and easy. Logic blocks help you define your business logic. And it's all hosted by default! so you can instantly start integrating APIs with your frontend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Single Touch point to manage your entire backend&lt;/strong&gt; - Everything from hosting, to database, to APIs can be managed on Canonic, saving you the hassle of setting up and managing multiple services.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploy scalable backend&lt;/strong&gt; - With instant deployments and serverless architecture, scalability stays high while keeping costs down. As your project grows, you can make use of built-in code editor to write business logic that require code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automate Events&lt;/strong&gt; - Database &amp;amp; scheduled triggers help you achieve automation without diving into cron and scripts. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A much smoother and stable platform.&lt;/strong&gt; &lt;br&gt;
We’re excited for you to try our new and improved Canonic, and we hope that this tool will help you create an amazing backend. The Canonic Team and I are beyond thankful to our amazing and supportive Canonic community. Without the incredible amount of feedback and support we wouldn't be here today.&lt;/p&gt;

&lt;p&gt;Let us know your thoughts! - &lt;a href="https://www.producthunt.com/posts/canonic-2"&gt;https://www.producthunt.com/posts/canonic-2&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Setup travis CI builds directly from the API</title>
      <dc:creator>Tanisha</dc:creator>
      <pubDate>Wed, 30 Jun 2021 12:14:14 +0000</pubDate>
      <link>https://dev.to/canonic/lets-23jp</link>
      <guid>https://dev.to/canonic/lets-23jp</guid>
      <description>&lt;p&gt;Executing a CI Build using an API built with no-code backend platform! These truly are craziest of times. The need for APIs triggering Builds actually eliminates a lot of hassle that often come with using tools like jenkins or travis. They offer a lot more CI features but are often difficult to setup &amp;amp; maintain for smaller projects.&lt;/p&gt;

&lt;p&gt;If you have a SPA website hosted that depends on the content of your backend, well, you're in luck because you can attach a webhook to your API endpoint, which will trigger a build everytime the API is called.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Creating project on low-code tool&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;We head over to &lt;a href="https://canonic.dev"&gt;Canonic&lt;/a&gt; and sign in using our social accounts. Next, we click on &lt;strong&gt;Create New&lt;/strong&gt; to create a project for our application. Click on next, then click on create to complete the process.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uRL9KDEv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uRL9KDEv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss1.png" alt="https://canonic.s3.amazonaws.com/public/devto/travis-ss1.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create new project screen&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A popup asking your first table name will appear. If not, you can click on the &lt;strong&gt;+&lt;/strong&gt; icon in the header to create a new table. Let's name our first &amp;amp; only table for this project - &lt;strong&gt;RepoBuilds.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SNLW_60Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SNLW_60Y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss2.png" alt="https://canonic.s3.amazonaws.com/public/devto/travis-ss2.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We create a text field named "Repo Branch" as we need the branch name against which we want to trigger the build.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YUKMRbRb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YUKMRbRb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss3.png" alt="https://canonic.s3.amazonaws.com/public/devto/travis-ss3.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We hit deploy on the top right, and we'll be provided with a hosted backend. a database &amp;amp; basic CRUD endpoints per table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on the &lt;strong&gt;API&lt;/strong&gt; tab on the left to start adding the Travis CI webhook. We select &lt;strong&gt;+&lt;/strong&gt; button that's attached to the &lt;strong&gt;createRepoBuilds&lt;/strong&gt; block in mutations. It'll open up a new webhook settings on the right hand side.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i0VmRMqS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i0VmRMqS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss4.png" alt="https://canonic.s3.amazonaws.com/public/devto/travis-ss4.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Build&lt;/strong&gt; type → Choose &lt;strong&gt;Travis CI&lt;/strong&gt; from the list of providers &amp;amp; you'll be provided with fields for settings. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API Key → This is the API key of Travis account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repo Url → Git URL for the Repo we want to trigger the build&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Repo Branch → Branch to be selected for building&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7-VakFsI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7-VakFsI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss5.png" alt="https://canonic.s3.amazonaws.com/public/devto/travis-ss5.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;For Repo Branch →&lt;/strong&gt; We want to trigger the build against the text found in the &lt;strong&gt;repo branch field&lt;/strong&gt; of the API payload. So we can make use of Handlebars templates &amp;amp; simply write &lt;code&gt;{{repoBranch}}&lt;/code&gt; in that field. This will extract the repoBranch field from the API payload and forward it to Travis.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And we're ready with our API to start triggering builds. Managing an API access is easier than managing CI access, so you can directly start consuming this API both by yourself &amp;amp; teammates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integrating our existing app with this API:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This will require a combination of things that we need for securely connecting our application with this API.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access token for our API&lt;/li&gt;
&lt;li&gt;Documentation for the API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Access Tokens&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Click on &lt;strong&gt;Settings&lt;/strong&gt; using left side menu. Go to &lt;strong&gt;Access&lt;/strong&gt; tokens tab.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hBIanpwt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hBIanpwt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss6.png" alt="https://canonic.s3.amazonaws.com/public/devto/travis-ss6.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on &lt;strong&gt;Create a new token,&lt;/strong&gt; and provide it a suitable name and permissions. Click on &lt;strong&gt;Create.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZtDgbCef--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZtDgbCef--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss7.png" alt="https://canonic.s3.amazonaws.com/public/devto/travis-ss7.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You've successfully generated an access token for your API. Copy it &amp;amp; save it some place safe as &lt;strong&gt;you won't be able to see it again&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S0-26PLW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S0-26PLW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://canonic.s3.amazonaws.com/public/devto/travis-ss8.png" alt="https://canonic.s3.amazonaws.com/public/devto/travis-ss8.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Head over to the docs tab using the left-hand side, and you'll find documentation for &lt;strong&gt;createRepoBuilds&lt;/strong&gt; API (the API block where we added our Travis webhook).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After completing all the necessary steps, we're finally ready to deliver our first SMS using our Travis-connected API.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Let's copy the &lt;strong&gt;CURL&lt;/strong&gt; command that was mentioned in the documentation. Fill in your access token and paste it into the terminal.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Our curl command will look something like this.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;➜  ~ curl 'https://xxxx.hem.canonic.dev/api/repoBuilds' \
  --request POST \
  --header "Content-type: application/json" \
  --header "Authorization: xxxxxx-xxxxx-xxxx" \
  --data '{
    "input": {
      "repoBranch": "newFixes",
    }
  }'
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;A successful response will look like this:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{"data":{"repoBranch":"newFixes","_id":"60bf30ee2529700009fd2a4a","createdAt":"2021-06-08T08:57:18.316Z","updatedAt":"2021-06-08T08:57:18.316Z","__v":0,"id":"60bf30ee2529700009fd2a4a"},"error":null,"success":true}%
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You should check on Travis, and you'll find the latest build in progress. Having an API saves a lot of trouble of maintenance and boilerplate setup while leaving plenty of room for rapid innovation. Find more information about this feature here - &lt;a href="https://docs.canonic.dev/concepts/webhook-providers/travis-ci"&gt;https://docs.canonic.dev/concepts/webhook-providers/travis-ci&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You also add other integrations depending on your business needs like sending a message on slack, etc. Check out the slack guide &lt;a href="https://dev.to/kartik0709/build-api-to-deliver-slack-messages-with-no-code-54hb"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
