<?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: Alexandro Martinez</title>
    <description>The latest articles on DEV Community by Alexandro Martinez (@alexandromtzg).</description>
    <link>https://dev.to/alexandromtzg</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%2F83821%2F2e44dd1a-5c69-4309-8598-2e4d3fa5be4f.jpeg</url>
      <title>DEV Community: Alexandro Martinez</title>
      <link>https://dev.to/alexandromtzg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexandromtzg"/>
    <language>en</language>
    <item>
      <title>EarlyBee - From idea to launch in 3 days: Landing pages to get Pre-orders, Emails or Votes</title>
      <dc:creator>Alexandro Martinez</dc:creator>
      <pubDate>Wed, 08 May 2024 15:15:19 +0000</pubDate>
      <link>https://dev.to/alexandromtzg/from-idea-to-launch-in-3-days-earlybee-landing-pages-to-get-pre-orders-emails-or-votes-3a69</link>
      <guid>https://dev.to/alexandromtzg/from-idea-to-launch-in-3-days-earlybee-landing-pages-to-get-pre-orders-emails-or-votes-3a69</guid>
      <description>&lt;p&gt;TLDR: Create a quick landing page to for your project at &lt;a href="https://earlybee.io/" rel="noopener noreferrer"&gt;EarlyBee.io&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day #0 — Scratching my own itch
&lt;/h2&gt;

&lt;p&gt;Since I’m currently working on a &lt;a href="http://saasrock.com/saas-templates/directory-website-builder" rel="noopener noreferrer"&gt;Directory Listing Builder&lt;/a&gt;, I thought that I could get beta testers by having a private beta. But what if I got many emails? I thought that having a pre-order price would be better. But why not having both?&lt;/p&gt;

&lt;p&gt;A few weeks ago my initial domain idea was &lt;code&gt;Waitlister.co&lt;/code&gt;, where I’ll create a page like &lt;code&gt;dircraft.waitlister.co&lt;/code&gt; so I immediatly bought it, talked to my wife about it but she didn't like the domain. So we decided for &lt;a href="https://earlybee.io/" rel="noopener noreferrer"&gt;EarlyBee.io&lt;/a&gt; 🐝 as in early bird.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day #1— Friday night idea
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;I asked GPT to validate it&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Check out the full chat log I &lt;a href="https://chat.openai.com/share/e81d3b4b-45df-48f2-b5df-26fd79a3d1de" rel="noopener noreferrer"&gt;had with GPT here&lt;/a&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2Abcq3Q9MWML5UlDClub0K5A.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2Abcq3Q9MWML5UlDClub0K5A.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before I started my chat, I created a custom GPT called &lt;a href="https://chat.openai.com/g/g-GcYMimUdi-saasrock-portals-assistant" rel="noopener noreferrer"&gt;SaasRock Portals GPT Assistant&lt;/a&gt; giving it a bit of context about SaasRock &lt;a href="https://saasrock.com/docs/articles/build-b2b2c-saas-applications" rel="noopener noreferrer"&gt;B2B2B portals&lt;/a&gt;. This way GPT already has some basics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I'll use SaasRock to build the SaaS MVP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;My customers will manage their portals (in this case Landing Pages) at &lt;code&gt;/app/:tenant/portals/:portal&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The portal (landing page) will be available at &lt;code&gt;{subdomain}.earlybee.io&lt;/code&gt; (or using a custom domain)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;I bought the domain&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;My wife and I came up with a better domain name: early*&lt;em&gt;Bee&lt;/em&gt;*. The domains .com, .so, and .co were already taken, but .io was available.&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2A6I8c_pKFGyipt1YbfmxArw.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2A6I8c_pKFGyipt1YbfmxArw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;I asked GPT to generate a logo&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;I also asked GPT to generate a logo for me:&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AW-H4e7CSGlAetoEbtqgMyQ.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AW-H4e7CSGlAetoEbtqgMyQ.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;I used &lt;a href="https://www.adobe.com/express/feature/image/convert/png-to-svg" rel="noopener noreferrer"&gt;Adobe’s PNG to SVG&lt;/a&gt; converter.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then created the icon and logo in &lt;a href="https://www.canva.com/" rel="noopener noreferrer"&gt;Canva&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;End result:&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2ASMdTfV7veFNSlMzq1ehnvA.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2ASMdTfV7veFNSlMzq1ehnvA.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Such a cute be 🥹.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 2 — Proof of concept (4 hours)
&lt;/h2&gt;

&lt;p&gt;Motivated enough having a great domain name and a beautiful logo, I hacked the following demo in 2 hours. I basically started with the Portal application (what the end users will see):&lt;/p&gt;

&lt;p&gt;TLDW: These are some landing pages I tested.&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2A7uTp5GmGYhWRpw_AfMK8Yg.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2A7uTp5GmGYhWRpw_AfMK8Yg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I always like creating the end-product first, by not touching the database. For example in this case I have a specific files to have example data at &lt;code&gt;app/modules/earlybee/utils/fakeLandingPage.ts&lt;/code&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2ATijmwHRROwBYygfpWHxKaQ.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2ATijmwHRROwBYygfpWHxKaQ.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My time spent on the portal (7.5 hours):&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2ABpA1abBiO5aBOfmQn0Qh0A.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2ABpA1abBiO5aBOfmQn0Qh0A.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Time tracked for the end-product&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 3 — Build, Market, Manage
&lt;/h2&gt;

&lt;p&gt;Once I was happy with the portal, I started implementing the root application, which is where the makers will sign up:&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AH-Od2e4qkbULrE29lcoYkw.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AH-Od2e4qkbULrE29lcoYkw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Setting up Postmark to send Transactional Emails&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.loom.com/share/2bcc953d09db405986c7614382599998" rel="noopener noreferrer"&gt;Click here to watch me&lt;/a&gt; configure a Postmark server from scratch.&lt;/p&gt;

&lt;p&gt;Once your domain is verified, it will look 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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AXjvlED25EymAbNjlUnFMGA.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AXjvlED25EymAbNjlUnFMGA.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And you should be able to get receive emails from your domain:&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2ACWMC7GLDGurjZRITguKBfg.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2ACWMC7GLDGurjZRITguKBfg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Setting up Stripe to get Payments and Subscriptions&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Now, to quickly allow users to pay or subscribe to a plan, I need a Stripe account, put the secret key on my &lt;code&gt;.env&lt;/code&gt; file, go to &lt;code&gt;/admin/settings/pricing&lt;/code&gt;, click “&lt;strong&gt;Generate all plans&lt;/strong&gt;”, and that’s it! Visitors can now subscribe at the &lt;code&gt;/pricing&lt;/code&gt; page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.loom.com/share/4df4c39b9a584361a61bf20667f41941" rel="noopener noreferrer"&gt;Click here to watch me set up Stripe&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;My time spent on the landing page management app:&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AclMFoEiMjkjYG2Tzww3krg.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AclMFoEiMjkjYG2Tzww3krg.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Total hours: 2 hours&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Pre-launch Day&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;My checklist today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;✅ Post &lt;a href="https://youtu.be/qvz0a3ChLj4" rel="noopener noreferrer"&gt;EarlyBee on YouTube&lt;/a&gt; presenting the product&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ &lt;a href="https://x.com/AlexandroMtzG/status/1787544022837514277" rel="noopener noreferrer"&gt;Tweet about it&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Create a &lt;a href="https://www.producthunt.com/products/earlybee" rel="noopener noreferrer"&gt;Product Hunt teaser&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Send 210 emails to &lt;a href="https://saasrock.com/newsletter" rel="noopener noreferrer"&gt;SaasRock newsletter&lt;/a&gt; subscribers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;✅ Send +1,000 emails to &lt;a href="https://alexandromg.gumroad.com/" rel="noopener noreferrer"&gt;my Gumroad&lt;/a&gt; subscribers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;⌛ Write &lt;a href="https://saasrock.com/blog/earlybee-from-idea-to-launch-in-3-days-create-landing-pages-to-get-pre-orders-emails-and-votes" rel="noopener noreferrer"&gt;this blog post&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the design I came up with:&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2A0N5I6J8I-cNorvB6t2yNiQ.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2A0N5I6J8I-cNorvB6t2yNiQ.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/AlexandroMtzG" rel="noopener noreferrer"&gt;Let me know&lt;/a&gt; what you think!&lt;/p&gt;




&lt;h2&gt;
  
  
  ...Couldn't launch! Unexpected Stripe Acccount Activation Error
&lt;/h2&gt;

&lt;p&gt;I just encountered the following errors while trying to activate the production Stripe 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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AcN2Kgh7aTVC0iaJDU590Nw.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AcN2Kgh7aTVC0iaJDU590Nw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Verify an identity document&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Wait 24 hours to try again”&lt;/em&gt;, feels like I may have to reschedule the launch for Wednesday 8th. Stripe support was not able to help in time:&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AkffMyoPdUoQQqr-wm5almw.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AkffMyoPdUoQQqr-wm5almw.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I couldn't actually use Stripe connect, not even in development mode, which is essential for EarlyBee.&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AG0TaOyZyQlScw0clmhbWGQ.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AG0TaOyZyQlScw0clmhbWGQ.png" alt="Stripe Email Support"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And they actually never responded, twice. The next day I tried again and it blocked me.&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AQrTsLF8dpjAxLLLy0cEM_w.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AQrTsLF8dpjAxLLLy0cEM_w.png" alt="Stripe Connect disabled"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I kind of cheated: I had an pre-activated unused Stripe account (&lt;a href="https://saasrock.com/saas-templates/directory-website-builder" rel="noopener noreferrer"&gt;the one for this app&lt;/a&gt;) so I just renamed it and changed the website details 😅.&lt;/p&gt;

&lt;p&gt;Things happen 😄. But as of today, May 7th, it’s live:&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%2Fqwcsbptoezmuwgyijrxp.supabase.co%2Fstorage%2Fv1%2Fobject%2Fpublic%2Fnovel%2F1715277191342-earlybee-landingpage.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%2Fqwcsbptoezmuwgyijrxp.supabase.co%2Fstorage%2Fv1%2Fobject%2Fpublic%2Fnovel%2F1715277191342-earlybee-landingpage.png" title="earlybee-landingpage.png" alt="earlybee-landingpage.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is how my inbox looks right now (1 min before &lt;a href="https://producthunt.com/posts/earlybee/" rel="noopener noreferrer"&gt;PH launch&lt;/a&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%2Fqwcsbptoezmuwgyijrxp.supabase.co%2Fstorage%2Fv1%2Fobject%2Fpublic%2Fnovel%2F1715151357679-inbox-pre-launch.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%2Fqwcsbptoezmuwgyijrxp.supabase.co%2Fstorage%2Fv1%2Fobject%2Fpublic%2Fnovel%2F1715151357679-inbox-pre-launch.png" title="inbox-pre-launch.png" alt="inbox-pre-launch.png"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;I’m sooo excited that I was able to complete this project in such a short amount of time and effort. All possible because of the new SaasRock feature: &lt;strong&gt;Portals&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Some examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Get pre-orders: &lt;a href="https://dircraft.earlybee.io/" rel="noopener noreferrer"&gt;kickstart your project&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Collect emails: &lt;a href="https://alexandro-dev.earlybee.io/" rel="noopener noreferrer"&gt;start a newsletter&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get upvotes: &lt;a href="https://saasrock-nextjs.earlybee.io/" rel="noopener noreferrer"&gt;validate a product&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://saasrock.com/docs/articles/build-b2b2c-saas-applications" rel="noopener noreferrer"&gt;Learn more about building B2B2C apps in saasrock here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>saas</category>
      <category>webdev</category>
      <category>react</category>
      <category>javascript</category>
    </item>
    <item>
      <title>A Day in the Life of a Burned-out Developer: Your Ultimate Guide</title>
      <dc:creator>Alexandro Martinez</dc:creator>
      <pubDate>Thu, 14 Mar 2024 14:32:44 +0000</pubDate>
      <link>https://dev.to/alexandromtzg/a-day-in-the-life-of-a-burned-out-developer-your-ultimate-guide-2135</link>
      <guid>https://dev.to/alexandromtzg/a-day-in-the-life-of-a-burned-out-developer-your-ultimate-guide-2135</guid>
      <description>&lt;p&gt;In today’s high-paced world, there’s a secret formula to enduring your burnout state.&lt;/p&gt;

&lt;h3&gt;
  
  
  1/5) Morning Rituals: Fueling Up for the Day
&lt;/h3&gt;

&lt;p&gt;Begin your day at a leisurely 9 a.m. There’s no need to rush, the path to burnout is a marathon, not a sprint. Kickstart your day with coffee and breakfast, allowing caffeine to kick in for a few hours.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;…the path to burnout is a marathon, not a sprint.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then, Binge-watch a high-quality HBO Max series &lt;em&gt;(The White Lotus, Succession, The Sopranos…)&lt;/em&gt;. By engaging with complex narratives, you’re not only avoiding work but also filling your mind with enough distractions to prevent any meaningful productivity.&lt;/p&gt;

&lt;p&gt;This step is critical for cultivating a deep sense of avoidance and procrastination, key ingredients for burnout.&lt;/p&gt;

&lt;h3&gt;
  
  
  2/5) Time to Work: Be Productive
&lt;/h3&gt;

&lt;p&gt;Dive into the heart of your productive day:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mark emails as read&lt;/strong&gt;: the perfect productivity hack.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check your stats like it’s Bitcoin 2017&lt;/strong&gt;: mine are my &lt;a href="https://www.youtube.com/@saasrock" rel="noopener noreferrer"&gt;YouTube channel&lt;/a&gt; and &lt;a href="https://saasrock.com/analytics" rel="noopener noreferrer"&gt;saasrock’s analytics&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Look at your editor for a few minutes&lt;/strong&gt;: Open your editor of choice and stare blankly at the screen, perhaps opening a file or two, scrolling through lines of code without making any changes. Consider typing a few lines, then deleting them, or simply reformatting some code.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Consider typing a few lines, then deleting them, or simply reformatting some code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This gives you a sense of achievement and progress, a necessary delusion for the burnout-bound developer. The fleeting dopamine hit from seeing any uptick in numbers creates a perfect setup for later stress when actual work is required.&lt;/p&gt;

&lt;h3&gt;
  
  
  3/5) Physical and Mental Breaks: Thrive for Balance
&lt;/h3&gt;

&lt;p&gt;This is personal but you can replace any activity depending on your taste:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Walk your dog&lt;/strong&gt;: They don't live enough, so turn your exhaustion into their highlight of the day.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Eat&lt;/strong&gt; healthy with your &lt;strong&gt;wife&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Videogames&lt;/strong&gt;: Sign up for (&lt;a href="https://www.youtube.com/watch?v=uaKQOZUECn8" rel="noopener noreferrer"&gt;or watch&lt;/a&gt;) a few Rocket League tournaments, beat a few toxic &lt;a href="https://www.youtube.com/watch?v=fv2rQAaO5XE" rel="noopener noreferrer"&gt;Chess&lt;/a&gt; players, and relax with &lt;a href="https://store.steampowered.com/app/553850/HELLDIVERS_2/" rel="noopener noreferrer"&gt;Helldivers 2&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Social media&lt;/strong&gt;: answer some customer questions on my &lt;a href="https://discord.com/invite/KMkjU2BFn9" rel="noopener noreferrer"&gt;discord server&lt;/a&gt;. Perfect distraction, offering a semblance of productivity and importance while effectively ensuring that your workload remains untouched.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;They don't live enough, so turn your exhaustion into their highlight of the day.&lt;/p&gt;
&lt;/blockquote&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2A8ZErTbxQ17nRikKpUBIjpg.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2A8ZErTbxQ17nRikKpUBIjpg.png" alt="Corn"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These activities are vital, providing both a break from work and an opportunity to experience victories and defeats in a controlled environment.&lt;/p&gt;

&lt;p&gt;Make sure to document these activities on social media, it’s key to crafting a public persona that appears well-rounded and balanced, despite the internal chaos burnout.&lt;/p&gt;

&lt;h3&gt;
  
  
  4/5) Evening Rituals: Doubling Down on Avoidance
&lt;/h3&gt;

&lt;p&gt;As the evening rolls in, it’s time to double down on your avoidance strategies. Binge another series, sign up for another Rocket League tournament, have dinner with your wife, and dive into +5 YouTube videos on &lt;a href="https://www.youtube.com/watch?v=4CPttd1cyUw" rel="noopener noreferrer"&gt;Dune lore&lt;/a&gt;. This not only ensures a complete detachment from work but also solidifies your commitment to staying in a burnout state.&lt;/p&gt;

&lt;h3&gt;
  
  
  5/5) Nighttime Reflection: Setting Up for Tomorrow
&lt;/h3&gt;

&lt;p&gt;As you go to sleep at 2 a.m., reflect on the day’s achievements. The key to a successful journey to burnout is to set unrealistically high expectations, so think of ambitious projects to add to the never-ending backlog, and write down some of them to start the next (current) day with the left foot.&lt;/p&gt;

&lt;p&gt;Repeat.&lt;/p&gt;




&lt;h2&gt;
  
  
  But… How to Reach Burnout Effectively?
&lt;/h2&gt;

&lt;p&gt;In 2 simple steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  1/2) Work intensely
&lt;/h3&gt;

&lt;p&gt;Make sure to work at least 50 hours a week (or 10-hour days) for at least 2 months in a row.&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AWOaqG-MlaQYQl35Ltoqk3Q.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AWOaqG-MlaQYQl35Ltoqk3Q.png" alt="Monthly Work Stats"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Monthly Work Stats&lt;/p&gt;

&lt;p&gt;Distribute your hours in as many projects as possible, so you don’t put your all your eggs in one basket:&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2ANCAFK1uPWyHufZBRT3jPNA.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2ANCAFK1uPWyHufZBRT3jPNA.png" alt="WakaTime Project Distribution"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2/2) Set high expectations
&lt;/h3&gt;

&lt;p&gt;Set high but realistic expectations for your growth as a developer/founder.&lt;/p&gt;

&lt;p&gt;Expect at least 300 votes in your &lt;a href="https://www.producthunt.com/posts/saasrock" rel="noopener noreferrer"&gt;Product Hunt&lt;/a&gt; launches.&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AWNMPZVCAiZS1NdsVTp1U-A.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AWNMPZVCAiZS1NdsVTp1U-A.png" alt="SaasRock 1.0 launch"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Publish 2–3 YouTube videos and expect 1000 &lt;a href="https://www.youtube.com/@saasrock" rel="noopener noreferrer"&gt;subscribers&lt;/a&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AixU7FTqmI7VEvEPnIVv5vg.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AixU7FTqmI7VEvEPnIVv5vg.png" alt="SaasRock YouTube Channel"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Write a few blog posts, and expect +1k monthly SERP clicks.&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2ADTVw7y357WOnIPNH9URBvA.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2ADTVw7y357WOnIPNH9URBvA.png" alt="SEO Gets Analytics"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: Embracing Burnout
&lt;/h2&gt;

&lt;p&gt;Reaching burnout isn’t about the destination; it’s about the journey. Embrace it, and you’ll enjoy your time while having internal caos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;…burnout isn’t about the destination; it’s about the journey.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  On a serious note
&lt;/h3&gt;

&lt;p&gt;Not everything is about work. This satirical article focuses on the struggles of burn out, but there are other areas in life: family &lt;em&gt;(quality time)&lt;/em&gt;, health &lt;em&gt;(excersice)&lt;/em&gt;, fun &lt;em&gt;(hobbies)&lt;/em&gt;, personal growth &lt;em&gt;(learn new thing)&lt;/em&gt;…&lt;/p&gt;

&lt;p&gt;But as a solo-developer/founder I’ve always had burn out every 6–12 months. I must accept it or learn from it 😁. And I wanted to share not only the &lt;a href="https://twitter.com/saas_rock/status/1762764351595823579" rel="noopener noreferrer"&gt;good things&lt;/a&gt; of being a solo founder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://twitter.com/AlexandroMtzG" rel="noopener noreferrer"&gt;Follow me&lt;/a&gt; or join saasrock’s &lt;a href="https://discord.gg/KMkjU2BFn9" rel="noopener noreferrer"&gt;discord server&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>startup</category>
      <category>developers</category>
      <category>productivity</category>
    </item>
    <item>
      <title>SaasRock 1.0 - Build, Market, and Manage your SaaS</title>
      <dc:creator>Alexandro Martinez</dc:creator>
      <pubDate>Wed, 28 Feb 2024 15:24:31 +0000</pubDate>
      <link>https://dev.to/alexandromtzg/saasrock-10-build-market-and-manage-your-saas-15ki</link>
      <guid>https://dev.to/alexandromtzg/saasrock-10-build-market-and-manage-your-saas-15ki</guid>
      <description>&lt;p&gt;SaasRock 1.0 is here! After 2 years of development (and a few months of burnount), I'm marking it as stable.&lt;/p&gt;

&lt;p&gt;Live on &lt;a href="https://www.producthunt.com/posts/saasrock" rel="noopener noreferrer"&gt;Product Hunt&lt;/a&gt; 🎉.&lt;/p&gt;

&lt;h3&gt;
  
  
  1/3 Build your SaaS
&lt;/h3&gt;

&lt;p&gt;Jumpstart your idea with &lt;a href="https://saasrock.com/docs/articles/authentication" rel="noopener noreferrer"&gt;Auth&lt;/a&gt;, admin and user &lt;a href="https://saasrock.com/docs/articles/admin-portal" rel="noopener noreferrer"&gt;Dashboards&lt;/a&gt;, Stripe for &lt;a href="https://saasrock.com/docs/articles/subscriptions" rel="noopener noreferrer"&gt;Subscriptions&lt;/a&gt;, &lt;a href="https://saasrock.com/docs/articles/entity-builder" rel="noopener noreferrer"&gt;Entity Builder&lt;/a&gt; for autogenerated CRUD and &lt;a href="https://saasrock.com/docs/articles/api" rel="noopener noreferrer"&gt;API&lt;/a&gt;, and a &lt;a href="https://saasrock.com/docs/articles/workflows" rel="noopener noreferrer"&gt;Workflow&lt;/a&gt; builder.&lt;/p&gt;

&lt;h3&gt;
  
  
  2/3 Market your SaaS
&lt;/h3&gt;

&lt;p&gt;Built-in marketing modules for great &lt;a href="https://saasrock.com/docs/articles/seo-optimized" rel="noopener noreferrer"&gt;SEO&lt;/a&gt;: &lt;a href="https://saasrock.com/docs/articles/analytics" rel="noopener noreferrer"&gt;Analytics&lt;/a&gt;, &lt;a href="https://saasrock.com/docs/articles/blogging" rel="noopener noreferrer"&gt;Blog&lt;/a&gt;, &lt;a href="https://saasrock.com/docs/articles/email-marketing" rel="noopener noreferrer"&gt;Email Marketing&lt;/a&gt;, &lt;a href="https://saasrock.com/docs/articles/knowledge-base" rel="noopener noreferrer"&gt;Knowledge Bases&lt;/a&gt;, and a &lt;a href="https://saasrock.com/docs/articles/page-blocks" rel="noopener noreferrer"&gt;Page Blocks&lt;/a&gt; builder.&lt;/p&gt;

&lt;h3&gt;
  
  
  3/3 Manage your SaaS
&lt;/h3&gt;

&lt;p&gt;Keep everything running smoothly with the advanced &lt;a href="https://saasrock.com/docs/articles/accounts-and-users" rel="noopener noreferrer"&gt;Account Management&lt;/a&gt;, real-time &lt;a href="https://saasrock.com/docs/articles/notifications" rel="noopener noreferrer"&gt;Notifications&lt;/a&gt;, &lt;a href="https://saasrock.com/docs/articles/metrics" rel="noopener noreferrer"&gt;Metrics Tracker&lt;/a&gt;, &lt;a href="https://saasrock.com/docs/articles/onboarding" rel="noopener noreferrer"&gt;Onboarding&lt;/a&gt; flows, &lt;a href="https://saasrock.com/docs/articles/feature-flags" rel="noopener noreferrer"&gt;Feature flags&lt;/a&gt;, and &lt;a href="https://saasrock.com/docs/articles/roles-and-permissions" rel="noopener noreferrer"&gt;Roles&lt;/a&gt; and permissions management.&lt;/p&gt;




&lt;p&gt;And a little surprise... &lt;a href="https://ui.shadcn.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;shadcn/ui&lt;/strong&gt;&lt;/a&gt; has made it to 1.0.0!&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%2Fqwcsbptoezmuwgyijrxp.supabase.co%2Fstorage%2Fv1%2Fobject%2Fpublic%2Fnovel%2F1709079189084-theme-selector.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%2Fqwcsbptoezmuwgyijrxp.supabase.co%2Fstorage%2Fv1%2Fobject%2Fpublic%2Fnovel%2F1709079189084-theme-selector.png" title="theme-selector.png" alt="theme-selector.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://discord.gg/KMkjU2BFn9" rel="noopener noreferrer"&gt;Join the discord server&lt;/a&gt;, or &lt;a href="https://twitter.com/AlexandroMtzG" rel="noopener noreferrer"&gt;follow me&lt;/a&gt; on Twitter.&lt;/p&gt;

</description>
      <category>remix</category>
      <category>webdev</category>
      <category>saas</category>
      <category>react</category>
    </item>
    <item>
      <title>Chat with your Database using Custom GPTs</title>
      <dc:creator>Alexandro Martinez</dc:creator>
      <pubDate>Fri, 26 Jan 2024 17:10:28 +0000</pubDate>
      <link>https://dev.to/alexandromtzg/chat-with-your-database-using-custom-gpts-19f</link>
      <guid>https://dev.to/alexandromtzg/chat-with-your-database-using-custom-gpts-19f</guid>
      <description>&lt;p&gt;Learn how to chat with your database in natural language by using &lt;strong&gt;DataLang&lt;/strong&gt; API or using a custom GPT.&lt;/p&gt;

&lt;p&gt;Live on &lt;a href="https://www.producthunt.com/posts/datalang" rel="noopener noreferrer"&gt;ProductHunt&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Set up your Data Source
&lt;/h2&gt;

&lt;p&gt;Create a DataLang account (&lt;a href="https://datalang.io/pricing?coupon=launch" rel="noopener noreferrer"&gt;50% off&lt;/a&gt; 12 months for the first 100 customers) and set up your connection string.&lt;/p&gt;

&lt;h3&gt;
  
  
  Database Source
&lt;/h3&gt;

&lt;p&gt;Select “Database” and add your connection string.&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%2Fcdn-images-1.medium.com%2Fv2%2Fresize%3Afit%3A1600%2F1%2AjKPFJ6cxYH8WNl5QywkJVQ.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%2Fcdn-images-1.medium.com%2Fv2%2Fresize%3Afit%3A1600%2F1%2AjKPFJ6cxYH8WNl5QywkJVQ.png" alt="New Database Source"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom Server Source
&lt;/h3&gt;

&lt;p&gt;If you don’t want to share your password (although encrypted), download the &lt;a href="https://datalang.io/download/datalang-server" rel="noopener noreferrer"&gt;DataLang Custom server&lt;/a&gt; to host it on your server (&lt;a href="https://github.com/AlexandroMtzG/datalang-db-to-api" rel="noopener noreferrer"&gt;see the code&lt;/a&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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AJQ9t1JwzM1IdMk0Y3_NVlg.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%2Fcdn-images-1.medium.com%2Fmax%2F1600%2F1%2AJQ9t1JwzM1IdMk0Y3_NVlg.png" alt="Custom Server Source"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚠️ TIP: Only use database users with read-only access to the tables you want exposed, and never share your API Key.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Create Database Views
&lt;/h2&gt;

&lt;p&gt;Write the SQL statement to retrieve the necessary information to facilitate chat interactions among your users, employees, or customers.&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%2Fcdn-images-1.medium.com%2Fv2%2Fresize%3Afit%3A1600%2F1%2AtCBU0e3-mInrX3_23mex5A.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%2Fcdn-images-1.medium.com%2Fv2%2Fresize%3Afit%3A1600%2F1%2AtCBU0e3-mInrX3_23mex5A.png" alt="New Data View in SQL"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By doing this, you’re also exposing your data through the API by calling:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;datalang.io/api/data-sources/{source-slug}/views/{view-slug}?sync=false&lt;/code&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%2Fcdn-images-1.medium.com%2Fv2%2Fresize%3Afit%3A1600%2F1%2AQVkVGbFKwj8Q4PfhKI5ILQ.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%2Fcdn-images-1.medium.com%2Fv2%2Fresize%3Afit%3A1600%2F1%2AQVkVGbFKwj8Q4PfhKI5ILQ.png" alt="Get Data View via API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3 Create an Assistant
&lt;/h2&gt;

&lt;p&gt;An Assistant acts as a bridge, grouping various data sources for chat interaction. For instance, you could create a ‘&lt;strong&gt;Sales Assistant&lt;/strong&gt;’ that only has access to the &lt;strong&gt;&lt;em&gt;New York&lt;/em&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;em&gt;Chicago&lt;/em&gt;&lt;/strong&gt; branches' data sources, each with 2–3 specialized sales data views.&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%2Fcdn-images-1.medium.com%2Fv2%2Fresize%3Afit%3A1600%2F1%2A5Ypr21Xnh9w3JcQzE-Na6g.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%2Fcdn-images-1.medium.com%2Fv2%2Fresize%3Afit%3A1600%2F1%2A5Ypr21Xnh9w3JcQzE-Na6g.png" alt="Chat with the your custom Assistant"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is great by itself, but the Assistant’s API can’t do what ChatGPT can so let’s leverage the new GPT store.&lt;/p&gt;

&lt;h2&gt;
  
  
  4 Create a Custom GPT
&lt;/h2&gt;

&lt;p&gt;Head over to the &lt;a href="https://chat.openai.com/gpts" rel="noopener noreferrer"&gt;GPT store&lt;/a&gt;, and click Create. You’d need to fill in the following details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name&lt;/strong&gt;: Sales Assistant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Description&lt;/strong&gt;: New York and Chicago sales assistant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Actions&lt;/strong&gt;: What your assistant can access (TLDR: all data views from the selected data sources)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go to your &lt;a href="https://datalang.io/" rel="noopener noreferrer"&gt;DataLang&lt;/a&gt; assistant, click “Custom GPT”, and follow the details instructions.&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%2Fcdn-images-1.medium.com%2Fv2%2Fresize%3Afit%3A1600%2F1%2AgEVswwb5JneJ03ti5HQjwQ.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%2Fcdn-images-1.medium.com%2Fv2%2Fresize%3Afit%3A1600%2F1%2AgEVswwb5JneJ03ti5HQjwQ.png" alt="Create a Custom GPT Instructions"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, publish it and share it with your users, employees, or customers!&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%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A1400%2Fformat%3Awebp%2F1%2A2nKBcHSyd_mvNBaxv7rQNw.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%2Fmiro.medium.com%2Fv2%2Fresize%3Afit%3A1400%2Fformat%3Awebp%2F1%2A2nKBcHSyd_mvNBaxv7rQNw.png" alt="Chat with your Custom GPT in ChatGPT"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Become an Affiliate ✨
&lt;/h3&gt;

&lt;p&gt;If you know a company or two that could benefit from this, earn up to 30% for each payment in the first year. &lt;a href="https://datalang.getrewardful.com/" rel="noopener noreferrer"&gt;Click here&lt;/a&gt; to sign up as an affiliate.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s next?
&lt;/h2&gt;

&lt;p&gt;This was built using my Remix SaaS boilerplate &lt;a href="https://saasrock.com/?ref=datalang-launch" rel="noopener noreferrer"&gt;SaasRock&lt;/a&gt;, so tons of upcoming updates this year. I have many ideas specifically for DataLang:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support more data &lt;strong&gt;sources&lt;/strong&gt;: Files, API…&lt;/li&gt;
&lt;li&gt;Support more data &lt;strong&gt;views&lt;/strong&gt;: Stored procedures, spreadsheets…&lt;/li&gt;
&lt;li&gt;Add data &lt;strong&gt;formats&lt;/strong&gt;: Table, Chart, PDF…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://twitter.com/AlexandroMtzG" rel="noopener noreferrer"&gt;Follow me&lt;/a&gt; to stay tuned, or subscribe to &lt;a href="https://datalang.io/newsletter" rel="noopener noreferrer"&gt;DataLang’s newsletter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>gpt</category>
      <category>database</category>
      <category>sql</category>
      <category>nlp</category>
    </item>
    <item>
      <title>Vite makes your Remix dev productivity 10x in SaasRock v0.9.4</title>
      <dc:creator>Alexandro Martinez</dc:creator>
      <pubDate>Fri, 05 Jan 2024 17:57:20 +0000</pubDate>
      <link>https://dev.to/alexandromtzg/vite-makes-your-remix-dev-productivity-10x-in-saasrock-v094-2978</link>
      <guid>https://dev.to/alexandromtzg/vite-makes-your-remix-dev-productivity-10x-in-saasrock-v094-2978</guid>
      <description>&lt;p&gt;Migrating to &lt;strong&gt;Remix v2&lt;/strong&gt; was a great choice since now we can use the latest releases of everything: React 18, Tremor Charts, and now Vite!&lt;/p&gt;

&lt;p&gt;Vite is now supported in SaasRock 0.9.4! &lt;a href="https://saasrock.com/roadmap"&gt;Read the changelog here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vite ⚡
&lt;/h2&gt;

&lt;p&gt;The Developer Experience keeps getting better! It's so fast, that I managed to &lt;a href="https://twitter.com/AlexandroMtzG/status/1742998404752396404"&gt;start and launch a simple MVP&lt;/a&gt; (to generate MVP ideas) in 4 days.&lt;/p&gt;

&lt;p&gt;Before, any file change took around 7-12 seconds to refresh. Now it's instant! Keep in mind that I use an 8GB Macbook Pro, 2020, so your DX could be slower or faster, but &lt;code&gt;vite dev&lt;/code&gt; it's 10x faster than the previous &lt;code&gt;remix dev&lt;/code&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.loom.com/share/706da7fb34df4ba4a03a41dcd7dc6258?sid=ec16509f-70f3-4d55-9857-c2351da3f72d"&gt;Watch the demo here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K7cdBtd0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://qwcsbptoezmuwgyijrxp.supabase.co/storage/v1/object/public/novel/1703367211778-tweet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K7cdBtd0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://qwcsbptoezmuwgyijrxp.supabase.co/storage/v1/object/public/novel/1703367211778-tweet.png" alt="Remix Vite SaasRock Tweet" width="800" height="756"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dynamic Currency
&lt;/h2&gt;

&lt;p&gt;Now you can create a feature flag named &lt;em&gt;"currency"&lt;/em&gt; and add custom filters to target a specific audience and set their default displayed currency. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Language&lt;/strong&gt; is &lt;strong&gt;Spanish&lt;/strong&gt;? Set currency to &lt;strong&gt;MXN&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Country&lt;/strong&gt; is &lt;strong&gt;France&lt;/strong&gt;? Set currency to &lt;strong&gt;EUR&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.loom.com/share/234850841f9b47c3b4da931ce445f1fd?sid=4ed94059-0dab-4dfa-94c9-68108624d42e"&gt;Watch the demo here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JL6t82gR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://qwcsbptoezmuwgyijrxp.supabase.co/storage/v1/object/public/novel/1703367280902-dynamic-currency-feature-flags.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JL6t82gR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://qwcsbptoezmuwgyijrxp.supabase.co/storage/v1/object/public/novel/1703367280902-dynamic-currency-feature-flags.png" alt="dynamic-currency-feature-flags" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;In SaasRock 0.9.4 Enterprise edition, you can now create pricing plans with &lt;strong&gt;Quarterly&lt;/strong&gt; and/or &lt;strong&gt;Semi-Annual&lt;/strong&gt; prices.&lt;/p&gt;

&lt;p&gt;And of course, &lt;a href="https://saasrock.com/pricing"&gt;saasrock pricing&lt;/a&gt; is now reflecting that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iiIwXTsx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://qwcsbptoezmuwgyijrxp.supabase.co/storage/v1/object/public/novel/1703367397326-quarterly-and-semi-annual-pricing.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iiIwXTsx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://qwcsbptoezmuwgyijrxp.supabase.co/storage/v1/object/public/novel/1703367397326-quarterly-and-semi-annual-pricing.png" alt="quarterly-and-semi-annual-pricing" width="800" height="411"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Subscription Improvements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Subscription Features Badge
&lt;/h3&gt;

&lt;p&gt;For example, add a "New!" badge on any feature:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Rd6lAbLZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://qwcsbptoezmuwgyijrxp.supabase.co/storage/v1/object/public/novel/1703367515941-features-badge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Rd6lAbLZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://qwcsbptoezmuwgyijrxp.supabase.co/storage/v1/object/public/novel/1703367515941-features-badge.png" alt="features-badge" width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  New Set Pricing Features page
&lt;/h3&gt;

&lt;p&gt;Update features for selected plans instead of manually updating them one by one:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---zH1bQoV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://qwcsbptoezmuwgyijrxp.supabase.co/storage/v1/object/public/novel/1703367529057-pricing-features-bulk-update.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---zH1bQoV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://qwcsbptoezmuwgyijrxp.supabase.co/storage/v1/object/public/novel/1703367529057-pricing-features-bulk-update.png" alt="pricing-features-bulk-update" width="800" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Closed Issues
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Optimize the loading of api logs #339&lt;/li&gt;
&lt;li&gt;Hardcoded FAQ values #334&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://saasrock.com/roadmap"&gt;See the roadmap here&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;Based on the latest poll, I think I'll modularize every feature or add &lt;a href="https://ui.shadcn.com/"&gt;shadcn-ui&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bhBImuSG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://qwcsbptoezmuwgyijrxp.supabase.co/storage/v1/object/public/novel/1703366948357-image.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bhBImuSG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://qwcsbptoezmuwgyijrxp.supabase.co/storage/v1/object/public/novel/1703366948357-image.png" alt="SaasRock Poll" width="800" height="490"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Let me know what you think!&lt;/p&gt;

&lt;p&gt;You're welcome to join the &lt;a href="https://discord.gg/KMkjU2BFn9"&gt;Discord server&lt;/a&gt; or subscribe to &lt;a href="https://saasrock.com/newsletter"&gt;my newsletter&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>remix</category>
      <category>saas</category>
      <category>webdev</category>
      <category>react</category>
    </item>
    <item>
      <title>SaasRock Update: RowRepository, Blog for Tenants and Prompt Mapping</title>
      <dc:creator>Alexandro Martinez</dc:creator>
      <pubDate>Thu, 27 Jul 2023 05:27:28 +0000</pubDate>
      <link>https://dev.to/alexandromtzg/saasrock-update-rowrepository-blog-for-tenants-and-prompt-mapping-1f7d</link>
      <guid>https://dev.to/alexandromtzg/saasrock-update-rowrepository-blog-for-tenants-and-prompt-mapping-1f7d</guid>
      <description>&lt;p&gt;&lt;a href="https://saasrock.com/?ref=dev.to&amp;amp;utm_content=0-9-1-release"&gt;SaasRock&lt;/a&gt; 0.9.1 released!&lt;/p&gt;

&lt;p&gt;Implementing custom code is now easier with &lt;strong&gt;RowRepository&lt;/strong&gt; and &lt;strong&gt;RowModel&lt;/strong&gt;. Plus, tenants can now have their own &lt;strong&gt;Blog Posts&lt;/strong&gt;. And &lt;strong&gt;Prompt Mapping&lt;/strong&gt; to generate content using AI that maps to your entity rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;⭐ RowModel and RowRepository&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.loom.com/share/3b0b74822f164e6284bf38b35bb49ea6?sid=2ba5e8be-cb6c-4cea-af6b-df654a384f17"&gt;Watch the demo here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;SaasRock is heavily leading towards &lt;strong&gt;no code&lt;/strong&gt;, so the Entity Builder is becoming one of the most important features. But you can only get to a point with no code. Once you have some basic Entities with Properties and Relationships, you may want to run some custom code, for example, imagine you have a Contract entity, you may want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Process a Contract entity row upon creation &lt;em&gt;(onAfterCreate&lt;/em&gt; &lt;strong&gt;&lt;em&gt;RowHook&lt;/em&gt;&lt;/strong&gt;&lt;em&gt;)&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Override the default Contracts &lt;strong&gt;View Route&lt;/strong&gt; &lt;em&gt;(RowsViewRoute.tsx)&lt;/em&gt;, so it's not just a table with filters and pagination.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Listen to a &lt;strong&gt;Webhook Event&lt;/strong&gt; &lt;em&gt;(i.e. row.updated)&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And so on.&lt;/p&gt;

&lt;p&gt;I know we have the Code Generator to generate all the files regarding your Entity (list, new, overview, edit, DTOs, service to run DB operations...) but sometimes you only want to override a specific route or run something when something happens (RowHook).&lt;/p&gt;

&lt;p&gt;I'm not planning to create a full ORM for entity manipulation, but with the newly implemented classes, I hope it's easier.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;RowModel&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Server&lt;/strong&gt; and &lt;strong&gt;Client&lt;/strong&gt; side.&lt;/p&gt;

&lt;p&gt;This class encapsulates an entity row &lt;em&gt;(RowWithDetails)&lt;/em&gt; so you can get the row property values easier.&lt;/p&gt;

&lt;p&gt;In order to use the RowModel abstraction, I load all the entities in an EntitiesSingleton instance at &lt;code&gt;useAppData()&lt;/code&gt; and &lt;code&gt;useAdminData()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const name = RowValueHelper.getText({ entity, row, name: "name" });
const enabled = RowValueHelper.getBoolean({ entity, row, name: "enabled" });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const company = new RowModel(row);
const name = company.getText("name");
const enabled = company.getBoolean("enabled");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  &lt;strong&gt;RowRepository&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Server&lt;/strong&gt;-side only.&lt;/p&gt;

&lt;p&gt;This is an extension for RowModel, with the difference that it can only run in the backend to run async operations, such as &lt;code&gt;await updateText("property", "value");&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;In order to use this class, you must ensure you have called &lt;code&gt;getAllEntities&lt;/code&gt; or manually load them in the &lt;strong&gt;EntitiesSingleton&lt;/strong&gt; instance with &lt;code&gt;await EntitiesSingleton.load()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;await RowValueHelper.update({ entity, row,
  values: [
    { name: "name", textValue: "New name" },
    { name: "enabled", booleanValue: true },
  ],
  session: { tenantId, userId },
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Now:&lt;/strong&gt;&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const companyRepository = new RowRepository(item, {&lt;br&gt;
  session: { tenantId, userId },&lt;br&gt;
});&lt;br&gt;
await companyRepository.updateText("name", "New name");&lt;br&gt;
await companyRepository.updateBoolean("enabled", true);&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  &lt;strong&gt;⭐ Blog for Tenants&lt;/strong&gt;&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.loom.com/share/de15bff448c3460b9585826e46e1df3d?sid=92ae0c02-d558-4db1-a261-b077615de557"&gt;Watch the demo here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I've had a few requests for this feature. I really should've implemented every admin feature for app users as well. I've done that with a few: &lt;a href="https://saasrock.com/docs/articles/email-marketing"&gt;&lt;strong&gt;Email Marketing&lt;/strong&gt;&lt;/a&gt; and now &lt;a href="https://saasrock.com/docs/articles/blogging"&gt;&lt;strong&gt;Blog Posts&lt;/strong&gt;&lt;/a&gt;. But I should've implemented &lt;a href="https://saasrock.com/docs/articles/knowledge-base"&gt;&lt;strong&gt;Knowledge Base&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://saasrock.com/docs/articles/page-blocks"&gt;&lt;strong&gt;Page Blocks&lt;/strong&gt;&lt;/a&gt;, &lt;a href="https://saasrock.com/docs/articles/events-and-webhooks"&gt;&lt;strong&gt;Webhook Events&lt;/strong&gt;&lt;/a&gt;, and &lt;a href="https://saasrock.com/docs/articles/onboarding"&gt;&lt;strong&gt;Onboarding&lt;/strong&gt;&lt;/a&gt; for app users as well.&lt;/p&gt;

&lt;p&gt;Now your app users can create blog posts, and their blog will be at &lt;code&gt;/b/:tenant-slug&lt;/code&gt; and posts at &lt;code&gt;/b/:tenant-slug/post-slug&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;But you need to manually enable this at &lt;code&gt;appConfiguration.db.server.ts&lt;/code&gt; with &lt;code&gt;tenantBlogs: true&lt;/code&gt; &lt;em&gt;(I know, it should be a setting at&lt;/em&gt; &lt;code&gt;/admin/settings/app-features&lt;/code&gt;&lt;em&gt;)&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;⭐ Prompt Mapping&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.loom.com/share/3c7a099e48ae45919a2c96f166018d81?sid=07b9c8ff-5d33-47a3-ad21-e65e244a5961"&gt;Watch the demo here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With tools like &lt;a href="https://openai.com/blog/openai-api"&gt;OpenAI API&lt;/a&gt;, I'm trying to leverage some of its power for SaasRock users through the &lt;a href="https://saasrock.com/docs/articles/prompt-flow-builder"&gt;Prompt Flow Builder&lt;/a&gt;. Imagine the Blog Post feature being 100% built on the Entity Builder, this would mean you could create a Prompt Flow to autogenerate blog posts using custom prompts. That's for later. What's implemented right now is basically creating prompt flows to create or update Entity Rows and their properties.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;🔨 Minor Improvements&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I also worked on a few minor bug fixes and improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bulk Delete:&lt;/strong&gt; A new Entity Builder setting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;New Property Types&lt;/strong&gt;: WYSIWYG (novel with AI) &amp;amp; iframe src.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;My Experience with Deployment&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;A few thoughts about the best hosting + database provider for SaasRock apps. This is just my experience, I've deployed to Vercel + Supabase, Vercel + Vercel Postgres, Render + Supabase, Render + Render Postgres, &lt;a href="http://Fly.io"&gt;Fly.io&lt;/a&gt; + Supabase (fast!), &lt;a href="http://Fly.io"&gt;Fly.io&lt;/a&gt; + Fly Postgres (faster!!), and &lt;a href="http://Fly.io"&gt;Fly.io&lt;/a&gt; + SQLite (fastest!!!).&lt;/p&gt;

&lt;p&gt;I stuck with the Fly + Supabase combo 😀.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://Fly.io"&gt;Fly.io&lt;/a&gt; is awesome! My apps run so fast now, highly recommended. This is basically how you deploy in 5 commands:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fly apps create appname --org orgname&lt;br&gt;
flyctl secrets set ENV_VAR_1=ABC ... --app appname&lt;br&gt;
fly deploy --app appname&lt;br&gt;
fly scale vm shared-cpu-8x --app appname&lt;br&gt;
fly scale memory 4096 --app appname&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  &lt;strong&gt;What's Next?&lt;/strong&gt;&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;First, I'm going to the beach this week. When I come back I'll start working on a &lt;strong&gt;Workflow Engine&lt;/strong&gt;. It will start pretty basic, as every other feature does, but my plan is to implement &lt;a href="https://reactflow.dev/"&gt;ReactFlow&lt;/a&gt; to create triggers, and a true workflow, for example: Upon updating a "Contract" entity row -&amp;gt; Run this HTTP request (i.e. &lt;a href="https://www.docusign.com/"&gt;DocuSign&lt;/a&gt; API to create a signable contract) -&amp;gt; Get the SignUrl field from the HTTP response -&amp;gt; Update the "Contract" row property "signUrl".&lt;/p&gt;

&lt;p&gt;Once a minimal setup is ready, I'll start the &lt;strong&gt;Help Desk&lt;/strong&gt; feature, and of course, this will validate the &lt;strong&gt;Workflow Engine&lt;/strong&gt; &lt;em&gt;(i.e. send an email when creating an Issue)&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;And don't worry, both &lt;strong&gt;Help Desk&lt;/strong&gt; and the &lt;strong&gt;Workflow Engine&lt;/strong&gt; will be built for both admin and app users.&lt;/p&gt;

&lt;p&gt;The final shiny feature before 1.0 is still Affiliates and Referrals, something like &lt;a href="https://reflio.com/"&gt;&lt;strong&gt;Reflio&lt;/strong&gt;&lt;/a&gt; or &lt;a href="https://www.rewardful.com/"&gt;&lt;strong&gt;Rewardful&lt;/strong&gt;&lt;/a&gt;, but 100x simpler.&lt;/p&gt;




&lt;p&gt;Thanks a lot to my past and current subscribers. Had this been an open-source project, I may have already abandoned it like with &lt;a href="https://netcoresaas.com/"&gt;&lt;strong&gt;NetcoreSaas&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://saasfrontends.com/"&gt;&lt;strong&gt;SaasFrontends&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>blogging</category>
      <category>saas</category>
      <category>ai</category>
      <category>repository</category>
    </item>
    <item>
      <title>SaasRock KB - Open source Knowledge Base builder</title>
      <dc:creator>Alexandro Martinez</dc:creator>
      <pubDate>Thu, 29 Jun 2023 15:44:36 +0000</pubDate>
      <link>https://dev.to/alexandromtzg/saasrock-kb-open-source-knowledge-base-builder-33fh</link>
      <guid>https://dev.to/alexandromtzg/saasrock-kb-open-source-knowledge-base-builder-33fh</guid>
      <description>&lt;p&gt;Open-sourced &lt;a href="https://kb.saasrock.com/"&gt;SaasRock KB&lt;/a&gt;! A Knowledge Base starter kit built with Remix, Tailwind CSS, and Prisma.&lt;/p&gt;

&lt;p&gt;Watch the introduction demo: &lt;a href="https://www.loom.com/share/c5d6a04da4214e3689b38d0e5d211e25"&gt;https://www.loom.com/share/c5d6a04da4214e3689b38d0e5d211e25&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Star it on &lt;a href="https://github.com/AlexandroMtzG/saasrock-kb"&gt;GitHub&lt;/a&gt; if you want me to build a min Help Desk project!&lt;/p&gt;

&lt;p&gt;🌟 All features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Intercom/Crisp&lt;/strong&gt;-like knowledge base structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WYSIWYG&lt;/strong&gt; editor with @tiptap_editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Markdown&lt;/strong&gt; editor&lt;/li&gt;
&lt;li&gt;Multi-&lt;strong&gt;knowlege-base&lt;/strong&gt; support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-language&lt;/strong&gt; support&lt;/li&gt;
&lt;li&gt;Simple &lt;strong&gt;Analytics&lt;/strong&gt;: Track Views and Votes&lt;/li&gt;
&lt;li&gt;Image &lt;strong&gt;Storage&lt;/strong&gt; with Supabase&lt;/li&gt;
&lt;li&gt;Article &lt;strong&gt;Duplication&lt;/strong&gt;: Don't write from scratch&lt;/li&gt;
&lt;li&gt;Article &lt;strong&gt;Drafts&lt;/strong&gt;: draft and published copies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Import&lt;/strong&gt; and &lt;strong&gt;Export&lt;/strong&gt;: Quickly transfer knowledge bases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO&lt;/strong&gt; meta tags&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ll integrate it natively in ​&lt;a href="http://saasrock.com/"&gt;SaasRock&lt;/a&gt;​ v0.8.9 this week.&lt;/p&gt;

&lt;p&gt;Join the ​&lt;a href="https://discord.com/invite/KMkjU2BFn9"&gt;discord server​&lt;/a&gt; and let me know what you think 😁!&lt;/p&gt;

</description>
      <category>saas</category>
      <category>ai</category>
      <category>gpt</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Introducing DataLang - Ask questions to your Database in Natural Language</title>
      <dc:creator>Alexandro Martinez</dc:creator>
      <pubDate>Fri, 16 Jun 2023 18:00:35 +0000</pubDate>
      <link>https://dev.to/alexandromtzg/introducing-datalang-ask-questions-to-your-database-in-natural-language-4kd4</link>
      <guid>https://dev.to/alexandromtzg/introducing-datalang-ask-questions-to-your-database-in-natural-language-4kd4</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://datalang.io/demo?ref=dev.to&amp;amp;utm_content=introducing"&gt;DataLang&lt;/a&gt;&lt;/strong&gt; is yet another AI &lt;em&gt;(prompt engineering)&lt;/em&gt; tool that is set to change the way you interact with databases. I'm excited to introduce you to our platform that allows you to communicate with your database using natural language!&lt;/p&gt;

&lt;p&gt;Try the &lt;a href="https://datalang.io/demo?ref=dev.to&amp;amp;utm_content=introducing"&gt;live demo&lt;/a&gt; or &lt;a href="https://www.loom.com/share/1e28c89ed4b54085bdaa848bfd3f782e"&gt;watch the demo&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Working with databases can be a daunting task, especially for non-technical team members. Even for those adept at writing SQL queries, it can sometimes be a time-consuming process. What if there was a tool that could understand your natural language questions and convert them into SQL queries? That's where DataLang comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Can DataLang Do?
&lt;/h2&gt;

&lt;p&gt;DataLang is designed to make database interaction intuitive and user-friendly. Here's how it works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You set up your data source &lt;strong&gt;connection string&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;DataLang fetches all the &lt;strong&gt;schema tables&lt;/strong&gt; and columns from your data source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You ask a question&lt;/strong&gt; in natural language, such as &lt;em&gt;"How many users signed up this month?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;DataLang sends your question to &lt;strong&gt;GPT&lt;/strong&gt; &lt;em&gt;(OpenAI)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;GPT processes your question and generates an &lt;strong&gt;SQL query&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;SQL query executes&lt;/strong&gt; in your database.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;natural language response&lt;/strong&gt; is returned.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Security Measures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Credential Encryption
&lt;/h3&gt;

&lt;p&gt;I understand the importance of data security. That's why your data source credentials are encrypted before being stored in the DataLang database, and only decrypted before executing SQL. I use &lt;a href="https://gist.github.com/AlexandroMtzG/9e0ebd0751f49e3f6d8b1eac3651195b"&gt;this method&lt;/a&gt; to encrypt/decrypt credentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dangerous SQL Statements Prevention
&lt;/h3&gt;

&lt;p&gt;My prompt engineering method uses 4 prompts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Understanding the end-user question&lt;/li&gt;
&lt;li&gt;Interpreting the DB schema + making sense of the question&lt;/li&gt;
&lt;li&gt;Crafting SQL statements (SELECT only)&lt;/li&gt;
&lt;li&gt;Final SQL safety check&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the 4 steps, the prompts make sure to throw an &lt;strong&gt;"Unsafe question"&lt;/strong&gt; error if it identifies dangerous operations, such as INSERT, UPDATE, DELETE, ALTER, DROP...&lt;/p&gt;

&lt;h2&gt;
  
  
  API
&lt;/h2&gt;

&lt;p&gt;Use your account API Keys to send questions in the following format:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JCX7Tdvh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://yahooder.sirv.com/datalang/features/api-request.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JCX7Tdvh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://yahooder.sirv.com/datalang/features/api-request.png" alt="Send a POST request to the Questions API" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing That Suits Your Needs
&lt;/h2&gt;

&lt;p&gt;We offer different pricing plans to fit your needs and usage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hobby:&lt;/strong&gt; 2,000 questions/month, 1 data source, and 1 user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Growth:&lt;/strong&gt; 5,000 questions/month, 3 data sources, 3 users and API access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise:&lt;/strong&gt; 10,000 questions/month, 10 data sources, 10 users, API access, and priority support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also ask for a quote to have it in a custom server, have more questions per month, or have a custom feature developed, &lt;a href="https://datalang.io/contact?ref=dev.to&amp;amp;utm_content=introducing"&gt;contact us&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://datalang.io/pricing?ref=dev.to&amp;amp;utm_content=introducing"&gt;Try DataLang&lt;/a&gt; today!&lt;/p&gt;

&lt;p&gt;--&lt;/p&gt;

&lt;p&gt;I built this MVP with my SaaS framework &lt;a href="http://saasrock.com/?ref=dev.to&amp;amp;utm_content=introducing"&gt;SaasRock&lt;/a&gt;, so I'll wait for user feedback before adding more features. I'm not doing the same mistake of over-engineering a product before actually having users 😅.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://datalang.io/newsletter?ref=dev.to&amp;amp;utm_content=introducing"&gt;Subscribe to the newsletter&lt;/a&gt; for more!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sql</category>
      <category>saas</category>
      <category>nocode</category>
    </item>
    <item>
      <title>SaasRock Update - Autogenerated API docs, Code generator, View Manager, Row Hooks, and more</title>
      <dc:creator>Alexandro Martinez</dc:creator>
      <pubDate>Sat, 03 Jun 2023 18:43:09 +0000</pubDate>
      <link>https://dev.to/alexandromtzg/saasrock-update-autogenerated-api-docs-code-generator-view-manager-row-hooks-and-more-55n1</link>
      <guid>https://dev.to/alexandromtzg/saasrock-update-autogenerated-api-docs-code-generator-view-manager-row-hooks-and-more-55n1</guid>
      <description>&lt;p&gt;May was focused on a ton of improvements (mainly for the ​&lt;a href="https://saasrock.com/entity-builder?ref=dev.to&amp;amp;utm_content=v0-8-8"&gt;Entity Builder​&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ &lt;strong&gt;Autogenerated API Docs&lt;/strong&gt; with Swagger &lt;em&gt;(OpenAPI)&lt;/em&gt; and Postman&lt;/li&gt;
&lt;li&gt;⭐ &lt;strong&gt;Code Generator&lt;/strong&gt; support for new types (Multi-select, Range-number...)&lt;/li&gt;
&lt;li&gt;⭐ New &lt;strong&gt;Entity View Manager&lt;/strong&gt; at &lt;em&gt;/admin/entities/views&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;⭐ New &lt;strong&gt;Subscriptions&lt;/strong&gt; page at &lt;em&gt;/admin/accounts/subscriptions&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;⭐ &lt;strong&gt;Row Hooks&lt;/strong&gt;: Added functions to customize your BL &lt;em&gt;(onBeforeGetAll, onBeforeEdit, onAfterEdit...)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And other minor fixes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔨 &lt;strong&gt;Yes-Code&lt;/strong&gt;: Multi-select missing in generated files #304&lt;/li&gt;
&lt;li&gt;🔨 &lt;strong&gt;Multi-select&lt;/strong&gt; attribute not added to Yes-Code Helper #302&lt;/li&gt;
&lt;li&gt;🔨 Row Form &lt;strong&gt;Number Input&lt;/strong&gt; cannot clear #303&lt;/li&gt;
&lt;li&gt;🔨 Footer Block needs translations #272&lt;/li&gt;
&lt;li&gt;🔨 Edit entity gives the wrong path... #268&lt;/li&gt;
&lt;li&gt;🔨 ActionResultModal no way to set title #264&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;​&lt;a href="https://twitter.com/AlexandroMtzG/status/1664764186772008960"&gt;Tweet&lt;/a&gt;​&lt;/li&gt;
&lt;li&gt;Video - ​&lt;a href="https://www.loom.com/share/b693c877282348408f7ab0d36dc974b8"&gt;Autogenerated Docs API&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;​Video - ​&lt;a href="https://www.loom.com/share/a4b5f9176abc4eac85de8e0bc84bb16b"&gt;Account/Tenant Types and Relationships&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;​​&lt;a href="https://saasrock.com/entity-builder?ref=dev.to&amp;amp;utm_content=v0-8-8"&gt;Demo&lt;/a&gt;​ - Entity Builder &lt;em&gt;(Form/List previews, API docs, Code generator)&lt;/em&gt;​&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://saasrock.com/api/docs?ref=dev.to&amp;amp;utm_content=v0-8-8"&gt;Demo&lt;/a&gt;​ - Swagger Docs​&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://saasrock.com/postman_collection.json?ref=dev.to&amp;amp;utm_content=v0-8-8"&gt;Demo&lt;/a&gt;​ - Postman Collection&lt;/li&gt;
&lt;li&gt;​&lt;a href="https://saasrock.com/changelog?ref=dev.to&amp;amp;utm_content=v0-8-8"&gt;Changelog&lt;/a&gt;​ - SaasRock v0.8.8&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  What's Next?
&lt;/h3&gt;

&lt;p&gt;I've said this many times, but hopefully this month I can pull any of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge Base&lt;/strong&gt; &lt;em&gt;(intercom-like help center, ​preview​)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Help Desk&lt;/strong&gt; - Enterprise 🚀 _(accounts submit tickets)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Affiliates &amp;amp; Referrals&lt;/strong&gt; - Enterprise 🚀 &lt;em&gt;(create affiliate links to track signups/commissions)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know what you think of these improvements on the ​&lt;a href="https://discord.gg/KMkjU2BFn9"&gt;Discord server​&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>saas</category>
      <category>webdev</category>
      <category>react</category>
      <category>nocode</category>
    </item>
    <item>
      <title>SaasRock Update: GPT Prompt Builder, New Property Types, and more!</title>
      <dc:creator>Alexandro Martinez</dc:creator>
      <pubDate>Mon, 01 May 2023 08:07:00 +0000</pubDate>
      <link>https://dev.to/alexandromtzg/saasrock-update-gpt-prompt-builder-new-property-types-and-more-40j5</link>
      <guid>https://dev.to/alexandromtzg/saasrock-update-gpt-prompt-builder-new-property-types-and-more-40j5</guid>
      <description>&lt;p&gt;With &lt;a href="https://saasrock.com/?ref=dev.to&amp;amp;utm_content=v0.8.5-prompt-builder"&gt;SaasRock&lt;/a&gt;'s latest update, you can now seamlessly implement GPT in real-world applications and enjoy the benefits of new property types, designed to simplify no-code MVP iteration.&lt;/p&gt;

&lt;p&gt;Let's dive in!&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Prompt Flow Builder 🤖 🚀 &lt;em&gt;(a.k.a. prompt-chaining)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;New Property Types &amp;amp; Subtypes&lt;/li&gt;
&lt;li&gt;System Entities - TenantSettings&lt;/li&gt;
&lt;li&gt;Remix v2 Future Flags&lt;/li&gt;
&lt;li&gt;Minor Improvements&lt;/li&gt;
&lt;li&gt;What's next for v0.9&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Prompt Flow Builder
&lt;/h2&gt;

&lt;p&gt;The biggest and most complex feature in this update is the brand-new Prompt Flow Builder, available for Enterprise users 🚀. This powerful tool empowers you to effortlessly create, manage, and execute GPT prompt templates/flows 🤖.&lt;/p&gt;

&lt;p&gt;In the following demo, I just type an &lt;em&gt;&lt;strong&gt;"idea"&lt;/strong&gt;&lt;/em&gt; and my prompt flow suggests me a website &lt;em&gt;name&lt;/em&gt;, &lt;em&gt;domain&lt;/em&gt;, &lt;em&gt;feature list&lt;/em&gt;, and a &lt;em&gt;CTA&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Demo: &lt;a href="https://www.loom.com/share/64e4f6092acd4f11a37d2695e63b1c42"&gt;https://www.loom.com/share/64e4f6092acd4f11a37d2695e63b1c42&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  New Property Types
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Types- Multi-Select &amp;amp; Multi-Text
&lt;/h3&gt;

&lt;p&gt;I've added new property types to help you collect more diverse and specific data. With Multi-Select and Multi-Text properties, you now have greater flexibility in designing your forms and capturing the information you need from users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Subtypes
&lt;/h3&gt;

&lt;p&gt;I've also expanded our property subtypes with &lt;strong&gt;Email&lt;/strong&gt;, &lt;strong&gt;URL&lt;/strong&gt;, &lt;strong&gt;Phone&lt;/strong&gt;, &lt;strong&gt;Checkbox Cards&lt;/strong&gt;, and &lt;strong&gt;Radio Group Cards&lt;/strong&gt;. These subtypes enable you to create more refined and targeted user input fields for a superior user experience.&lt;/p&gt;

&lt;p&gt;Demo: &lt;a href="https://www.loom.com/share/dbbac201f3784f8793f7ab6c97c1eb28"&gt;https://www.loom.com/share/dbbac201f3784f8793f7ab6c97c1eb28&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo of Number &amp;amp; Date Ranges: &lt;a href="https://www.loom.com/share/51bdf313bb984ac2820f00d24eab41d4"&gt;https://www.loom.com/share/51bdf313bb984ac2820f00d24eab41d4&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  System Entities -  TenantSettings
&lt;/h2&gt;

&lt;p&gt;The TenantSettingsRow system entity is now available, providing a centralized location to manage tenant info. This opens the door to creating custom entities for other core models, such as &lt;strong&gt;User&lt;/strong&gt;, &lt;strong&gt;Blog Post&lt;/strong&gt;, &lt;strong&gt;TenantUser&lt;/strong&gt;...&lt;/p&gt;

&lt;p&gt;For this, you need to create a custom entity named &lt;strong&gt;"tenantSettings"&lt;/strong&gt; as type "System", then just create the fields you want for every account to fill.&lt;/p&gt;

&lt;p&gt;Demo: &lt;a href="https://www.loom.com/share/6f32352ee704461191016a5dc4ad9be3"&gt;https://www.loom.com/share/6f32352ee704461191016a5dc4ad9be3&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Remix v2 Future Flags
&lt;/h2&gt;

&lt;p&gt;The Remix team is making the migration for v2 so easy with &lt;a href="https://remix.run/docs/en/main/pages/v2"&gt;future flags&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"All v2 APIs and behaviors are available in v1 with Future Flags. They can be enabled one at a time to avoid development disruption of your project. After you have enabled all flags, upgrading to v2 should be a non-breaking upgrade."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've covered the &lt;strong&gt;v2_meta&lt;/strong&gt; and &lt;strong&gt;v2_errorBoundary&lt;/strong&gt; flags.&lt;/p&gt;

&lt;p&gt;I tried migrating from &lt;a href="https://github.com/remix-run/remix/releases/tag/remix%401.14.3"&gt;remix-run@1.14.3&lt;/a&gt; to &lt;a href="https://github.com/remix-run/remix/releases/tag/remix%401.15.0"&gt;remix-run@1.15.0&lt;/a&gt;. But it has incompatibility issues with &lt;a href="https://github.com/sergiodxa/remix-i18next/releases/tag/v3.0.0"&gt;remix-i18n@3.0.0&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here's a react@18, &lt;a href="mailto:remix-run@1.15.0"&gt;remix-run@1.15.0&lt;/a&gt;, and &lt;a href="mailto:remix-i18n@5.1.0"&gt;remix-i18n@5.1.0&lt;/a&gt; if you don't believe I tried 😅: &lt;a href="https://saasrock-dev-git-remixv2-alexandromtzg.vercel.app/"&gt;saasrock-dev-git-remixv2-alexandromtzg.vercel.app&lt;/a&gt; &lt;strong&gt;(it has awkward translations)&lt;/strong&gt;. So I guess we're going to be stuck with 1.14 until I implement a custom translation solution, or even better, Remix builds a native i18n solution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Minor Improvements
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Minor fix [Analytics 🚀]: User Identification&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Now when a user logs in, it will be identified across all Page Views and Events in the Analytics module.&lt;br&gt;
Filtering Page Views by Anon or specific User&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minor fix [Subscriptions]: Monthly usage by the current period&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now it calculates the monthly usage based on the current billing period, rather than the calendar month. This change provides a more accurate representation of the tenant's subscription usage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minor improvement [Entity Builder]: Order for Entity Rows&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now every row can be sorted on the Table autogenerated view.&lt;/p&gt;

&lt;p&gt;Demo: &lt;a href="https://www.loom.com/share/46526daf3d0445eba64d9333f747a9a2"&gt;https://www.loom.com/share/46526daf3d0445eba64d9333f747a9a2&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What's next for v0.9
&lt;/h2&gt;

&lt;p&gt;Stay tuned for the next update, v0.9, where I'll be working on big features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Knowledge Base (see the preview here)&lt;/li&gt;
&lt;li&gt;Customer Support / Help Desk (Enterprise 🚀)&lt;/li&gt;
&lt;li&gt;Affiliates &amp;amp; Referrals (Enterprise 🚀)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And from v0.9 to 1.0 I'll focus on performance 😮‍💨.&lt;/p&gt;

&lt;p&gt;As always, I appreciate your continued support and enthusiasm for SaasRock. If you have any feedback or suggestions, feel free to reach out on the public &lt;a href="https://discord.gg/KMkjU2BFn9"&gt;Discord server&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Check out the previous update (v0.8.4 - Feature Flags) &lt;a href="https://saasrock.com/blog/saasrock-v0-8-4-feature-flags-plus-minor-admin-portal-improvements"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>gpt</category>
      <category>saas</category>
      <category>webdev</category>
      <category>react</category>
    </item>
    <item>
      <title>SaasRock v0.8.4 🎉 - Feature Flags 🚩 + Admin Panel Improvements</title>
      <dc:creator>Alexandro Martinez</dc:creator>
      <pubDate>Wed, 12 Apr 2023 22:25:55 +0000</pubDate>
      <link>https://dev.to/alexandromtzg/saasrock-v084-feature-flags-admin-panel-improvements-4n95</link>
      <guid>https://dev.to/alexandromtzg/saasrock-v084-feature-flags-admin-panel-improvements-4n95</guid>
      <description>&lt;p&gt;Finally, consistent updates. &lt;a href="https://saasrock.com/?ref=dev.to&amp;amp;utm_content=v0-8-4"&gt;SaasRock&lt;/a&gt; v0.8.4!&lt;/p&gt;

&lt;p&gt;In this update, I focused on enhancing our admin portal with minor improvements and implementing Feature Flags &lt;em&gt;(Enterprise-only 🚀)&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Feature Flags 🚩
&lt;/h3&gt;

&lt;p&gt;You can now manage and control the release of new features using our Feature Flags system. Check out the &lt;a href="https://www.loom.com/share/c12d15ad42034f438f92653d7d60d461"&gt;video demo&lt;/a&gt; to learn more:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.loom.com/share/c12d15ad42034f438f92653d7d60d461"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_ejoLONg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://user-images.githubusercontent.com/8606530/231593355-28218c3f-604c-4391-96e5-27228544dc2c.png" alt="Feature Flags Video" width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Closed Issues
&lt;/h3&gt;

&lt;p&gt;There were a total of 5 closed issues this week:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;⭐ Feature: Feature Flags - &lt;a href="https://github.com/AlexandroMtzG/saasrock/issues/19"&gt;#19&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔨 GitHub Issue: Add Admin users from Dashboard - &lt;a href="https://github.com/AlexandroMtzG/saasrock/issues/28"&gt;#28&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔨 GitHub Issue: Deactivate Account - &lt;a href="https://github.com/AlexandroMtzG/saasrock/issues/147"&gt;#147&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔨 GitHub Issue: Tenant IP Logging - &lt;a href="https://github.com/AlexandroMtzG/saasrock/issues/68"&gt;#68&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔨 GitHub Issue: Filter Users by Last Login - &lt;a href="https://github.com/AlexandroMtzG/saasrock/issues/148"&gt;#148&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&gt;

&lt;p&gt;Add Admin users from Dashboard:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mn3P0WN8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://user-images.githubusercontent.com/8606530/231592584-45d86109-69b5-426c-95dc-d25653bd4bcf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mn3P0WN8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://user-images.githubusercontent.com/8606530/231592584-45d86109-69b5-426c-95dc-d25653bd4bcf.png" alt="Add Admin users from Dashboard" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Deactivate/Activate Account with a Reason:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rfQdzkJh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://user-images.githubusercontent.com/8606530/231592494-1bbba71e-190f-4e5d-8186-f3166c19af8b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rfQdzkJh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://user-images.githubusercontent.com/8606530/231592494-1bbba71e-190f-4e5d-8186-f3166c19af8b.png" alt="Deactivate Account" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tenant IP Logging:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N5JVet5---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://user-images.githubusercontent.com/8606530/231592449-ac4e6856-de37-4f25-ab5f-edfb24866ad2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N5JVet5---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://user-images.githubusercontent.com/8606530/231592449-ac4e6856-de37-4f25-ab5f-edfb24866ad2.png" alt="Tenant IP Logging" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Filter Users by Last Login:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1F3LOmJK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://user-images.githubusercontent.com/8606530/231592225-eaaf2c61-f22e-4f7e-92c6-c9ed22741063.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1F3LOmJK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://user-images.githubusercontent.com/8606530/231592225-eaaf2c61-f22e-4f7e-92c6-c9ed22741063.png" alt="Filter Users by Last Login" width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you enjoy these new features and improvements. As always, I appreciate your feedback and support in the &lt;a href="https://discord.gg/KMkjU2BFn9"&gt;discord server&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;For v0.9, I'll start working on these two Enterprise features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Customer Support / Help Desk MVP&lt;/li&gt;
&lt;li&gt;Knowledge Base&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And grab a few more issues from the &lt;a href="https://saasrock.com/docs/roadmap?ref=dev.to&amp;amp;utm_content=v0-8-4"&gt;roadmap&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>saas</category>
      <category>webdev</category>
      <category>typescript</category>
      <category>react</category>
    </item>
    <item>
      <title>Create Compelling SaaS Marketing Pages: ChatGPT-Driven Copy with SaasRock — Part 6</title>
      <dc:creator>Alexandro Martinez</dc:creator>
      <pubDate>Wed, 05 Apr 2023 03:49:31 +0000</pubDate>
      <link>https://dev.to/alexandromtzg/create-compelling-saas-marketing-pages-chatgpt-driven-copy-with-saasrock-part-6-5595</link>
      <guid>https://dev.to/alexandromtzg/create-compelling-saas-marketing-pages-chatgpt-driven-copy-with-saasrock-part-6-5595</guid>
      <description>&lt;p&gt;Discover how to create compelling SaaS marketing pages using ChatGPT-driven design with &lt;a href="https://saasrock.com/?ref=dev.to&amp;amp;utm_content=saasrock-delega-part-6"&gt;SaasRock v0.8.3&lt;/a&gt; so you can leverage AI technology to make your marketing pages more engaging and relevant for your audience.&lt;/p&gt;

&lt;p&gt;Check out &lt;a href="https://alexandromtzg.medium.com/building-a-document-and-contract-saas-with-saasrock-part-5-pricing-plans-bd8888f56751"&gt;part 5 here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chapter 6
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;SEO Meta Tags&lt;/li&gt;
&lt;li&gt;Landing Page Blocks&lt;/li&gt;
&lt;li&gt;Generating the Landing Page with ChatGPT&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. SEO Meta Tags
&lt;/h2&gt;

&lt;p&gt;I first want to describe what my SaaS does using the &lt;em&gt;“app/modules/pageBlocks/utils/&lt;strong&gt;defaultSeoMetaTags&lt;/strong&gt;.ts”&lt;/em&gt; meta tags: &lt;em&gt;title, description, keywords, image, thumbnail, twitterSite, and twitterCreator&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="p"&gt;export const siteTags: MetaTagsDto = {
&lt;/span&gt;&lt;span class="gd"&gt;-  title: "SaasRock | The One-Man SaaS Framework",
-  description:"Quick start your MVP with out-of-the-box SaaS features like Authentication, Pricing &amp;amp; Subscriptions, Admin &amp;amp; App portals, Entity Builder (CRUD, API, Webhooks, Permissions, Logs...), Blogging, CRM, Email Marketing, Page Block Builder, Notifications, Onboarding, and more.",
-  keywords: "remix,saas,tailwindcss,prisma,react,typescript,boilerplate,saas-kit,saas-boilerplate,stripe,postmark,admin-portal,app-dashboard,multi-tenancy",
-  image: "https://yahooder.sirv.com/saasfrontends/remix/ss/cover.png",
-  thumbnail: "https://yahooder.sirv.com/saasfrontends/remix/thumbnail.png",
-  twitterSite: "@saas_rock",
&lt;/span&gt;&lt;span class="gi"&gt;+  title: "Délega | Gestión de cumplimiento",
+  description: "Gestión de cumplimiento de proveedores especializados. Firma tus contratos y gestiona evidencia de documentación legal de proveedores como Opinión de Cumplimiento SAT, INFONAVIT, IMSS y documentación para REPSE .",
+  keywords: "administracion de proveedores, cumplimiento de proveedores, proveedores, proveedores de servicios, documentacion, gestion de documentos, firma de contratos, contrato digital, infonavit, imss, sat, repse, cumplimiento",
+  image: "https://yahooder.sirv.com/Delega/SEO/seo.png",
+  thumbnail: "https://yahooder.sirv.com/Delega/SEO/seo.png",
+  twitterSite: "@delega_app",
&lt;/span&gt;&lt;span class="p"&gt;twitterCreator: "@AlexandroMtzG",
&lt;/span&gt;&lt;span class="err"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Landing Page Blocks
&lt;/h2&gt;

&lt;p&gt;SaasRock has a built-in page blocks builder, read more about this &lt;a href="https://javascript.plainenglish.io/building-a-page-block-builder-with-remix-and-tailwind-css-f9044a09cfa8"&gt;here&lt;/a&gt; or watch the &lt;a href="https://www.loom.com/share/aabfac5c4fb94e2698e459fa4a01f948"&gt;demo video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The default landing page looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;defaultLandingPage&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;t&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TFunction&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blocks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PageBlockDto&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="c1"&gt;// Banner&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;banner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;top&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SaasRock v0.8.2 🎉 + Entity Code Generator 🚀&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;cta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;front.changelog.title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/changelog&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;isPrimary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// Header&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;header&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;defaultHeader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// Hero&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;hero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;simple&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;headline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;front.hero.headline1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;front.hero.headline2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://yahooder.sirv.com/saasrock/seo/admin-portal.png&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;cta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;front.hero.buy&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/pricing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;isPrimary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;front.hero.docs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/docs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;isPrimary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="na"&gt;topText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;front.hero.subheadline1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;bottomText&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;front.hero.hint&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/changelog&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I have already implemented the following blocks:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NsFZ0-nh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2A8dlH9Wu7KkVDI9dGYpgPMA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NsFZ0-nh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2A8dlH9Wu7KkVDI9dGYpgPMA.png" alt="Supported Blocks" width="880" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I could update the &lt;em&gt;&lt;strong&gt;“defaultLadingPage”&lt;/strong&gt;&lt;/em&gt; object manually, or...&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Generating the Landing Page with ChatGPT
&lt;/h2&gt;

&lt;p&gt;Having configured the meta tags, I can now toggle the “?editMode=true” on the landing page, and click on the ChatGPT icon to automatically generate the existing blocks. It will open up a modal to specify the context. See in the following image, the meta tags are automatically loaded.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jvshbWM4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2ANLnREtOqVXpF3WbAnXVq6g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jvshbWM4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2ANLnREtOqVXpF3WbAnXVq6g.png" alt="ChatGPT parameters" width="880" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I forgot to update the OpenAPI key env variable &lt;em&gt;(OPENAI_API_KEY)&lt;/em&gt;. You can get yours here: &lt;a href="https://platform.openai.com/account/api-keys"&gt;https://platform.openai.com/account/api-keys&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gBeKHy0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2AH2dPahwi-lx5ryZ4BoPgew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gBeKHy0q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2AH2dPahwi-lx5ryZ4BoPgew.png" alt="Missing OpenAI API Key" width="880" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After restarting the server so the .env variable loads, and about 30 seconds, I now have a fully functional landing page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vRiO3AtW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2AsLeFT45abTCX6IGKCmK2OA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vRiO3AtW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2AsLeFT45abTCX6IGKCmK2OA.png" alt="Generated Landing Page" width="880" height="2844"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A few things about this generated landing page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The landing page was generated in Spanish since my meta tags are in that language.&lt;/li&gt;
&lt;li&gt;I can click on the top button &lt;strong&gt;&lt;em&gt;“Download Blocks”&lt;/em&gt;&lt;/strong&gt; and paste them into the &lt;strong&gt;&lt;em&gt;“defaultLandingPage”&lt;/em&gt;&lt;/strong&gt; block array.&lt;/li&gt;
&lt;li&gt;I can add custom details before generating the blocks &lt;em&gt;(e.g. For the Food Industry)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;About 70% of the time, it works. Sometimes the ChatGPT-3.5-turbo model returns content in an incorrect format and the block data cannot be parsed &lt;em&gt;(JSON format)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;If I didn’t like a block, I could generate it again. Each block has its own ChatGPT icon. And I can inspect the response &lt;em&gt;(or ERROR)&lt;/em&gt; by clicking on it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OmYE7v3l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2AHpEm1cDWARACCHtLhd1ySA.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OmYE7v3l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2AHpEm1cDWARACCHtLhd1ySA.png" alt="ChatGPT Response" width="880" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Another example for the Features block.
&lt;/h3&gt;

&lt;p&gt;Parameters: &lt;em&gt;“SaaS for restaurants, 6 features, formal, innovative”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--71hSUNNS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2ALwoni9cb4H9e8iSJCPgTTQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--71hSUNNS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2ALwoni9cb4H9e8iSJCPgTTQ.png" alt="Prompt" width="880" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qCTwpZFk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2A3M446nVaVENWtdQ4tM4f3A.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qCTwpZFk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/v2/resize:fit:1400/format:webp/1%2A3M446nVaVENWtdQ4tM4f3A.png" alt="Features Block Example" width="880" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can even generate full startup ideas with this 👀!!!&lt;/p&gt;




&lt;h2&gt;
  
  
  End Result
&lt;/h2&gt;

&lt;p&gt;By utilizing &lt;strong&gt;ChatGPT&lt;/strong&gt;-driven design with &lt;a href="https://saasrock.com/?ref=dev.to&amp;amp;utm_content=saasrock-delega-part-6"&gt;SaasRock&lt;/a&gt;, you can create impressive SaaS marketing copy that matters to your target audience.&lt;/p&gt;

&lt;p&gt;There are even more exciting possibilities for the future of SaasRock and ChatGPT-driven design. A potential feature to be implemented in a future SaasRock release is a ChatGPT-Driven &lt;strong&gt;variant generator&lt;/strong&gt;. This enhancement would not only generate the copy for your SaaS marketing pages but also create different variants for each element, such as a more captivating &lt;strong&gt;Hero&lt;/strong&gt; design or a nicer &lt;strong&gt;Features&lt;/strong&gt; list/grid.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;em&gt;I used SaasRock v0.8.3, released on April 4th, 2023&lt;/em&gt;&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s next?
&lt;/h2&gt;

&lt;p&gt;In chapter 7, I’ll cover Migrating from SaasRock &lt;strong&gt;Core to Enterprise&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Switching to SaasRock &lt;strong&gt;Enterprise&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Creating an &lt;strong&gt;Onboarding&lt;/strong&gt; flow&lt;/li&gt;
&lt;li&gt;Page view &amp;amp; Event &lt;strong&gt;tracking&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And more SaasRock Enterprise features.&lt;/p&gt;

&lt;p&gt;Follow &lt;a href="https://twitter.com/AlexandroMtzG"&gt;me&lt;/a&gt; &amp;amp; &lt;a href="https://twitter.com/saas_rock"&gt;SaasRock&lt;/a&gt; or subscribe to &lt;a href="https://saasrock.com/newsletter?ref=dev.to&amp;amp;utm_content=saasrock-delega-part-6"&gt;my newsletter&lt;/a&gt; to stay tuned!&lt;/p&gt;

</description>
      <category>saas</category>
      <category>chatgpt</category>
      <category>webdev</category>
      <category>marketing</category>
    </item>
  </channel>
</rss>
