1import{S as Bs,i as Ls,s as xs,l as s,r as a,a as p,m as n,n as u,u as l,h as t,c as h,p as f,Z as Rt,b as r,F as o,B as rr}from"./index-7fbbe144.js";function Fs(Ws){let g,ma,Gt,ue,ca,Mt,v,wa,lt,va,ba,it,_a,ga,Ht,d,Ea,rt,ka,Ia,q,Sa,Pa,st,Ta,Aa,Wt,pe,ja,Bt,E,z,Na,nt,Oa,Ra,Ga,C,Ma,ut,Ha,Wa,Lt,he,Ba,xt,fe,La,Ft,ye,xa,Jt,de,Fa,Ut,b,me,Z,Ja,Ua,Ya,ce,V,Da,qa,za,we,K,Ca,Za,Yt,ve,Va,Dt,be,_e,sr,qt,k,Ka,pt,Qa,Xa,zt,I,$a,ht,el,tl,Ct,ge,ol,Zt,S,al,Q,ll,il,Vt,Ee,rl,Kt,P,sl,ft,nl,ul,Qt,ke,Ie,nr,Xt,Se,pl,$t,Pe,hl,eo,m,X,fl,$,yl,dl,ml,ee,cl,te,wl,vl,bl,oe,_l,ae,gl,El,kl,to,oo,Te,Il,ao,T,Sl,yt,Pl,Tl,lo,A,Al,dt,jl,Nl,io,Ae,Ol,ro,je,Rl,so,Ne,Gl,no,Oe,Ml,uo,Re,Hl,po,Ge,mt,Wl,ho,j,Bl,ct,Ll,xl,fo,c,Fl,wt,Jl,Ul,vt,Yl,Dl,bt,ql,zl,yo,N,Cl,le,Zl,Vl,mo,O,Kl,ie,Ql,Xl,co,Me,$l,wo,R,ei,_t,ti,oi,vo,G,ai,gt,li,ii,bo,He,We,ur,_o,_,ri,Et,si,ni,kt,ui,pi,go,Be,hi,Eo,M,fi,It,yi,di,ko,Le,mi,Io,xe,ci,So,w,Fe,wi,re,vi,bi,St,_i,gi,Je,Ei,se,ki,Ii,Pt,Si,Po,Ue,Pi,To,Ye,De,pr,Ao,qe,Ti,jo,H,Ai,Tt,ji,Ni,No,ze,Oi,Oo,Ce,Ri,Ro,W,Gi,At,Mi,Hi,Go,B,Wi,jt,Bi,Li,Mo,Ze,xi,Ho,Ve,Fi,Wo,Ke,Ji,Bo,Qe,Ui,Lo,L,Yi,Nt,Di,qi,xo,x,zi,ne,Ci,Zi,Fo,Xe,Vi,Jo,$e,Ki,Uo,F,Qi,Ot,Xi,$i,Yo,et,er,Do,y,hr;return{c(){g=s("p"),ma=a("Last year I started a cool idea with a friend together and although the idea was pretty basic, it took me months to implement the first version."),Gt=p(),ue=s("p"),ca=a("Why?"),Mt=p(),v=s("p"),wa=a("Because although we live in great times where we can include epic services - "),lt=s("em"),va=a("sometimes even for free"),ba=a(" - using all of them in your code and combining each of them to form a startup app is "),it=s("strong"),_a=a("a process of trial & error"),ga=a(" if you don\u2019t really know what you need or want, or if you just never worked with all of these services."),Ht=p(),d=s("p"),Ea=a("I\u2019ve been there, and I have made the research for you. Now in order to help other developers "),rt=s("strong"),ka=a("save those countless hours I spent"),Ia=a(", I created "),q=s("a"),Sa=a("The Software Startup Manual"),Pa=a(" - my first "),st=s("strong"),Ta=a("Full Stack course"),Aa=a(" on building a complete front & backend using Javascript."),Wt=p(),pe=s("p"),ja=a("This course will teach you two things:"),Bt=p(),E=s("ul"),z=s("li"),Na=a("How to build a server with Node.js and MongoDB to create a "),nt=s("strong"),Oa=a("REST API"),Ra=a(" that you can use with any frontend"),Ga=p(),C=s("li"),Ma=a("How to build an Ionic 4 app that consumes your API - deployed as "),ut=s("strong"),Ha=a("both a website and native app"),Wa=a("!"),Lt=p(),he=s("p"),Ba=a("But right now let\u2019s take a step back and look what you got to setup to make your idea shine."),xt=p(),fe=s("h2"),La=a("\u201CJust some Boilerplate\u201D, right?"),Ft=p(),ye=s("p"),xa=a("In the beginning there is the great idea - and be it just a better version of Todoist or your favorite notes application. You can feel the fire burning and are powered up for all the cool things you will implement. Until\u2026"),Jt=p(),de=s("p"),Fa=a("Until you realise that there are a few things you definitely need for your first version:"),Ut=p(),b=s("ul"),me=s("li"),Z=s("a"),Ja=a("Database"),Ua=a(" - you need a place to keep your data right?"),Ya=p(),ce=s("li"),V=s("a"),Da=a("User authentication system"),qa=a(", so everything from signup to login and if possible forgot password"),za=p(),we=s("li"),K=s("a"),Ca=a("Handling Payments"),Za=a(" - which provider do I choose and how tf do they actually work?"),Yt=p(),ve=s("p"),Va=a("I don\u2019t want to shatter your dreams and aspirations, and there might be special cases where you need different things in the beginning and do other things simply by hand. But this rather short list is a good starting point in general."),Dt=p(),be=s("p"),_e=s("img"),qt=p(),k=s("p"),Ka=a("The good thing is that each of them isn\u2019t hard to integrate in general, but they all take time. Time you could spent on the important aspects of your MVP. And if you do it the first time,"),pt=s("strong"),Qa=a("you can multiply the time you need with 2"),Xa=a(" because you have to lookup everything at least once."),zt=p(),I=s("p"),$a=a("Up until this point you haven\u2019t even added any real functionality - all the business logic that your app needs comes once you are done with the mandatory basics or the "),ht=s("strong"),el=a("boilerplate code"),tl=a("."),Ct=p(),ge=s("p"),ol=a("So to get your app to the point where you are fine with it (_which depen
1ds from developer to develope_r), it already takes you a lot of time."),Zt=p(),S=s("p"),al=a("At least thats what happened to me back then, which was the reason that I based "),Q=s("a"),ll=a("the Software Startup Manual"),il=a(" on these issues."),Vt=p(),Ee=s("h2"),rl=a("Not-mandatory-but-should-exist Features"),Kt=p(),P=s("p"),sl=a("After you got the basics right you work on some core functionality and feel pretty good about your progress - until you read a post about automatic email sending. Or Push Notifications. Or *"),ft=s("strong"),nl=a("insert cool tech"),ul=a("*."),Qt=p(),ke=s("p"),Ie=s("img"),Xt=p(),Se=s("p"),pl=a("Then, one by one, you start digging into these non-essential things that can rise the quality of your application a lot."),$t=p(),Pe=s("p"),hl=a("So wouldn\u2019t it be great to:"),eo=p(),m=s("ul"),X=s("li"),fl=a("Send welcome Emails using "),$=s("a"),yl=a("Mailgun"),dl=a("?"),ml=p(),ee=s("li"),cl=a("Show Push Notifications with "),te=s("a"),wl=a("OneSignal"),vl=a(" if relevant things to the user happens?"),bl=p(),oe=s("li"),_l=a("Upload user generated content to some storage - maybe "),ae=s("a"),gl=a("AWS S3"),El=a("?"),kl=p(),to=s("li"),oo=p(),Te=s("p"),Il=a("And one by one technology you improve the quality of your app - and got to dig more into each of these services to somehow integrate them into your backend."),ao=p(),T=s("p"),Sl=a("Just like before - none of these things is rocket science and with enough time you might figure things out. But trust me, getting a guide on just using them correctly would "),yt=s("strong"),Pl=a("save you many days of work"),Tl=a("."),lo=p(),A=s("p"),Al=a("The amazing thing throughout all of these core and nice to have features is that "),dt=s("strong"),jl=a("we can use every service with Javascript"),Nl=a(" these days - most of the time completely for free!"),io=p(),Ae=s("p"),Ol=a("With just one language you are able to build an amazing backend with a lot of fancy technology under the hood - and if you already come from Angular or any other popular framework you\u2019ll feel right at home."),ro=p(),je=s("p"),Rl=a("And if you have used another language before I\u2019m sure you will catch up on Javascript rapidly!"),so=p(),Ne=s("h2"),Gl=a("Where is the Frontend?"),no=p(),Oe=s("p"),Ml=a("If you happen to be a real startup with a dev team, chances are good you have a dedicated backend and frontend team."),uo=p(),Re=s("p"),Hl=a("That\u2019s not always the case when you got a cool idea with your best friend - especially if the friend is not a developer."),po=p(),Ge=s("p"),mt=s("strong"),Wl=a("Spotlight on you!"),ho=p(),j=s("p"),Bl=a("The good news is that when you "),ct=s("strong"),Ll=a("know Javascript"),xl=a(" you got many choices to build your frontend. It\u2019s still work, but you got choices because you can use your previously created REST API from basically everything you build now."),fo=p(),c=s("p"),Fl=a("But if you want to get your startup out, most likely you ("),wt=s("em"),Jl=a("still"),Ul=a(") need a "),vt=s("strong"),Yl=a("website"),Dl=a(" today. And if you have some cool functionality, chances are high you also want a "),bt=s("strong"),ql=a("mobile app"),zl=a(" at the same time!"),yo=p(),N=s("p"),Cl=a("My recommended framework of choice for this is 100% "),le=s("a"),Zl=a("the Ionic Framework"),Vl=a("."),mo=p(),O=s("p"),Kl=a("Yes I might be biased given I also run "),ie=s("a"),Ql=a("the Ionic Academy"),Xl=a(", but here\u2019s why I would recommend it anyway and use it again as well:"),co=p(),Me=s("p"),$l=a("With Ionic, you will have everything you need in one codebase. You can go mobile for iOS and Android App stores, you can deploy it as a website and if you might need it you could even convert it to a desktop application."),wo=p(),R=s("p"),ei=a("Oh and of course you get first class "),_t=s("strong"),ti=a("PWA support"),oi=a("."),vo=p(),G=s("p"),ai=a("I don\u2019t know about you but I appreciate to "),gt=s("strong"),li=a("write the code only once"),ii=a(" and enjoy how it works on multiple platform and screen sizes!"),bo=p(),He=s("p"),We=s("img"),_o=p(),_=s("p"),ri=a("But we don\u2019t want to blow the trumpet for Ionic too hard ("),Et=s("em"),si=a("didn\u2019t we already?"),ni=a(") and just concede it\u2019s one of the best ways to "),kt=s("strong"),ui=a("build fast for multiple platforms"),pi=a(". There are other players like React, Flutter and smaller options but they don\u2019t bet on the web as hard as Ionic does which gives you the chance to basically run your app everywhere with the same code."),go=p(),Be=s("h2"),hi=a("How to get everything Deployed & Live?"),Eo=p(),M=s("p"),fi=a("Now once you reach a point where you got a solid backend and a functional frontend that works for the majority of platforms that you want to cover, it\u2019s time to release everything ("),It=s("em"),yi=a("who needs testing anyway?"),di=a(")."),ko=p(),Le=s("p"),mi=a("Hopefully you know a thing or 2 about how to host and connect everything, otherwise you face the next challenge at this point."),Io=p(),xe=s("p"),ci=a("So here\u2019s what you can/should do:"),So=p(),w=s("ul"),Fe=s("li"),wi=a("Deploy your Node.js Server to "),re=s("a"),vi=a("Heroku"),bi=p(),St=s("li"),_i=a("Connect the MongoDB and all other needed live instances to your Server"),gi=p(),Je=s("li"),Ei=a("Upload your Ionic app as a website to some hosting like "),se=s("a"),ki=a("Firebase"),Ii=p(),Pt=s("li"),Si=a("Submit your native app builds for iOS and Android to their according stores"),Po=p(),Ue=s("p"),Pi=a("The backend part is actually the easier one at this point as most services (not just Heroku) make it super simple to upload and build your app in basically one command."),To=p(),Ye=s("p"),De=s("img"),Ao=p(),qe=s("p"),Ti=a("To release your app in the app stores, you have to pay a fee for both the iOS and also Android membership (while the second is a lot cheaper and only one time). The process of creating the app store entries is also pretty boring but time consuming."),jo=p(),H=s("p"),Ai=a("At some point you got all the texts, assets and information filled out so the "),Tt=s("strong"),ji=a("classic waiting game begins"),Ni=a("!"),No=p(),ze=s("p"),Oi=a("The teams will review your app and hopefully accept the submission. Then your app is finally live after everything you\u2019ve gone through!"),Oo=p(),Ce=s("h2"),Ri=a("The Alternatives"),Ro=p(),W=s("p"),Gi=a("With all that being said, of course there are many crossroads where you could have picked a different route. It starts with the backend, where some of you might immediately scream \u201D"),At=s("strong"),Mi=a("Why not Firebase?"),Hi=a("\u201D and yes, that would be a very legit and to some degree easier solution (and would also hone your Javascript skills!)."),Go=p(),B=s("p"),Wi=a("While Firebase is a great choice in many projects, sometimes "),jt=s("strong"),Bi=a("you just want to have full control"),Li=a(". You don\u2019t need to rely on cloud functions to write custom code, you won\u2019t hit any walls that prevent changing some texts or elements and you are simply more free to do whatever you want to do."),Mo=p(),Ze=s("p"),xi=a("Additionally, there\u2019s basically an alternative to every tool, service and framework I presented before that you could have picked if you enjoy it more or if you happen to have more money (everything shown here was free besides app store membership)."),Ho=p(),Ve=s("p"),Fi=a("There are many ways to build your next startup app - this is one relying on Javascript and reusing your skills & code as best as possible to save you time."),Wo=p(),Ke=s("h2"),Ji=a("Don\u2019t be scared!"),Bo=p(),Qe=s("p"),Ui=a("If you started this post all fired up and now feel confused and scared by all the choices you have to make trust me: You don\u2019t have to!"),Lo=p(),L=s("p"),Yi=a("All of this is a process, and when you go through all of this the first time "),Nt=s("strong"),Di=a("it\u2019s an exploration and learning journey"),qi=a("."),xo=p(),x=s("p"),zi=a("My offer is to make your learning journey a bit more guided by showing you how to use everything we talked about "),ne=s("a"),Ci=a("inside my Software Startup Manual course"),Zi=a(". We\u2019ve got more than 8 hours of video material to get you some nice basic SaaS app with all the cool technologies you need."),Fo=p(),Xe=s("p"),Vi=a("Even if you are a beginner you can manage your way through all of this - remember that every developer started with 0 knowledge at some point!"),Jo=p(),$e=s("p"),Ki=a("Hopefully the overview of tools and services I used inspires others to start and make their own projects as well."),Uo=p(),F=s("p"),Qi=a("If you did or do, "),Ot=s("strong"),Xi=a("leave a comment below and let me know what you are working on"),$i=a("!"),Yo=p(),et=s("p"),er=a("You can also watch a video version with some notes on this below."),Do=p(),y=s("iframe"),this.h()},l(e){g=n(e,"P",{});var i=u(g);ma=l(i,"Last year I started a cool idea with a friend together and although the idea was pretty basic, it took me months to implement the first version."),i.forEac
1h(t),Gt=h(e),ue=n(e,"P",{});var fr=u(ue);ca=l(fr,"Why?"),fr.forEach(t),Mt=h(e),v=n(e,"P",{});var tt=u(v);wa=l(tt,"Because although we live in great times where we can include epic services - "),lt=n(tt,"EM",{});var yr=u(lt);va=l(yr,"sometimes even for free"),yr.forEach(t),ba=l(tt," - using all of them in your code and combining each of them to form a startup app is "),it=n(tt,"STRONG",{});var dr=u(it);_a=l(dr,"a process of trial & error"),dr.forEach(t),ga=l(tt," if you don\u2019t really know what you need or want, or if you just never worked with all of these services."),tt.forEach(t),Ht=h(e),d=n(e,"P",{});var J=u(d);Ea=l(J,"I\u2019ve been there, and I have made the research for you. Now in order to help other developers "),rt=n(J,"STRONG",{});var mr=u(rt);ka=l(mr,"save those countless hours I spent"),mr.forEach(t),Ia=l(J,", I created "),q=n(J,"A",{href:!0,rel:!0});var cr=u(q);Sa=l(cr,"The Software Startup Manual"),cr.forEach(t),Pa=l(J," - my first "),st=n(J,"STRONG",{});var wr=u(st);Ta=l(wr,"Full Stack course"),wr.forEach(t),Aa=l(J," on building a complete front & backend using Javascript."),J.forEach(t),Wt=h(e),pe=n(e,"P",{});var vr=u(pe);ja=l(vr,"This course will teach you two things:"),vr.forEach(t),Bt=h(e),E=n(e,"UL",{});var qo=u(E);z=n(qo,"LI",{});var zo=u(z);Na=l(zo,"How to build a server with Node.js and MongoDB to create a "),nt=n(zo,"STRONG",{});var br=u(nt);Oa=l(br,"REST API"),br.forEach(t),Ra=l(zo," that you can use with any frontend"),zo.forEach(t),Ga=h(qo),C=n(qo,"LI",{});var Co=u(C);Ma=l(Co,"How to build an Ionic 4 app that consumes your API - deployed as "),ut=n(Co,"STRONG",{});var _r=u(ut);Ha=l(_r,"both a website and native app"),_r.forEach(t),Wa=l(Co,"!"),Co.forEach(t),qo.forEach(t),Lt=h(e),he=n(e,"P",{});var gr=u(he);Ba=l(gr,"But right now let\u2019s take a step back and look what you got to setup to make your idea shine."),gr.forEach(t),xt=h(e),fe=n(e,"H2",{});var Er=u(fe);La=l(Er,"\u201CJust some Boilerplate\u201D, right?"),Er.forEach(t),Ft=h(e),ye=n(e,"P",{});var kr=u(ye);xa=l(kr,"In the beginning there is the great idea - and be it just a better version of Todoist or your favorite notes application. You can feel the fire burning and are powered up for all the cool things you will implement. Until\u2026"),kr.forEach(t),Jt=h(e),de=n(e,"P",{});var Ir=u(de);Fa=l(Ir,"Until you realise that there are a few things you definitely need for your first version:"),Ir.forEach(t),Ut=h(e),b=n(e,"UL",{});var ot=u(b);me=n(ot,"LI",{});var tr=u(me);Z=n(tr,"A",{href:!0,rel:!0});var Sr=u(Z);Ja=l(Sr,"Database"),Sr.forEach(t),Ua=l(tr," - you need a place to keep your data right?"),tr.forEach(t),Ya=h(ot),ce=n(ot,"LI",{});var or=u(ce);V=n(or,"A",{href:!0,rel:!0});var Pr=u(V);Da=l(Pr,"User authentication system"),Pr.forEach(t),qa=l(or,", so everything from signup to login and if possible forgot password"),or.forEach(t),za=h(ot),we=n(ot,"LI",{});var ar=u(we);K=n(ar,"A",{href:!0,rel:!0});var Tr=u(K);Ca=l(Tr,"Handling Payments"),Tr.forEach(t),Za=l(ar," - which provider do I choose and how tf do they actually work?"),ar.forEach(t),ot.forEach(t),Yt=h(e),ve=n(e,"P",{});var Ar=u(ve);Va=l(Ar,"I don\u2019t want to shatter your dreams and aspirations, and there might be special cases where you need different things in the beginning and do other things simply by hand. But this rather short list is a good starting point in general."),Ar.forEach(t),Dt=h(e),be=n(e,"P",{});var jr=u(be);_e=n(jr,"IMG",{src:!0,alt:!0}),jr.forEach(t),qt=h(e),k=n(e,"P",{});var Zo=u(k);Ka=l(Zo,"The good thing is that each of them isn\u2019t hard to integrate in general, but they all take time. Time you could spent on the important aspects of your MVP. And if you do it the first time,"),pt=n(Zo,"STRONG",{});var Nr=u(pt);Qa=l(Nr,"you can multiply the time you need with 2"),Nr.forEach(t),Xa=l(Zo," because you have to lookup everything at least once."),Zo.forEac
1h(t),zt=h(e),I=n(e,"P",{});var Vo=u(I);$a=l(Vo,"Up until this point you haven\u2019t even added any real functionality - all the business logic that your app needs comes once you are done with the mandatory basics or the "),ht=n(Vo,"STRONG",{});var Or=u(ht);el=l(Or,"boilerplate code"),Or.forEach(t),tl=l(Vo,"."),Vo.forEach(t),Ct=h(e),ge=n(e,"P",{});var Rr=u(ge);ol=l(Rr,"So to get your app to the point where you are fine with it (_which depends from developer to develope_r), it already takes you a lot of time."),Rr.forEach(t),Zt=h(e),S=n(e,"P",{});var Ko=u(S);al=l(Ko,"At least thats what happened to me back then, which was the reason that I based "),Q=n(Ko,"A",{href:!0,rel:!0});var Gr=u(Q);ll=l(Gr,"the Software Startup Manual"),Gr.forEach(t),il=l(Ko," on these issues."),Ko.forEach(t),Vt=h(e),Ee=n(e,"H2",{});var Mr=u(Ee);rl=l(Mr,"Not-mandatory-but-should-exist Features"),Mr.forEach(t),Kt=h(e),P=n(e,"P",{});var Qo=u(P);sl=l(Qo,"After you got the basics right you work on some core functionality and feel pretty good about your progress - until you read a post about automatic email sending. Or Push Notifications. Or *"),ft=n(Qo,"STRONG",{});var Hr=u(ft);nl=l(Hr,"insert cool tech"),Hr.forEach(t),ul=l(Qo,"*."),Qo.forEach(t),Qt=h(e),ke=n(e,"P",{});var Wr=u(ke);Ie=n(Wr,"IMG",{src:!0,alt:!0}),Wr.forEach(t),Xt=h(e),Se=n(e,"P",{});var Br=u(Se);pl=l(Br,"Then, one by one, you start digging into these non-essential things that can rise the quality of your application a lot."),Br.forEach(t),$t=h(e),Pe=n(e,"P",{});var Lr=u(Pe);hl=l(Lr,"So wouldn\u2019t it be great to:"),Lr.forEach(t),eo=h(e),m=n(e,"UL",{});var U=u(m);X=n(U,"LI",{});var Xo=u(X);
1fl=l(Xo,"Send welcome Emails using "),$=n(Xo,"A",{href:!0,rel:!0});var xr=u($);yl=l(xr,"Mailgun"),xr.forEach(t),dl=l(Xo,"?"),Xo.forEach(t),ml=h(U),ee=n(U,"LI",{});var $o=u(ee);cl=l($o,"Show Push Notifications with "),te=n($o,"A",{href:!0,rel:!0});var Fr=u(te);wl=l(Fr,"OneSignal"),Fr.forEach(t),vl=l($o," if relevant things to the user happens?"),$o.forEach(t),bl=h(U),oe=n(U,"LI",{});var ea=u(oe);_l=l(ea,"Upload user generated content to some storage - maybe "),ae=n(ea,"A",{href:!0,rel:!0});var Jr=u(ae);gl=l(Jr,"AWS S3"),Jr.forEach(t),El=l(ea,"?"),ea.forEach(t),kl=h(U),to=n(U,"LI",{}),u(to).forEach(t),U.forEach(t),oo=h(e),Te=n(e,"P",{});var Ur=u(Te);Il=l(Ur,"And one by one technology you improve the quality of your app - and got to dig more into each of these services to somehow integrate them into your backend."),Ur.forEach(t),ao=h(e),T=n(e,"P",{});var ta=u(T);Sl=l(ta,"Just like before - none of these things is rocket science and with enough time you might figure things out. But trust me, getting a guide on just using them correctly would "),yt=n(ta,"STRONG",{});var Yr=u(yt);Pl=l(Yr,"save you many days of work"),Yr.forEach(t),Tl=l(ta,"."),ta.forEach(t),lo=h(e),A=n(e,"P",{});var oa=u(A);Al=l(oa,"The amazing thing throughout all of these core and nice to have features is that "),dt=n(oa,"STRONG",{});var Dr=u(dt);jl=l(Dr,"we can use every service with Javascript"),Dr.forEach(t),Nl=l(oa," these days - most of the time completely for free!"),oa.forEach(t),io=h(e),Ae=n(e,"P",{});var qr=u(Ae);Ol=l(qr,"With just one language you are able to build an amazing backend with a lot of fancy technology under the hood - and if you already come from Angular or any other popular framework you\u2019ll feel right at home."),qr.forEach(t),ro=h(e),je=n(e,"P",{});var zr=u(je);Rl=l(zr,"And if you have used another language before I\u2019m sure you will catch up on Javascript rapidly!"),zr.forEach(t),so=h(e),Ne=n(e,"H2",{});var Cr=u(Ne);Gl=l(Cr,"Where is the Frontend?"),Cr.forEach(t),no=h(e),Oe=n(e,"P",{});var Zr=u(Oe);Ml=l(Zr,"If you happen to be a real startup with a dev team, chances are good you have a dedicated backend and frontend team."),Zr.forEach(t),uo=h(e),Re=n(e,"P",{});var Vr=u(Re);Hl=l(Vr,"That\u2019s not always the case when you got a cool idea with your best friend - especially if the friend is not a developer."),Vr.forEach(t),po=h(e),Ge=n(e,"P",{});var Kr=u(Ge);mt=n(Kr,"STRONG",{});var Qr=u(mt);Wl=l(Qr,"Spotlight on you!"),Qr.forEach(t),Kr.forEach(t),ho=h(e),j=n(e,"P",{});var aa=u(j);Bl=l(aa,"The good news is that when you "),ct=n(aa,"STRONG",{});var Xr=u(ct);Ll=l(Xr,"know Javascript"),Xr.forEach(t),xl=l(aa," you got many choices to build your frontend. It\u2019s still work, but you got choices because you can use your previously created REST API from basically everything you build now."),aa.forEach(t),fo=h(e),c=n(e,"P",{});var Y=u(c);Fl=l(Y,"But if you want to get your startup out, most likely you ("),wt=n(Y,"EM",{});var $r=u(wt);Jl=l($r,"still"),$r.forEach(t),Ul=l(Y,") need a "),vt=n(Y,"STRONG",{});var es=u(vt);Yl=l(es,"website"),es.forEach(t),Dl=l(Y," today. And if you have some cool functionality, chances are high you also want a "),bt=n(Y,"STRONG",{});var ts=u(bt);ql=l(ts,"mobile app"),ts.forEach(t),zl=l(Y," at the same time!"),Y.forEach(t),yo=h(e),N=n(e,"P",{});var la=u(N);Cl=l(la,"My recommended framework of choice for this is 100% "),le=n(la,"A",{href:!0,rel:!0});var os=u(le);Zl=l(os,"the Ionic Framework"),os.forEach(t),Vl=l(la,"."),la.forEach(t),mo=h(e),O=n(e,"P",{});var ia=u(O);Kl=l(ia,"Yes I might be biased given I also run "),ie=n(ia,"A",{href:!0,rel:!0});var as=u(ie);Ql=l(as,"the Ionic Academy"),as.forEach(t),Xl=l(ia,", but here\u2019s why I would recommend it anyway and use it again as well:"),ia.forEach(t),co=h(e),Me=n(e,"P",{});var ls=u(Me);$l=l(ls,"With Ionic, you will have everything you need in one codebase. You can go mobile for iOS and Android App stores, you can deploy it as a website and if you might need it you could even convert it to a desktop application."),ls.forEach(t),wo=h(e),R=n(e,"P",{});var ra=u(R);ei=l(ra,"Oh and of course you get first class "),_t=n(ra,"STRONG",{});var is=u(_t);ti=l(is,"PWA support"),is.forEach(t),oi=l(ra,"."),ra.forEach(t),vo=h(e),G=n(e,"P",{});var sa=u(G);ai=l(sa,"I don\u2019t know about you but I appreciate to "),gt=n(sa,"STRONG",{});var rs=u(gt);
1li=l(rs,"write the code only once"),rs.forEach(t),ii=l(sa," and enjoy how it works on multiple platform and screen sizes!"),sa.forEach(t),bo=h(e),He=n(e,"P",{});var ss=u(He);We=n(ss,"IMG",{src:!0,alt:!0}),ss.forEach(t),_o=h(e),_=n(e,"P",{});var at=u(_);ri=l(at,"But we don\u2019t want to blow the trumpet for Ionic too hard ("),Et=n(at,"EM",{});var ns=u(Et);si=l(ns,"didn\u2019t we already?"),ns.forEach(t),ni=l(at,") and just concede it\u2019s one of the best ways to "),kt=n(at,"STRONG",{});var us=u(kt);ui=l(us,"build fast for multiple platforms"),us.forEach(t),pi=l(at,". There are other players like React, Flutter and smaller options but they don\u2019t bet on the web as hard as Ionic does which gives you the chance to basically run your app everywhere with the same code."),at.forEach(t),go=h(e),Be=n(e,"H2",{});var ps=u(Be);hi=l(ps,"How to get everything Deployed & Live?"),ps.forEach(t),Eo=h(e),M=n(e,"P",{});var na=u(M);fi=l(na,"Now once you reach a point where you got a solid backend and a functional frontend that works for the majority of platforms that you want to cover, it\u2019s time to release everything ("),It=n(na,"EM",{});var hs=u(It);yi=l(hs,"who needs testing anyway?"),hs.forEach(t),di=l(na,")."),na.forEach(t),ko=h(e),Le=n(e,"P",{});var fs=u(Le);mi=l(fs,"Hopefully you know a thing or 2 about how to host and connect everything, otherwise you face the next challenge at this point."),fs.forEach(t),Io=h(e),xe=n(e,"P",{});var ys=u(xe);ci=l(ys,"So here\u2019s what you can/should do:"),ys.forEach(t),So=h(e),w=n(e,"UL",{});var D=u(w);Fe=n(D,"LI",{});var lr=u(Fe);wi=l(lr,"Deploy your Node.js Server to "),re=n(lr,"A",{href:!0,rel:!0});var ds=u(re);vi=l(ds,"Heroku"),ds.forEach(t),lr.forEach(t),bi=h(D),St=n(D,"LI",{});var ms=u(St);_i=l(ms,"Connect the MongoDB and all other needed live instances to your Server"),ms.forEach(t),gi=h(D),Je=n(D,"LI",{});var ir=u(Je);Ei=l(ir,"Upload your Ionic app as a website to some hosting like "),se=n(ir,"A",{href:!0,rel:!0});var cs=u(se);ki=l(cs,"Firebase"),cs.forEach(t),ir.forEach(t),Ii=h(D),Pt=n(D,"LI",{});var ws=u(Pt);Si=l(ws,"Submit your native app builds for iOS and Android to their according stores"),ws.forEach(t),D.forEach(t),Po=h(e),Ue=n(e,"P",{});var vs=u(Ue);Pi=l(vs,"The backend part is actually the easier one at this point as most services (not just Heroku) make it super simple to upload and build your app in basically one command."),vs.forEach(t),To=h(e),Ye=n(e,"P",{});var bs=u(Ye);De=n(bs,"IMG",{src:!0,alt:!0}),bs.forEach(t),Ao=h(e),qe=n(e,"P",{});var _s=u(qe);Ti=l(_s,"To release your app in the app stores, you have to pay a fee for both the iOS and also Android membership (while the second is a lot cheaper and only one time). The process of creating the app store entries is also pretty boring but time consuming."),_s.forEach(t),jo=h(e),H=n(e,"P",{});var ua=u(H);Ai=l(ua,"At some point you got all the texts, assets and information filled out so the "),Tt=n(ua,"STRONG",{});var gs=u(Tt);ji=l(gs,"classic waiting game begins"),gs.forEach(t),Ni=l(ua,"!"),ua.forEach(t),No=h(e),ze=n(e,"P",{});var Es=u(ze);Oi=l(Es,"The teams will review your app and hopefully accept the submission. Then your app is finally live after everything you\u2019ve gone through!"),Es.forEach(t),Oo=h(e),Ce=n(e,"H2",{});var ks=u(Ce);Ri=l(ks,"The Alternatives"),ks.forEach(t),Ro=h(e),W=n(e,"P",{});var pa=u(W);Gi=l(pa,"With all that being said, of course there are many crossroads where you could have picked a different route. It starts with the backend, where some of you might immediately scream \u201D"),At=n(pa,"STRONG",{});var Is=u(At);Mi=l(Is,"Why not Firebase?"),Is.forEach(t),Hi=l(pa,"\u201D and yes, that would be a very legit and to some degree easier solution (and would also hone your Javascript skills!)."),pa.forEach(t),Go=h(e),B=n(e,"P",{});var ha=u(B);Wi=l(ha,"While Firebase is a great choice in many projects, sometimes "),jt=n(ha,"STRONG",{});var Ss=u(jt);Bi=l(Ss,"you just want to have full control"),Ss.forEach(t),Li=l(ha,". You don\u2019t need to rely on cloud functions to write custom code, you won\u2019t hit any walls that prevent changing some texts or elements and you are simply more free to do whatever you want to do."),ha.forEac
1h(t),Mo=h(e),Ze=n(e,"P",{});var Ps=u(Ze);xi=l(Ps,"Additionally, there\u2019s basically an alternative to every tool, service and framework I presented before that you could have picked if you enjoy it more or if you happen to have more money (everything shown here was free besides app store membership)."),Ps.forEach(t),Ho=h(e),Ve=n(e,"P",{});var Ts=u(Ve);Fi=l(Ts,"There are many ways to build your next startup app - this is one relying on Javascript and reusing your skills & code as best as possible to save you time."),Ts.forEach(t),Wo=h(e),Ke=n(e,"H2",{});var As=u(Ke);Ji=l(As,"Don\u2019t be scared!"),As.forEach(t),Bo=h(e),Qe=n(e,"P",{});var js=u(Qe);Ui=l(js,"If you started this post all fired up and now feel confused and scared by all the choices you have to make trust me: You don\u2019t have to!"),js.forEach(t),Lo=h(e),L=n(e,"P",{});var fa=u(L);Yi=l(fa,"All of this is a process, and when you go through all of this the first time "),Nt=n(fa,"STRONG",{});var Ns=u(Nt);Di=l(Ns,"it\u2019s an exploration and learning journey"),Ns.forEach(t),qi=l(fa,"."),fa.forEach(t),xo=h(e),x=n(e,"P",{});var ya=u(x);zi=l(ya,"My offer is to make your learning journey a bit more guided by showing you how to use everything we talked about "),ne=n(ya,"A",{href:!0,rel:!0});var Os=u(ne);Ci=l(Os,"inside my Software Startup Manual course"),Os.forEach(t),Zi=l(ya,". We\u2019ve got more than 8 hours of video material to get you some nice basic SaaS app with all the cool technologies you need."),ya.forEach(t),Fo=h(e),Xe=n(e,"P",{});var Rs=u(Xe);Vi=l(Rs,"Even if you are a beginner you can manage your way through all of this - remember that every developer started with 0 knowledge at some point!"),Rs.forEach(t),Jo=h(e),$e=n(e,"P",{});var Gs=u($e);Ki=l(Gs,"Hopefully the overview of tools and services I used inspires others to start and make their own projects as well."),Gs.forEach(t),Uo=h(e),F=n(e,"P",{});var da=u(F);Qi=l(da,"If you did or do, "),Ot=n(da,"STRONG",{});var Ms=u(Ot);Xi=l(Ms,"leave a comment below and let me know what you are working on"),Ms.forEach(t),$i=l(da,"!"),da.forEach(t),Yo=h(e),et=n(e,"P",{});var Hs=u(et);er=l(Hs,"You can also watch a video version with some notes on this below."),Hs.forEach(t),Do=h(e),y=n(e,"IFRAME",{width:!0,height:!0,src:!0,frameborder:!0,allow:!0,title:!0}),u(y).forEach(t),this.h()},h(){f(q,"href","https://courses.devdactic.com/p/software-startup-manual/"),f(q,"rel","nofollow"),f(Z,"href","https://www.mongodb.com/"),f(Z,"rel","nofollow"),f(V,"href","https://github.com/themikenicholson/passport-jwt"),f(V,"rel","nofollow"),f(K,"href","https://stripe.com/"),f(K,"rel","nofollow"),Rt(_e.src,sr="/img/blog/wp-img/wp-content-uploads-2019-02-startup-app-boilerplate-1024x760.webp")||f(_e,"src",sr),f(_e,"alt","startup-app-boilerplate"),f(Q,"href","https://courses.devdactic.com/p/software-startup-manual"),f(Q,"rel","nofollow"),Rt(Ie.src,nr="/img/blog/wp-img/wp-content-uploads-2019-02-startup-app-mailgun-email-1024x703.webp")||f(Ie,"src",nr),f(Ie,"alt","startup-app-mailgun-email"),f($,"href","https://www.mailgun.com/"),f($,"rel","nofollow"),f(te,"href","https://onesignal.com/"),f(te,"rel","nofollow"),f(ae,"href","https://aws.amazon.com/"),f(ae,"rel","nofollow"),f(le,"href","https://ionicframework.com/"),f(le,"rel","nofollow"),f(ie,"href","https://ionicacademy.com/"),f(ie,"rel","nofollow"),Rt(We.src,ur="/img/blog/wp-img/wp-content-uploads-2019-02-ssm-responsive-app-1024x600.gif")||f(We,"src",ur),f(We,"alt","ssm-responsive-app"),f(re,"href","https://www.heroku.com/"),f(re,"rel","nofollow"),f(se,"href","https://firebase.google.com/"),f(se,"rel","nofollow"),Rt(De.src,pr="/img/blog/wp-img/wp-content-uploads-2019-02-saas-deploy-heroku-1024x1000.gif")||f(De,"src",pr),f(De,"alt","saas-deploy-heroku"),f(ne,"href","https://courses.devdactic.com/p/software-startup-manual/"),f(ne,"rel","nofollow"),f(y,"width","1024"),f(y,"height","576"),Rt(y.src,hr="https://www.youtube.com/embed/JIIjNkcqr_A?feature=oembed")||f(y,"src",hr),f(y,"frameborder","0"),f(y,"allow","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"),y.allowFullscreen=!0,f(y,"title","How to Build Your SaaS With Javascript (and why it's Awesome)")}
1,m(e,i){r(e,g,i),o(g,ma),r(e,Gt,i),r(e,ue,i),o(ue,ca),r(e,Mt,i),r(e,v,i),o(v,wa),o(v,lt),o(lt,va),o(v,ba),o(v,it),o(it,_a),o(v,ga),r(e,Ht,i),r(e,d,i),o(d,Ea),o(d,rt),o(rt,ka),o(d,Ia),o(d,q),o(q,Sa),o(d,Pa),o(d,st),o(st,Ta),o(d,Aa),r(e,Wt,i),r(e,pe,i),o(pe,ja),r(e,Bt,i),r(e,E,i),o(E,z),o(z,Na),o(z,nt),o(nt,Oa),o(z,Ra),o(E,Ga),o(E,C),o(C,Ma),o(C,ut),o(ut,Ha),o(C,Wa),r(e,Lt,i),r(e,he,i),o(he,Ba),r(e,xt,i),r(e,fe,i),o(fe,La),r(e,Ft,i),r(e,ye,i),o(ye,xa),r(e,Jt,i),r(e,de,i),o(de,Fa),r(e,Ut,i),r(e,b,i),o(b,me),o(me,Z),o(Z,Ja),o(me,Ua),o(b,Ya),o(b,ce),o(ce,V),o(V,Da),o(ce,qa),o(b,za),o(b,we),o(we,K),o(K,Ca),o(we,Za),r(e,Yt,i),r(e,ve,i),o(ve,Va),r(e,Dt,i),r(e,be,i),o(be,_e),r(e,qt,i),r(e,k,i),o(k,Ka),o(k,pt),o(pt,Qa),o(k,Xa),r(e,zt,i),r(e,I,i),o(I,$a),o(I,ht),o(ht,el),o(I,tl),r(e,Ct,i),r(e,ge,i),o(ge,ol),r(e,Zt,i),r(e,S,i),o(S,al),o(S,Q),o(Q,ll),o(S,il),r(e,Vt,i),r(e,Ee,i),o(Ee,rl),r(e,Kt,i),r(e,P,i),o(P,sl),o(P,ft),o(ft,nl),o(P,ul),r(e,Qt,i),r(e,ke,i),o(ke,Ie),r(e,Xt,i),r(e,Se,i),o(Se,pl),r(e,$t,i),r(e,Pe,i),o(Pe,hl),r(e,eo,i),r(e,m,i),o(m,X),o(X,fl),o(X,$),o($,yl),o(X,dl),o(m,ml),o(m,ee),o(ee,cl),o(ee,te),o(te,wl),o(ee,vl),o(m,bl),o(m,oe),o(oe,_l),o(oe,ae),o(ae,gl),o(oe,El),o(m,kl),o(m,to),r(e,oo,i),r(e,Te,i),o(Te,Il),r(e,ao,i),r(e,T,i),o(T,Sl),o(T,yt),o(yt,Pl),o(T,Tl),r(e,lo,i),r(e,A,i),o(A,Al),o(A,dt),o(dt,jl),o(A,Nl),r(e,io,i),r(e,Ae,i),o(Ae,Ol),r(e,ro,i),r(e,je,i),o(je,Rl),r(e,so,i),r(e,Ne,i),o(Ne,Gl),r(e,no,i),r(e,Oe,i),o(Oe,Ml),r(e,uo,i),r(e,Re,i),o(Re,Hl),r(e,po,i),r(e,Ge,i),o(Ge,mt),o(mt,Wl),r(e,ho,i),r(e,j,i),o(j,Bl),o(j,ct),o(ct,Ll),o(j,xl),r(e,fo,i),r(e,c,i),o(c,Fl),o(c,wt),o(wt,Jl),o(c,Ul),o(c,vt),o(vt,Yl),o(c,Dl),o(c,bt),o(bt,ql),o(c,zl),r(e,yo,i),r(e,N,i),o(N,Cl),o(N,le),o(le,Zl),o(N,Vl),r(e,mo,i),r(e,O,i),o(O,Kl),o(O,ie),o(ie,Ql),o(O,Xl),r(e,co,i),r(e,Me,i),o(Me,$l),r(e,wo,i),r(e,R,i),o(R,ei),o(R,_t),o(_t,ti),o(R,oi),r(e,vo,i),r(e,G,i),o(G,ai),o(G,gt),o(gt,li),o(G,ii),r(e,bo,i),r(e,He,i),o(He,We),r(e,_o,i),r(e,_,i),o(_,ri),o(_,Et),o(Et,si),o(_,ni),o(_,kt),o(kt,ui),o(_,pi),r(e,go,i),r(e,Be,i),o(Be,hi),r(e,Eo,i),r(e,M,i),o(M,fi),o(M,It),o(It,yi),o(M,di),r(e,ko,i),r(e,Le,i),o(Le,mi),r(e,Io,i),r(e,xe,i),o(xe,ci),r(e,So,i),r(e,w,i),o(w,Fe),o(Fe,wi),o(Fe,re),o(re,vi),o(w,bi),o(w,St),o(St,_i),o(w,gi),o(w,Je),o(Je,Ei),o(Je,se),o(se,ki),o(w,Ii),o(w,Pt),o(Pt,Si),r(e,Po,i),r(e,Ue,i),o(Ue,Pi),r(e,To,i),r(e,Ye,i),o(Ye,De),r(e,Ao,i),r(e,qe,i),o(qe,Ti),r(e,jo,i),r(e,H,i),o(H,Ai),o(H,Tt),o(Tt,ji),o(H,Ni),r(e,No,i),r(e,ze,i),o(ze,Oi),r(e,Oo,i),r(e,Ce,i),o(Ce,Ri),r(e,Ro,i),r(e,W,i),o(W,Gi),o(W,At),o(At,Mi),o(W,Hi),r(e,Go,i),r(e,B,i),o(B,Wi),o(B,jt),o(jt,Bi),o(B,Li),r(e,Mo,i),r(e,Ze,i),o(Ze,xi),r(e,Ho,i),r(e,Ve,i),o(Ve,Fi),r(e,Wo,i),r(e,Ke,i),o(Ke,Ji),r(e,Bo,i),r(e,Qe,i),o(Qe,Ui),r(e,Lo,i),r(e,L,i),o(L,Yi),o(L,Nt),o(Nt,Di),o(L,qi),r(e,xo,i),r(e,x,i),o(x,zi),o(x,ne),o(ne,Ci),o(x,Zi),r(e,Fo,i),r(e,Xe,i),o(Xe,Vi),r(e,Jo,i),r(e,$e,i),o($e,Ki),r(e,Uo,i),r(e,F,i),o(F,Qi),o(F,Ot),o(Ot,Xi),o(F,$i),r(e,Yo,i),r(e,et,i),o(et,er),r(e,Do,i),r(e,y,i)},p:rr,i:rr,o:rr,d(e){e&&t(g),e&&t(Gt),e&&t(ue),e&&t(Mt),e&&t(v),e&&t(Ht),e&&t(d),e&&t(Wt),e&&t(pe),e&&t(Bt),e&&t(E),e&&t(Lt),e&&t(he),e&&t(xt),e&&t(fe),e&&t(Ft),e&&t(ye),e&&t(Jt),e&&t(de),e&&t(Ut),e&&t(b),e&&t(Yt),e&&t(ve),e&&t(Dt),e&&t(be),e&&t(qt),e&&t(k),e&&t(zt),e&&t(I),e&&t(Ct),e&&t(ge),e&&t(Zt),e&&t(S),e&&t(Vt),e&&t(Ee),e&&t(Kt),e&&t(P),e&&t(Qt),e&&t(ke),e&&t(Xt),e&&t(Se),e&&t($t),e&&t(Pe),e&&t(eo),e&&t(m),e&&t(oo),e&&t(Te),e&&t(ao),e&&t(T),e&&t(lo),e&&t(A),e&&t(io),e&&t(Ae),e&&t(ro),e&&t(je),e&&t(so),e&&t(Ne),e&&t(no),e&&t(Oe),e&&t(uo),e&&t(Re),e&&t(po),e&&t(Ge),e&&t(ho),e&&t(j),e&&t(fo),e&&t(c),e&&t(yo),e&&t(N),e&&t(mo),e&&t(O),e&&t(co),e&&t(Me),e&&t(wo),e&&t(R),e&&t(vo),e&&t(G),e&&t(bo),e&&t(He),e&&t(_o),e&&t(_),e&&t(go),e&&t(Be),e&&t(Eo),e&&t(M),e&&t(ko),e&&t(Le),e&&t(Io),e&&t(xe),e&&t(So),e&&t(w),e&&t(Po),e&&t(Ue),e&&t(To),e&&t(Ye),e&&t(Ao),e&&t(qe),e&&t(jo),e&&t(H),e&&t(No),e&&t(ze),e&&t(Oo),e&&t(Ce),e&&t(Ro),e&&t(W),e&&t(Go),e&&t(B),e&&t(Mo),e&&t(Ze),e&&t(Ho),e&&t(Ve),e&&t(Wo),e&&t(Ke),e&&t(Bo),e&&t(Qe),e&&t(Lo),e&&t(L),e&&t(xo),e&&t(x),e&&t(Fo),e&&t(Xe),e&&t(Jo),e&&t($e),e&&t(Uo),e&&t(F),e&&t(Yo),e&&t(et),e&&t(Do),e&&t(y)}}}const Us={title:"How to Build Your SaaS With Javascript (and why it's Awesome)",author:"Simon Grimm",author_id:1,twitter:"schlimmson",description:"Last year I started a cool idea with a friend together and although the idea was pretty basic, it took me months to implement the first version. Why?",published:"2019-03-05T00:00:00.000Z",slug:"build-your-saas-javascript",updated:"2019-03-05T00:00:00.000Z",t
1imeToRead:9,wpId:4844,tags:["Entrepreneur","intermediate"],hero:"/img/blog/wp-img/devdactic.com-wp-content-uploads-2019-02-build-your-saas-javascript.webp"};class Ys extends Bs{constructor(g){super(),Ls(this,g,null,Fs,xs,{})}}export{Ys as default,Us as metadata};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.