<?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: Jamal Moir</title>
    <description>The latest articles on DEV Community by Jamal Moir (@jamalmoir).</description>
    <link>https://dev.to/jamalmoir</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%2F237760%2F0b0883f9-c5d6-42e9-b612-b2addb5269e8.jpeg</url>
      <title>DEV Community: Jamal Moir</title>
      <link>https://dev.to/jamalmoir</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jamalmoir"/>
    <language>en</language>
    <item>
      <title>6 Takeaways From My Failed Bootstrapped SaaS Business</title>
      <dc:creator>Jamal Moir</dc:creator>
      <pubDate>Fri, 22 Jan 2021 08:56:26 +0000</pubDate>
      <link>https://dev.to/jamalmoir/6-takeaways-from-my-failed-bootstrapped-saas-business-195n</link>
      <guid>https://dev.to/jamalmoir/6-takeaways-from-my-failed-bootstrapped-saas-business-195n</guid>
      <description>&lt;p&gt;They (not Einstein) say that the definition of insanity is doing the same thing over and over again and expecting different results.&lt;/p&gt;

&lt;p&gt;So, after failing to take my last bootstrapped SaaS business past the alpha stage in 2019, there are some things about my process that I have to change.&lt;/p&gt;

&lt;p&gt;I spent some time reflecting on my last try and a few things stood out to me as fatal mistakes that doomed my business to be just another domain in my NameCheap account.&lt;/p&gt;

&lt;p&gt;I'm going to break each one down in the hope that you will read this, and avoid the mistakes I made.&lt;/p&gt;

&lt;h1&gt;
  
  
  1. I Chose Technology I Wasn't Familiar With
&lt;/h1&gt;

&lt;p&gt;As an engineer, I'm always looking to learn new technologies and further my knowledge in my field. It's vital to stay relevant and to stay valuable.&lt;/p&gt;

&lt;p&gt;At the time, I was interested in Firebase and so decided that I would write my entire backend in the stack they provide. Even though it has decent documentation and isn't too complicated, it added extra friction.&lt;/p&gt;

&lt;p&gt;This friction manifested itself in the form of burnout and without a doubt, contributed to the downfall of my first SaaS business.&lt;/p&gt;

&lt;p&gt;Learning new technologies is great, however, bootstrapping a business isn't the time to do this.&lt;/p&gt;

&lt;p&gt;As a solo coding founder, you will have a tonne of work on your hands, and not just coding either. Product design, UI/UX design, creating business systems, and more will all have to become a part of your day to day tasks.&lt;/p&gt;

&lt;p&gt;Learning new technology doesn't have to be, and in most cases shouldn't be added to that list. Don't make things harder for yourself than they already are.&lt;/p&gt;

&lt;p&gt;And if you are worried about your skills stagnating, don't. Where in a team you have other people to handle some of the issues that come up, as a solo coding founder you are going to have to learn how to handle ALL of them yourself.&lt;/p&gt;

&lt;p&gt;Choose technologies that you are comfortable with, are productive in, and enjoy using. You'll thank yourself down the line.&lt;/p&gt;

&lt;h1&gt;
  
  
  2. I Didn't Have a Well-Scoped MVP
&lt;/h1&gt;

&lt;p&gt;Yak-shaving, scope creep, and over-engineering, oh my!&lt;br&gt;
Any professional developer will be painfully aware of the dangers of this deadly trio. That doesn't however, mean that we don't still fall into their traps.&lt;/p&gt;

&lt;p&gt;Engineers love to engineer. We like to find clever solutions to hard problems, we like to optimise, and we like to experiment. This all leads us down a series of never-ending rabbit-holes, wasting time under the guise of "improving the product".&lt;/p&gt;

&lt;p&gt;In a larger company, you may have the resources to get away with this. As I found out though, solo coding founders don't.&lt;/p&gt;

&lt;p&gt;When I was coding up the MVP for my failed SaaS business, I had a loose idea, an approximate roadmap of what I wanted to build.&lt;/p&gt;

&lt;p&gt;I didn't however, strictly define what should go in my MVP and what could come later. I didn't define the scope of the features that I did plan out either.&lt;/p&gt;

&lt;p&gt;Because of this, I would often hear myself saying "There has to be a better way to…", "What if I…", or "I bet I could…". I would then open up a can of worms that was happy to stay shut, add in another "cool feature", or create a solution that is way too over-engineered (but it's future proof, right?).&lt;/p&gt;

&lt;p&gt;This lead to a bloated MVP, with features in that I didn't know if people wanted or not, that got released way past its deadline.&lt;/p&gt;

&lt;p&gt;When you are a solo coding founder, leave cans of worms tightly shut if they don't have to be opened. If you find yourself writing code and building features because "in the future, you might need to…" then stop.&lt;/p&gt;

&lt;p&gt;If you don't need something right now, don't make it. You don't have time to build everything you need for the future of your product. Your product won't even have a future if you don't release it due to never-ending scope-creep.&lt;/p&gt;

&lt;p&gt;Just in time development is vital when trying to bring your bootstrapped business to life as a solo coding founder.&lt;/p&gt;

&lt;p&gt;Design your MVP, scope it, and stick to it.&lt;/p&gt;




&lt;p&gt;Read the other key takeaways on &lt;a href="https://jamalmoir.medium.com/takeaways-from-my-failed-bootstrapped-saas-business-9bf390a8aac8"&gt;the original post&lt;/a&gt;&lt;/p&gt;

</description>
      <category>saas</category>
      <category>bootstrapping</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Firestore Rules Examples – Must-Know Patterns To Secure Your Data
</title>
      <dc:creator>Jamal Moir</dc:creator>
      <pubDate>Sat, 12 Oct 2019 14:41:20 +0000</pubDate>
      <link>https://dev.to/jamalmoir/firestore-rules-examples-must-know-patterns-to-secure-your-data-bm1</link>
      <guid>https://dev.to/jamalmoir/firestore-rules-examples-must-know-patterns-to-secure-your-data-bm1</guid>
      <description>&lt;p&gt;This post is &lt;strong&gt;part&lt;/strong&gt; of &lt;a href="https://www.datadependence.com/2019/10/firestore-rules-examples/?utm_source=devto&amp;amp;utm_medium=link&amp;amp;utm_campaign=datadependence"&gt;a post originally posted on my blog&lt;/a&gt; where I write about coding, software development and developer productivity.&lt;/p&gt;




&lt;p&gt;I've been there… You’re staring at a blank firestore.rules page, not knowing where to start. You want to make sure that your website is secure, but you’re not sure what to do and you are worried that you will do it incorrectly. But have no fear! These Firestore rules examples will give you the base that you need to safely secure your website or application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Firestore rules are actually fairly simple and follow a logical structure. The examples below go over common situations that might arise in your app, and how to write rules to make sure that your data is safe! Learn these patterns and you will be able to whip up a secured database in no time at all.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Firestore Rules Examples
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Denying All Reads&lt;/li&gt;
&lt;li&gt;Denying All Writes&lt;/li&gt;
&lt;li&gt;Checking if a User is Authenticated&lt;/li&gt;
&lt;li&gt;Checking if a Document Being Accessed Belongs to the Requesting User&lt;/li&gt;
&lt;li&gt;Checking if a Document Being Created Belongs to the Requesting User&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Using Functions&lt;/em&gt; **&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Verifying a Value’s Type&lt;/em&gt; **&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Verifying That a Value Belongs to a List of Values&lt;/em&gt; **&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Verifying a Values Length&lt;/em&gt; **&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Getting a Document From Another Collection&lt;/em&gt; **&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;**&lt;a href="https://www.datadependence.com/2019/10/firestore-rules-examples/?utm_source=devto&amp;amp;utm_medium=link&amp;amp;utm_campaign=datadependence"&gt;You can see examples 6-10 here&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Denying All Reads
&lt;/h2&gt;

&lt;p&gt;Sometimes you want to store data, but you just don’t want it to be accessed.&lt;/p&gt;

&lt;p&gt;Maybe you have sensitive data that you want to persist, but that you don’t want to be accessible via your API. Maybe you didn’t follow the advice in this article and user data is leaking out into places it shouldn’t be and you need to turn off the tap quickly.&lt;/p&gt;

&lt;p&gt;Either way there are many legitimate reasons for denying all reads to your database, and luckily, with Firestore rules it is very easy to do.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;rules_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firestore&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;databases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;database&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/documents &lt;/span&gt;&lt;span class="err"&gt;{
&lt;/span&gt;    &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="o"&gt;=**&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;if&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Denying All Writes
&lt;/h2&gt;

&lt;p&gt;Denying all writes is another thing that you might find yourself wanting to do. Maybe you have written a bunch of articles and manually added them to your Firestore database. You want to display them on your website, but want to make sure that no one can modify or delete them.&lt;/p&gt;

&lt;p&gt;Similarly to the above denying all writes is trivial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;rules_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firestore&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;databases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;database&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/documents &lt;/span&gt;&lt;span class="err"&gt;{
&lt;/span&gt;    &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="o"&gt;=**&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;if&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you want deny both reading and writing to the database, then the two can be combined like so.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;rules_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firestore&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;databases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;database&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/documents &lt;/span&gt;&lt;span class="err"&gt;{
&lt;/span&gt;    &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="o"&gt;=**&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;if&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Checking if a User is Authenticated
&lt;/h2&gt;

&lt;p&gt;If you don’t want to deny all read and write access to your database, and want users to be able to see, create and change things on your website or app, then you are probably going to want them to be authenticated.&lt;/p&gt;

&lt;p&gt;The following Firestore rule example does this by checking that the request being made to your database contains a uid.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;rules_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firestore&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;databases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;database&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/documents &lt;/span&gt;&lt;span class="err"&gt;{
&lt;/span&gt;    &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="o"&gt;=**&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="nx"&gt;read&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uid&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&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;h2&gt;
  
  
  Checking if a Document Being Accessed Belongs to the Requesting User
&lt;/h2&gt;

&lt;p&gt;Now, using the previous example we made sure that only authenticated users can access our data, but what about if we want to take this one step further?&lt;/p&gt;

&lt;p&gt;Often we don’t want to just let all users access all data, but further separate it out, and only let users see their own documents.&lt;/p&gt;

&lt;p&gt;To do this in Firestore, when creating documents you should create a userID field and store the creating user’s uid in it. Then, when trying to access that document later on, check to see if the uid in the request matches the user ID that is stored in the resource being accessed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;rules_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firestore&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;databases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;database&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/documents &lt;/span&gt;&lt;span class="err"&gt;{
&lt;/span&gt;    &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;petowners&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uid&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&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;h2&gt;
  
  
  Checking if a Document Being Created Belongs to the Requesting User
&lt;/h2&gt;

&lt;p&gt;In addition to only letting users see their own data, we only want to let them write data that belongs to their account. Letting users write to other peoples accounts could get us in all sorts of trouble!&lt;/p&gt;

&lt;p&gt;This is done in a similar fashion to the example above. The only difference is that instead of checking the resource object’s user id, we check the request.resource object’s one.&lt;/p&gt;

&lt;p&gt;The request.resource object is the document that is being sent in the request to your database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;rules_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="nx"&gt;cloud&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;firestore&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;databases&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;database&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="sr"&gt;/documents &lt;/span&gt;&lt;span class="err"&gt;{
&lt;/span&gt;    &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;petowners&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ownerId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uid&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&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;Firestore is a great database to quickly get your apps up and running. Perfect for churning out all the website and app ideas that you have (if you struggle to come up with ideas, check this post out).&lt;/p&gt;

&lt;p&gt;But, even for small side projects, if there is ever the chance that you will get users (yourself included!), then considering security from the outset is a must.&lt;/p&gt;

&lt;p&gt;Hopefully these Firestore rules examples have shed a bit of light on how you can secure your database too.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>firebase</category>
      <category>firestore</category>
      <category>security</category>
    </item>
    <item>
      <title>How to Never Run out of Coding Project Ideas</title>
      <dc:creator>Jamal Moir</dc:creator>
      <pubDate>Sun, 06 Oct 2019 01:49:07 +0000</pubDate>
      <link>https://dev.to/jamalmoir/how-to-never-run-out-of-coding-project-ideas-3p3</link>
      <guid>https://dev.to/jamalmoir/how-to-never-run-out-of-coding-project-ideas-3p3</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"I don't know what to make!" - Every budding developer ever&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'm sure these words have spurted out of your mouth when trying to come up with new coding project ideas at some point. Probably accompanied by "I can't come up with ideas" and "I'm not an idea person".&lt;/p&gt;

&lt;p&gt;But let me tell you this - &lt;strong&gt;You are an idea person&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Everyone is an idea person, and &lt;strong&gt;every developer can come up with a whole boatload of coding project ideas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The problem is, there are two types of idea people; &lt;strong&gt;conscious idea people&lt;/strong&gt; and &lt;strong&gt;unconscious idea people&lt;/strong&gt;, and the majority of developers, especially budding and junior developers, fall under the latter.&lt;/p&gt;

&lt;p&gt;But it's OK! Becoming a conscious idea person - a conscious thinker &lt;strong&gt;is something that anyone can do&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to come up with coding project ideas
&lt;/h2&gt;




&lt;h4&gt;
  
  
  1. Decide that you are going to be a conscious idea person
&lt;/h4&gt;

&lt;p&gt;This is the most important step. Start every new endeavour with a positive affirmation - "I will become a conscious idea person".&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Train yourself to think consciously
&lt;/h4&gt;

&lt;p&gt;Train to catch yourself mid-thought and realise that the noise going on in your head, isn't actually noise, but a goldmine of budding ideas. &lt;/p&gt;

&lt;p&gt;This is the hardest step and will probably take a bit of practice, but is well worth the effort.&lt;/p&gt;

&lt;p&gt;While you are walking around, on the train or sitting on a park bench consciously take note of, and observe what you are thinking.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Notice your budding ideas
&lt;/h4&gt;

&lt;p&gt;Note how I say "notice budding ideas" and not "come up with ideas". You are already coming up with them, you just aren't noticing them.&lt;/p&gt;

&lt;p&gt;They usually come in the form of "it would be nice if...", "I wish...", "if I had ... then I could ...".&lt;/p&gt;

&lt;p&gt;When phrases like these pop into your head, notice them! These are your possible billion dollar ideas.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Notice dissatisfaction
&lt;/h4&gt;

&lt;p&gt;Whenever you are dissatisfied, displeased, discontent - something can be improved. And that something, could be an idea.&lt;/p&gt;

&lt;p&gt;Consciously take note of these times and you will have more seedlings to play with.&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Write it down!
&lt;/h4&gt;

&lt;p&gt;Once you have a seedling in your grasp, a budding idea or a dissatisfaction, write it down.&lt;/p&gt;

&lt;p&gt;I use a page in Notion to dump all of my ideas into. Even the bad ones, the boring ones, the silly ones.&lt;/p&gt;

&lt;p&gt;The more you write down, the more potential coding project ideas you have. Even the ones that you think are no-so-great might combine or morph into something amazing.&lt;/p&gt;

&lt;p&gt;If you forget your ideas, they are of no use to you, so write them down!&lt;/p&gt;




&lt;p&gt;Follow these five steps and I promise that you won't struggle to come up with ideas. You might however have the opposite problem - So many ideas, that you just don't have the time to pursue them all.&lt;/p&gt;

&lt;p&gt;Can't win them all - Sorry!&lt;/p&gt;




&lt;p&gt;This post was originally published at &lt;a href="https://www.datadependence.com/2019/10/get-coding-project-ideas-in-5-steps/"&gt;my personal blog&lt;/a&gt;&lt;/p&gt;

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