<?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: Rehmat Alam</title>
    <description>The latest articles on DEV Community by Rehmat Alam (@rehmatworks).</description>
    <link>https://dev.to/rehmatworks</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%2F53237%2F6a3b8234-d39f-475e-bae0-c3a854a48e0c.jpeg</url>
      <title>DEV Community: Rehmat Alam</title>
      <link>https://dev.to/rehmatworks</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rehmatworks"/>
    <language>en</language>
    <item>
      <title>I built a random online secret generator in less than 30 minutes using AI</title>
      <dc:creator>Rehmat Alam</dc:creator>
      <pubDate>Sat, 17 Jan 2026 11:23:51 +0000</pubDate>
      <link>https://dev.to/rehmatworks/i-built-a-random-online-secret-generator-in-less-than-30-minutes-using-ai-2g0b</link>
      <guid>https://dev.to/rehmatworks/i-built-a-random-online-secret-generator-in-less-than-30-minutes-using-ai-2g0b</guid>
      <description>&lt;p&gt;As a programmer, I have dozens of options for generating app secrets for my web apps, but most of the time I end up searching Google for an online secrets generator. Moreover, despite Chrome's built-in password generator, I frequently use online random password generators. This made me think this might be a global problem for developers (and non-developers), and I tried spending some time building a secure, usable tool for it.&lt;/p&gt;

&lt;p&gt;With Vercel's &lt;a href="https://v0.app/" rel="noopener noreferrer"&gt;V0 AI coding app&lt;/a&gt;, I built this random secrets and random password generator app in under 30 minutes. I have deployed it &lt;a href="https://seckeygen.com" rel="noopener noreferrer"&gt;here&lt;/a&gt;, and the code is open source on &lt;a href="https://github.com/rehmatworks/secret-key-generator" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; for other developers to use.&lt;/p&gt;

&lt;p&gt;Over the last couple of years, AI has improved dramatically in solving challenges, and coding is one of the most served niches. In another (upcoming) post, I'll discuss how AI has replaced my front-end developers and what my experience has been so far using AI as a companion tool when building web apps. Happy coding!&lt;/p&gt;

</description>
      <category>secretgenerator</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I created GoalHappy, the simplest task manager for developers</title>
      <dc:creator>Rehmat Alam</dc:creator>
      <pubDate>Wed, 03 Dec 2025 14:46:24 +0000</pubDate>
      <link>https://dev.to/rehmatworks/i-created-goalhappy-the-simplest-task-manager-for-developers-3ngj</link>
      <guid>https://dev.to/rehmatworks/i-created-goalhappy-the-simplest-task-manager-for-developers-3ngj</guid>
      <description>&lt;p&gt;As a developer, I frequently need to quickly track a list of tasks, and most of the time, I don't need the full-featured project management capabilities of solutions like Basecamp, Notion, Todoist, and others. I tried almost every tool, from Apple Reminders to Basecamp, but I either failed to manage my tasks properly or the features and complexity of the bigger tools overwhelmed me. To solve this, I created GoalHappy, a simple task manager app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;No login required, start managing your tasks right away&lt;/li&gt;
&lt;li&gt;If you need cloud sync, create a free account and get 50 tasks synced for free&lt;/li&gt;
&lt;li&gt;PWA - Use cross-device (offline), and get your tasks synced when online&lt;/li&gt;
&lt;li&gt;If you need to manage a lot of tasks and lists, and also want to share the lists for collaborative work, the paid version is just $2 per month or $18 per year&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I believe that, as a developer, you will love &lt;a href="https://goalhappy.com" rel="noopener noreferrer"&gt;GoalHappy&lt;/a&gt;. Everyone reading this post can use the coupon code DEVFRIENDS to get 100% off the pro version of GoalHappy for 1 year. The coupon code is valid for a limited time. Looking forward to constructive feedback from fellow developers.&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
    <item>
      <title>Protecting Kong API gateway using Let's Encrypt</title>
      <dc:creator>Rehmat Alam</dc:creator>
      <pubDate>Thu, 09 Sep 2021 08:01:13 +0000</pubDate>
      <link>https://dev.to/rehmatworks/protecting-kong-api-gateway-using-let-s-encrypt-1id6</link>
      <guid>https://dev.to/rehmatworks/protecting-kong-api-gateway-using-let-s-encrypt-1id6</guid>
      <description>&lt;p&gt;For the last several months, I am using the awesome &lt;a href="https://konghq.com/kong/" rel="noopener noreferrer"&gt;Kong API gateway&lt;/a&gt; to monitor, protect, and scale our microservices. So far, I am learning something new and amazing about this powerful API gateway each day. Previously, I used the certbot's standalone authentication method to retrieve SSL certificates for the gateway but that resulted in renewal problems as Kong service itself needed to be stopped in order to get an SSL certificate renewed.&lt;/p&gt;

&lt;p&gt;Today, I tried a different approach. As Kong uses NGINX, I succeeded in obtaining SSL certificates for our API gateway by writing some custom NGINX conf.&lt;/p&gt;

&lt;p&gt;First of all, I got started by editing &lt;code&gt;/etc/kong/kong.conf&lt;/code&gt; file. The file looked like this after I edited and saved it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pg_user &lt;span class="o"&gt;=&lt;/span&gt; kong
pg_password &lt;span class="o"&gt;=&lt;/span&gt; mydbpass
proxy_listen &lt;span class="o"&gt;=&lt;/span&gt; 0.0.0.0:80 reuseport &lt;span class="nv"&gt;backlog&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;16384, 0.0.0.0:443 http2 ssl reuseport &lt;span class="nv"&gt;backlog&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;16384
nginx_http_include &lt;span class="o"&gt;=&lt;/span&gt; /etc/kong/nginx.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will notice above that I have instructed Kong to included a custom NGINX conf file. After that, I created the NGINX conf file at &lt;code&gt;/etc/kong/nginx.conf&lt;/code&gt; with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;server &lt;span class="o"&gt;{&lt;/span&gt;
    listen  80&lt;span class="p"&gt;;&lt;/span&gt;
    server_name     api.myservice.tld&lt;span class="p"&gt;;&lt;/span&gt;
    server_tokens   off&lt;span class="p"&gt;;&lt;/span&gt;

    root /var/certbot/web&lt;span class="p"&gt;;&lt;/span&gt;

    location /.well-known &lt;span class="o"&gt;{&lt;/span&gt;
        try_files &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;/ &lt;span class="o"&gt;=&lt;/span&gt;404&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    location / &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return &lt;/span&gt;301 https://&lt;span class="nv"&gt;$host$request_uri&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What does the above NGINX conf do? It routes the HTTP requests to a custom path that I have mentioned and that we will create below, and if the path doesn't match, it redirects the requests to HTTPs.&lt;/p&gt;

&lt;p&gt;When we request an SSL certificate from Let's Encrypt using certbot, there are several authentication methods that certbot supports in order to verify the ownership of the domain. The HTTP method that's most common uses a webroot to store some authentication files in and then Let's Encrypt server looks for those files over the domain. The above NGINX configuration allows Let's Encrypt to access the verification content over HTTP and if the path isn't for ACME verification, it redirects to HTTPs.&lt;/p&gt;

&lt;p&gt;As I have specified the root path in above NGINX conf, I needed to create the directory as well:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; /var/certbot/web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And restart Kong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;service kong restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are almost ready. Now before attempting to obtain an SSL certificate, we need to ensure a couple of things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Our domain is pointed to our server and is not forcing an HTTPs redirect from a CDN end, i.e. Cloudflare&lt;/li&gt;
&lt;li&gt;Certbot is installed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If certbot isn't installed, it can be installed using &lt;code&gt;snap&lt;/code&gt; on Ubuntu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;snap &lt;span class="nb"&gt;install &lt;/span&gt;certbot &lt;span class="nt"&gt;--classic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Now we are ready. Now we have to run certbot in certonly mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;certbot certonly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And choose the webroot method when prompted. Provide your domain name that you are using with Kong and that you have added in the custom NGINX conf above, provide the webroot path, i.e. &lt;code&gt;/var/certbot/web/&lt;/code&gt; and press enter. If all goes well, you will be presented with a success message and the paths of the cert files will be mentioned.&lt;/p&gt;

&lt;p&gt;Copy the paths of the cert files and once again edit the Kong conf file located at &lt;code&gt;/etc/kong/kong.conf&lt;/code&gt;. Add these two lines to the Kong conf file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssl_cert &lt;span class="o"&gt;=&lt;/span&gt; /etc/letsencrypt/live/api.myservice.tld/fullchain.pem
ssl_cert_key &lt;span class="o"&gt;=&lt;/span&gt; /etc/letsencrypt/live/api.myservice.tld/privkey.pem
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure that you are providing the correct SSL file paths. After editing the Kong conf file, it should look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pg_user &lt;span class="o"&gt;=&lt;/span&gt; kong
pg_password &lt;span class="o"&gt;=&lt;/span&gt; mydbpass
proxy_listen &lt;span class="o"&gt;=&lt;/span&gt; 0.0.0.0:80 reuseport &lt;span class="nv"&gt;backlog&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;16384, 0.0.0.0:443 http2 ssl reuseport &lt;span class="nv"&gt;backlog&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;16384
ssl_cert &lt;span class="o"&gt;=&lt;/span&gt; /etc/letsencrypt/live/api.myservice.tld/fullchain.pem
ssl_cert_key &lt;span class="o"&gt;=&lt;/span&gt; /etc/letsencrypt/live/api.myservice.tld/privkey.pem
nginx_http_include &lt;span class="o"&gt;=&lt;/span&gt; /etc/kong/nginx.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Kong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;service kong restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And now your Kong installation should be served over HTTPs. The good news is that now you don't need to worry about the SSL renewals as they will not fail even if Kong service is up and using port 80.&lt;/p&gt;

&lt;p&gt;I found this to be an easy and elegant way to secure a Kong installation using free SSL certificates from Let's Encrypt. Do you know any better way to do this? Leave a comment and I'll give it a try :)&lt;/p&gt;

</description>
      <category>kong</category>
      <category>api</category>
      <category>gateway</category>
      <category>letsencrypt</category>
    </item>
    <item>
      <title>Google Search (aka. Google SERPs) JSON API</title>
      <dc:creator>Rehmat Alam</dc:creator>
      <pubDate>Sun, 28 Jun 2020 08:22:48 +0000</pubDate>
      <link>https://dev.to/rehmatworks/google-search-aka-google-serps-json-api-4e3l</link>
      <guid>https://dev.to/rehmatworks/google-search-aka-google-serps-json-api-4e3l</guid>
      <description>&lt;p&gt;Data mining is a hard job and it gets harder when you are supposed to deal with giants like Google. A couple of years ago, I needed to deal with Google SERPs data and I searched for available options. I found a couple of web services as well as open-source code to get Google SERPs data but each solution had its own limitations.&lt;/p&gt;

&lt;p&gt;I found a couple of services to be reliable but they were costly. Some were affordable but I had to wait for several minutes before they returned me a result. And there, I started my research.&lt;/p&gt;

&lt;p&gt;I opted for Python as the programming language and thanks to several other tools that I used, I was able to build a solution. My web service is &lt;a href="https://serpsbot.com" rel="noopener noreferrer"&gt;https://serpsbot.com&lt;/a&gt; and now it is in full production mode. You can use it to consume &lt;a href="https://google.com" rel="noopener noreferrer"&gt;Google&lt;/a&gt; SERPs data for any purpose.&lt;/p&gt;

&lt;p&gt;To cover the server costs, I'm charging $0.001 per API call there. For high-volume customers, the price can be reduced down to $0.0005 per API call.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get Google SERPs?
&lt;/h2&gt;

&lt;p&gt;You can get Google SERP results as JSON data. Here is an example of usage for the awesome Python. Please beware that you need to create an account and get your API key at our website &lt;a href="https://serpsbot.com" rel="noopener noreferrer"&gt;SerpsBot&lt;/a&gt; first.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="c1"&gt;# Your API key
&lt;/span&gt;&lt;span class="n"&gt;apikey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;your-api-key-here&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Bearer {}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apikey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;programming&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pages&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hl&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;en-US&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gl&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;us&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://serpsbot.com/api/v1/google-serps/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# JSON data
&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How to build a custom site search engine?
&lt;/h2&gt;

&lt;p&gt;Using our API service, you can build a search engine for your website. As we support all Google search filters, you can pass in your website URL using &lt;code&gt;site:&lt;/code&gt; filter and only results for your provided URL will be returned.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="c1"&gt;# Your API key
&lt;/span&gt;&lt;span class="n"&gt;apikey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;your-api-key-here&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Bearer {}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apikey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;q&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;python site:dev.to&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pages&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hl&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;en-US&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;gl&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;us&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://serpsbot.com/api/v1/google-serps/&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# JSON data
&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Possibilities are limitless. You can use any programming language to consume data from our API endpoint and you can build your next tool that consumes data from our API. If you have any questions, you can ask me in the comments.&lt;/p&gt;

&lt;p&gt;p.s. I'll publish the website source at GitHub in the upcoming months.&lt;/p&gt;

</description>
      <category>google</category>
      <category>search</category>
      <category>serps</category>
      <category>api</category>
    </item>
    <item>
      <title>20 Goals Developers Should Set for 2020</title>
      <dc:creator>Rehmat Alam</dc:creator>
      <pubDate>Sat, 04 Jan 2020 13:39:54 +0000</pubDate>
      <link>https://dev.to/rehmatworks/20-goals-developers-should-set-for-2020-1gnk</link>
      <guid>https://dev.to/rehmatworks/20-goals-developers-should-set-for-2020-1gnk</guid>
      <description>&lt;p&gt;In my opinion, developers are the busiest creatures on the earth, but this lifestyle results in a lot of negativities in their life. To ensure that we live a healthy life as well as to keep our social circle active, we should try to keep a balance in our routine. I have copied a set of 20 goals below that should help a developer (or any other person with an imbalanced routine) live a happier and healthier life in 2020 and onward.&lt;/p&gt;

&lt;p&gt;These goals are obtained from a religious source but they should help all people regardless of their believes.&lt;/p&gt;

&lt;h3&gt;
  
  
  #1. Be kind
&lt;/h3&gt;

&lt;p&gt;Even a small act of kindness can make all the difference in someone's life.&lt;/p&gt;

&lt;h3&gt;
  
  
  #2. Meditate
&lt;/h3&gt;

&lt;p&gt;Whether as a part of your faith, or just as a means to disconnect from the world for a few moments, meditation is known to help improve the body, mind and soul.&lt;/p&gt;

&lt;h3&gt;
  
  
  #3. Spend time with elderly
&lt;/h3&gt;

&lt;p&gt;Speak to them, learn from them, and look after them. They have a lifetime of experiences to share.&lt;/p&gt;

&lt;h3&gt;
  
  
  #4. Help the less fortunate
&lt;/h3&gt;

&lt;p&gt;Generosity to others, no matter who they are or where they come from, is a key pillar of Islam (and many other religions).&lt;/p&gt;

&lt;h3&gt;
  
  
  #5. Volunteer
&lt;/h3&gt;

&lt;p&gt;Whether you give your time, knowledge, or resources, each one of us can do so much to help the societies we live in.&lt;/p&gt;

&lt;h3&gt;
  
  
  #6. Embrace differences
&lt;/h3&gt;

&lt;p&gt;Spend time learning about people that are different than you. Encouraging pluralism starts with you.&lt;/p&gt;

&lt;h3&gt;
  
  
  #7. Spend time with loved ones
&lt;/h3&gt;

&lt;p&gt;Let's not take our family and friends for granted. Spend quality time with those who are dearest and help keep your circles united.&lt;/p&gt;

&lt;h3&gt;
  
  
  #8. Make healthy choices
&lt;/h3&gt;

&lt;p&gt;Making your health and wellbeing a priority is important not only for you, but also for those around you.&lt;/p&gt;

&lt;h3&gt;
  
  
  #9. Stay active
&lt;/h3&gt;

&lt;p&gt;Doctors recommend at least 150 minutes per week of moderate-intensity aerobic activity or 75 minutes per week of vigorous aerobic activity, or a combination of both, preferably spread throughout the week.&lt;/p&gt;

&lt;h3&gt;
  
  
  #10. Learn a new skill
&lt;/h3&gt;

&lt;p&gt;Whether related to your job or otherwise, keeping yourself current, regardless of your age, is important.&lt;/p&gt;

&lt;h3&gt;
  
  
  #11. Set career goals
&lt;/h3&gt;

&lt;p&gt;Knowing your destination is the first step to get there.&lt;/p&gt;

&lt;h3&gt;
  
  
  #12. Read a new book
&lt;/h3&gt;

&lt;p&gt;Reading is a fantastic pastime that helps to develop vocabulary and critical thinking skills, no matter your age.&lt;/p&gt;

&lt;h3&gt;
  
  
  #13. Stay current on world affairs
&lt;/h3&gt;

&lt;p&gt;Understand not only what's happening in your local community, but also in other countries around the world.&lt;/p&gt;

&lt;h3&gt;
  
  
  #14. Make a new friend
&lt;/h3&gt;

&lt;p&gt;Good friendships last a lifetime and can enrich our lives, so invest the time in making a new friend or reconnecting with old ones.&lt;/p&gt;

&lt;h3&gt;
  
  
  #15. Invest in education
&lt;/h3&gt;

&lt;p&gt;From early childhood through to post-secondary, education is paramount and will determine the future of our youth and community. Young or old, as students or mentors, we should all invest more in education for ourselves and our children.&lt;/p&gt;

&lt;h3&gt;
  
  
  #16. Protect the environment
&lt;/h3&gt;

&lt;p&gt;As the Qur'an says, all that is on this earth has been entrusted to us to look after. Each generation must leave for its successors a wholesome and sustainable social and physical environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  #17. Use technology responsibly
&lt;/h3&gt;

&lt;p&gt;Be mindful of how you are using electronics such as smartphones and laptops, how you are sharing your data, as well as the frequency of usage.&lt;/p&gt;

&lt;h3&gt;
  
  
  #18. Be happy
&lt;/h3&gt;

&lt;p&gt;Happiness is a state of mind. And don't forget that happiness is contagious!&lt;/p&gt;

&lt;h3&gt;
  
  
  #19. Be grateful
&lt;/h3&gt;

&lt;p&gt;We all have things to be thankful for. Let's take the time to remember them and those that have helped us along the way.&lt;/p&gt;

&lt;h3&gt;
  
  
  #20. Celebrate your success
&lt;/h3&gt;

&lt;p&gt;Working hard and achieving your goals deserves to be celebrated.&lt;/p&gt;

&lt;p&gt;You may share your thoughts on points that you liked the most and the ones that you didn't like or you don't want to apply in your life.&lt;/p&gt;

</description>
      <category>developers</category>
      <category>goals</category>
      <category>2020</category>
    </item>
    <item>
      <title>Managing a ServerPilot Server over Command-line Interface</title>
      <dc:creator>Rehmat Alam</dc:creator>
      <pubDate>Thu, 02 Jan 2020 10:02:25 +0000</pubDate>
      <link>https://dev.to/rehmatworks/managing-a-serverpilot-server-over-command-line-interface-4khb</link>
      <guid>https://dev.to/rehmatworks/managing-a-serverpilot-server-over-command-line-interface-4khb</guid>
      <description>&lt;p&gt;When it comes to server management tools, ServerPilot is my favourite option. I stopped using cPanel almost 4 years ago and switched to &lt;a href="https://serverpilot.io" rel="noopener noreferrer"&gt;ServerPilot&lt;/a&gt;. Since then, I'm loving it.&lt;/p&gt;

&lt;p&gt;ServerPilot offers a minimalist web UI where you can manage your web apps, databases and other related stuff. But recently, I felt the need of a CLI program to manage a ServerPilot-provisioned server as I love CLI to manage servers. So to achieve that goal, I've written a Python package called &lt;strong&gt;SPSuite&lt;/strong&gt; that you can use in order to manage a server that you have provisioned using ServerPilot.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Install SPSuite?
&lt;/h2&gt;

&lt;p&gt;The package is &lt;a href="https://github.com/rehmatworks/spsuite" rel="noopener noreferrer"&gt;available at GitHub at this URL&lt;/a&gt;. You can install it from the source code or you can use PIP to install from &lt;a href="https://pypi.org/project/spsuite/" rel="noopener noreferrer"&gt;PyPi repository&lt;/a&gt; directly.&lt;/p&gt;

&lt;p&gt;To install using PIP, execute the following command in your terminal after signing into your ServerPilot-provisioned server as root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip3 &lt;span class="nb"&gt;install &lt;/span&gt;spsuite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the package is installed, a command &lt;code&gt;spsuite&lt;/code&gt; will become available to you. Type &lt;code&gt;spsuite -h&lt;/code&gt; to see all available commands. Here is the list of sub-commands currently available on &lt;code&gt;spsuite&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Sub-command&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;listsysusers&lt;/td&gt;
&lt;td&gt;Show all SSH users existing on this server.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;createsysuser&lt;/td&gt;
&lt;td&gt;Create a new SSH user.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;listapps&lt;/td&gt;
&lt;td&gt;Show all existing apps.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;createapp&lt;/td&gt;
&lt;td&gt;Create a new app.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updatedomains&lt;/td&gt;
&lt;td&gt;Update an apps' domains and recreate vhost files.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;changephp&lt;/td&gt;
&lt;td&gt;Change PHP version of an app.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;changephpall&lt;/td&gt;
&lt;td&gt;Change PHP version for all apps.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deleteapp&lt;/td&gt;
&lt;td&gt;Delete an app permanently.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;delallapps&lt;/td&gt;
&lt;td&gt;Delete all apps permanently.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;listdbusers&lt;/td&gt;
&lt;td&gt;Show all existing database users.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;createsqluser&lt;/td&gt;
&lt;td&gt;Create a new MySQL user.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;updatesqlpassword&lt;/td&gt;
&lt;td&gt;Update any MySQL user's password.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dropuser&lt;/td&gt;
&lt;td&gt;Drop a MySQL user.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dropallsqlusers&lt;/td&gt;
&lt;td&gt;Drop all MySQL users except system users (root, sp-admin, debian-sys-maint, mysql.session, mysql.sys).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;listdbs&lt;/td&gt;
&lt;td&gt;Show all existing databases.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;createdb&lt;/td&gt;
&lt;td&gt;Create a new MySQL database.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dropdb&lt;/td&gt;
&lt;td&gt;Drop a MySQL database.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dropalldbs&lt;/td&gt;
&lt;td&gt;Drop all databases except system databases (information_schema, mysql, performance_schema, sys).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getcert&lt;/td&gt;
&lt;td&gt;Get letsencrypt cert for an app.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;getcerts&lt;/td&gt;
&lt;td&gt;Get letsencrypt certs for all apps.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;removecert&lt;/td&gt;
&lt;td&gt;Uninstall SSL cert from an app.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;removecerts&lt;/td&gt;
&lt;td&gt;Uninstall SSL certs for all apps.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;forcessl&lt;/td&gt;
&lt;td&gt;Force SSL certificate for an app.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;unforcessl&lt;/td&gt;
&lt;td&gt;Unforce SSL certificate for an app.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;forceall&lt;/td&gt;
&lt;td&gt;Force HTTPs for all apps.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;unforceall&lt;/td&gt;
&lt;td&gt;Unforce HTTPs for all apps.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;denyunknown&lt;/td&gt;
&lt;td&gt;Deny requests from unknown domains.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;allowunknown&lt;/td&gt;
&lt;td&gt;Allow requests from unknown domains.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Example:
&lt;/h3&gt;

&lt;p&gt;To create a new web app, execute this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spsuite createapp &lt;span class="nt"&gt;--name&lt;/span&gt; myapp &lt;span class="nt"&gt;--user&lt;/span&gt; rehmat &lt;span class="nt"&gt;--domains&lt;/span&gt; mysite.example,www.mysite.example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Above command will create a ServerPilot app with name &lt;code&gt;myapp&lt;/code&gt; under the SSH user &lt;code&gt;rehmat&lt;/code&gt; with domains &lt;code&gt;mysite.example&lt;/code&gt; and &lt;code&gt;www.mysite.example&lt;/code&gt;. If the SSH user doesn't exist, it will be created first. Latest PHP version will be used. If you need to use a specific PHP version for the web app, you can pass the version with &lt;code&gt;--php&lt;/code&gt; flag.&lt;/p&gt;

&lt;h3&gt;
  
  
  Things to Remember
&lt;/h3&gt;

&lt;p&gt;Please note that this tool doesn't rely on ServerPilot in order to manage a server once it's provisioned. As it works independently, the web apps, databases, SSH users and other data doesn't get stored in ServerPilot servers thus the data created using this app is not available in your ServerPilot web UI.&lt;/p&gt;

&lt;p&gt;You can even delete your server from ServerPilot after it's initial configuration and &lt;code&gt;spsuite&lt;/code&gt; will let you manage your server. This way, you can use ServerPilot to provision your server securely and then you can delete the server from ServerPilot and use &lt;code&gt;spsuite&lt;/code&gt; onward to avoid ServerPilot recurring fee. But I don't recommend that. I have written this utility to allow users to manage their ServerPilot servers over CLI and my intention is not to offer the users a way to bypass ServerPilot fee.&lt;/p&gt;

&lt;p&gt;If you face any issues while using this package, you can ask me in comments and I'll be glad to help. Moreover, don't forget to &lt;a href="https://github.com/rehmatworks/spsuite" rel="noopener noreferrer"&gt;star my GitHub repository&lt;/a&gt; if you found this tool helpful.&lt;/p&gt;

</description>
      <category>serverpilot</category>
      <category>ssl</category>
      <category>letsencrypt</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
