We’ve explained the Jamstack, a preferred new approach to construct safe, scalable, high-performance websites. Now we’ll introduce you to the instruments, companies, and APIs that energy Jamstack websites.

The A in Jamstack stands for API. APIs can do something for you, from sending a kind to authenticating a consumer, or from storing and retrieving information in actual time to buying merchandise.

On this article, we’ll do an intensive evaluation of current APIs and the way they examine to at least one one other. This evaluation couldn’t presumably embody the entire spectrum of third-party APIs which you can combine into your web site, however hopefully you’ll nonetheless discover the protection enlightening sufficient.

We’ll use the phrases “headless”, “indifferent”, and “serverless” so much on this article. When you haven’t already, try our introduction to the Jamstack, which covers all of the fundamentals.

Internet hosting (Largely for Free)

Supplied: Netlify

Internet hosting a Jamstack website normally entails automated deployment pipelines. For instance, you might need a repository in GitHub which, on each push, robotically triggers a web-based deployment (through webhooks), working the mandatory build tools (corresponding to Jekyll) and regression tests (through Travis CI).

Sound tough? It may be a surprisingly easy course of!

A lot of the companies right here embrace these goodies out of the field:

  • SSD drives
  • CDN deployments
  • free SSL (together with for customized domains)
  • command line deployments and rollbacks

Notice: look out for one more article on this collection, coming quickly, protecting how one can use these companies.

Providers

Google Firebase and AWS Amplify

Firebase Hosting is Google’s tackle a internet hosting service that’s simple to know and implement, and it’s free to make use of (limits apply). Firebase’s spine really lies on prime of the Google Cloud Platform (GCP), and you may in reality entry and tweak some Firebase deployments via the GCP console. However by implementing one thing of an “gateway” (Firebase) that transparently handles GCP sources for us, Google gave builders a model new and extremely improved consumer expertise (UX) … and the Firebase’s YouTube channel is simply sensible! 👏

AWS Amplify can be an effort to cut back the complexities of Amazon Web Services (AWS) for internet and cell deployment that doesn’t fairly supply free internet hosting however 12 months of free use for brand new accounts for its Storage with Amplify as a part of the AWS Free Tier.

Google actually made an excellent transfer with the Firebase household of merchandise by “detaching” them from the GCP, however Amazon went half-way with AWS Amplify. It positive is a dramatic enchancment from the common AWS workflow, particularly for novice customers, and its documentation hub is excellent and far more down-to-earth than the way in which Amazon normally paperwork companies. However Amplify continues to be accessed from the identical outdated (horrifically bloated) console. You continue to want a bank card to only open an account, deployments are nonetheless region-specific (no built-in CDN, critically?), and the workflow isn’t as easy when in comparison with that of Firebase or Netlify.

GitHub Pages and GitLab Pages

Each internet hosting companies for Git repositories even have a built-in service to host static pages proper out of your codebases, 100% free: GitHub Pages and GitLab Pages.

In a future article we’ll cowl how one can use these companies, however within the meantime make sure that to take a look at these easy-to-follow guides:

Netlify and Heroku

In a really brief time frame, Netlify not solely coined the Jamstack time period but additionally positioned itself because the place to go for all issues static. When you might actually accomplish extra with an elaborated AWS pipeline, the simplicity and unparalleled ease of use that Netlify presents is unbeatable. Wish to host a static website? Simply drop it here and it’s on-line. Need automated updates? Link a repo and simply push a commit. And batteries are included — immediate builds, worldwide CDN, free SSL, CLI software, on-click rollbacks, and extra.

Heroku is the one service on this checklist that lets you host dynamic pages: Node.js, Ruby, Python, Java, PHP, Go, Scala and Clojure (examine their Language Support web page). So for those who aren’t but fairly able to go static, this is perhaps a great way to check your dynamic websites on-line free of charge.

With 194 information facilities as of 2020, Cloudflare is — by many metrics — the corporate that provides the bottom latency for his or her DNS and CDN companies all over the world. They serve large corporations but additionally have a variety of companies oriented to builders, like Workers Sites. The service isn’t free ($5/mo minimal cost) but it surely’s as prime performant as you will get, and pretty simple to make use of.

Different instruments focused at static pages embrace Aerobatic, which presents a free trial with no bank card required and assist for internationalization (i18n) and full-text search built-in plugins; Surge.sh with npm run scripts and CI services; and Vercel (previously ZEIT Now) with an Edge Network serving large names corresponding to Twilio and The Washington Publish.

Comparability

Storing and Retrieving Information: Actual-time NoSQL Databases

NoSQL options like MongoDB have been coexisting with relational databases like MySQL for a while (see the differences and how to choose), however real-time processing takes NoSQL to the following degree by enabling cloud storage for state administration, corresponding to a consumer getting into their title or clicking a radio button.

When you’re accustomed to Redux and Vuex — React and Vue.js libraries for state administration, respectively — consider integrating that idea with a cloud storage supplier.

Providers

Amazon DynamoDB is a “totally managed, multiregion, multimaster, sturdy database with built-in safety, backup and restore, and in-memory caching for internet-scale functions”. However as with many issues AWS, it’s tough to implement and very exhausting to debug (see Why Amazon DynamoDB isn’t for everyone, by Forrest Brazeal). In all equity to Amazon, in addition they constructed DataStore into AWS Amplify (with GraphQL and REST API assist) with a extra easy method, in step with the simplicity of the remainder of Amplify’s merchandise.

Google Firestore made real-time NoSQL databases — a reasonably advanced matter in and of itself — so simple as they are often, with just about all of the capabilities DynamoDB has. It’s very well documented (with introductory clips which can be enjoyable to observe). And React and Vue.js have wrappers round Firestore with react-redux-firebase and Vuexfire, respectively.

Cloudflare positive is aware of how one can take efficiency to the very excessive, and Workers KV, a serverless key-value storage for functions, is a effective instance of what a nicely engineered product appears like. The premise of Employees KV is which you can entry a key as if it had been a neighborhood file inside your app, and the content material would be the worth saved for that key. That’s it — no API to implement, no additional coding. And due to the unbeatable efficiency of the Cloudflare CDN, this method can really be quicker than querying a NoSQL database. And so simple as it’s, it scales seamlessly to hundreds of thousands of requests. 👏

And at last, there’s FaunaDB, a startup that crafted an answer with native GraphQL and a simple pricing (together with a free plan) that may be carried out in minutes.

Managing Content material: Headless CMS

Within the “monolithic” means of doing issues, at any time when we used a given content management system — corresponding to WordPress, Django, or Joomla! — it meant that we additionally wanted to make use of the front-end engine that got here connected to it, as front and back finish had been “coupled” parts of a single piece of software program (see our introduction to the Jamstack for more information about tightly vs loosely coupled websites).

Enter the headless CMS — a again finish solely with out a entrance finish. Since a headless CMS would usually expose an API or generate static content material in the way in which of Markdown or HTML recordsdata, the entrance finish will be wherever actually. Actually, a number of and simultaneous interfaces will be created for internet sites, cell apps, and Web of Issues (IoT) apps.

Merchandise and Providers

There are a variety of headless CMSs, each as software program you’ll be able to obtain and configure the place you do the deployments your self, or supplied within the software-as-a-service (SaaS) mannequin the place every part is taken care of for you.

Some options you’ll be able to anticipate finding:

* Since some headless CMS will combine easily along with your git repo, the versioning functionality can really be a outstanding enchancment over an everyday CMS.

Self-hosted Headless CMS

Ghost, “the #1 open supply headless Node.js CMS”, is actually the one with the most stars on GitHub. Not solely can Ghost deal with content material, but it surely additionally presents a variety of integrations to handle funds (Stripe), e-mail lists (MailChimp), buying (Shopify), and lots of extra. After which there’s Ghost(Pro), which is the official managed internet hosting for Ghost with business assist.

Pretty near Ghost in reputation comes Strapi, with REST and GraphQL APIs, and 1-click deployments on Heroku, AWS, and DigitalOcean. It has “starters” (template initiatives) to work seamlessly with Gatsby, Vue.js with Nuxt.js, React with Subsequent.js, and Angular. It additionally runs on Node.js and has assist for a number of database engines.

Netlify CMS can be a preferred choice constructed as a single–web page React app. There’s Directus, which wraps customized SQL databases with an API and offers an intuitive admin app to handle its content material, and the business companion Directus Cloud. There’s additionally TinaCMS, which can be React-based, and Ponzu, Copckpit, and lots of extra, which you’ll be able to discover oin the excellent checklist offered by headlesscms.org.

SaaS Headless CMS

CloudCannon is the cloud CMS for Jekyll (we’ll evaluation Jekyll later within the “static website mills” part), with easy integration with GitHub, Bitbucket and Dropbox. They’ve a free plan as nicely however with no international CDN internet hosting.

Contentful is one thing totally different: a content material hub the place enterprise homeowners, entrepreneurs, builders and venture managers can all go to set and handle all the information sources of a corporation. And their headless CMS is simply a component of that technique. The Contentful platform is fully featured, very well documented, with plenty of open-source tools. And whereas the pricing is a bit complicated, there’s really a free plan that solely requires attribution.

There are different SaaS headless CMSs with free plans, corresponding to DatoCMS and Sanity with a proposition just like that of Contentful; Forestry, with assist for a variety of static mills; GraphCMS, with GraphQL assist; and Prismic. These are only a few of the numerous choices.

Sending Info: Types with out Code

Sending information via kinds has endlessly been one of many fundamental makes use of for server-side processing. There are primarily two approaches to addressing this drawback on a static website, every with professionals and cons.

From Builders, Embedded and Hosted Types

Many instances integrating a “powered by” exterior kind is greater than sufficient to gather e-mail addresses or to obtain suggestions.

Google Forms have supplied this chance since 2008 fully free of charge, with a easy interface that shops submissions on Google Sheets, and that may ship alerts through e-mail each time there’s a submission.

Formstack takes kinds to a different degree by offering an built-in workflow supporting digital signatures, doc technology, Salesforce integration, and extra. They provide a free tryout but no free plans.

Then you may have the extraordinarily easy-to-use kind builders JotForm and Wufoo, which combine dealing with funds, amongst different issues, or Typeform, which makes kinds and surveys … fairly? All of them supply free plans.

Exterior API: Kind Processing as a Service (FPaaS)

Generally a builder gained’t reduce it, as you want extra flexibility to current data and fields, or to completely combine the appear and feel of the shape with the remainder of your web site. For this you will want to combine an API.

The best way these companies work is surprisingly simple: you specify a URL for submission that can do the processing for you. At most you’ll should set a number of issues up however most likely gained’t must do any additional coding.

There are a variety of suppliers providing free plans, corresponding to Form.IO, Formcarry, Formspark, and Netlify Forms. All of them work in the same means and are very simple to implement.

FormDen and FormKeep are additionally kind builders that may in any other case be used simply as again ends, although none of them supply free plans.

Programming Server-Aspect Logic: Operate as a Service (FaaS)

Couldn’t discover an API that does fairly what you need? Create it! You don’t must resort again to a hosted back-end system to course of server-side logic, with all the trouble that comes with it (upkeep, payments, credentials, safety patches). As an alternative, you’ll be able to implement a micro-service in your language of selection (oftentimes JavaScript, Python, or Go), encapsulate that logic into features, and supply them via a RESTful API.

As with just about every part else on this checklist, you gained’t be paying something for a perform that’s not being actively used, so no worries for simply leaving it sitting there (however beware that spikes in visitors may also set off additional billing).

Suppliers

Whereas the implementation particulars for AWS Lambda, Azure Functions and Google Cloud Functions could differ, all of them work in just about the identical style and also you’ll want a level of familiarity with AWS, Azure or GCP. AWS Lambda has the richest language assist of all of them (and likewise Amazon API Gateway that will help you wrap your features right into a maintainable API with monitoring instruments), whereas Azure — not surprisingly — has one of the best assist for .NET Framework and .NET Core (with different versions supporting different runtimes and even TypeScript transpiled to JavaScript). However remember that Azure systematically ranks because the slowest service by a margin.

Cloud Functions for Firebase and Netlify Functions are wrappers round Google Cloud Capabilities and AWS Lambda, respectively. They vastly simplify the administration of features on the cloud, as you successfully can get away with out even having an account on such companies. Code deployment and versioning turn into trivial with Netlify — which additionally has superb community support — as it’s going to easily combine along with your repo providing stage, previewing, and rolling again at a click on (or a commit). Simplicity naturally comes on the expense of dropping some flexibility (see Firebase Cloud Functions: the great, the meh, and the ugly by Pier Bover).

IBM Cloud Functions (primarily based on Apache OpenWhisk) and Cloudflare Workers are different companies you may need to take a look at. IBM has a formidable checklist of supported languages, together with the choice to deploy Docker containers with your individual runtime. Nevertheless, it ranked considerably poorly efficiency sensible. And simply as Netlify systematically manages to make issues the best, Cloudflare once more makes issues the quickest (and by a difference).

Comparability

service languages overhead* coldstart* problem assist
AWS Lambda C#, Go, Java, JavaScript, PowerShell, Python, Ruby 86 ms 🟢 589 ms excessive 👍 superb
Azure Functions C#, F#, Java, JavaScript and TypeScript, PowerShell, Python 760 ms 🔴 5,907 ms 🔴 excessive 👎 very poor
Cloud Functions for Firebase JavaScript and TypeScript 642 ms 🔴 168 ms low 👍 superb
Cloudflare Workers JavaScript, COBOL 70 ms 🟢 76 ms 🟢 intermediate intermediate
Google Cloud Functions Go, Java, Node.js, Python 642 ms 🔴 168 ms excessive 👍 superb
IBM Cloud Functions .C#, Go, Java, JavaScript, PHP, Python, Ruby, Swift, and Docker containers 136 ms 2,103 ms 🔴 excessive no information
Netlify Functions Go, Node.js 86 ms 🟢 589 ms very low 👍 superb

* As measured by λ Serverless Benchmark, the overhead is the time from request to response with out the time the perform took (for a concurrency of 50), and the coldstart is how lengthy the servers takes to reply when queried are spanned each three hours; the decrease the values, the higher.

Authenticating Customers: Id as a Service

Id as a Service (IDaaS), additionally known as generally Authentication as a Service (AaaS), entails managing a full consumer registration, affirmation, and authentication with simply APIs. The Geist of “stateless authentication” is {that a} consumer will authenticate towards a third-party and are available again to you with a legitimate “token” which you can confirm, or revoke if want be.

In some instances, a supplier may even supply a “drop-in” consumer interface (UI) that can work seamlessly throughout desktop and cell, all of which might doubtlessly prevent very lengthy hours of labor.

Providers

Auth0 has been in enterprise the longest and has quickstart guides for a variety of eventualities. It’s a superb supplier if you wish to implement a fancy answer and have already got some expertise implementing authentication. However as they level out, “identification is advanced, cope with it”. The massive scope Auth0 companies (common login, single signal on (SSO), multifactor authentication, department password detection, and so forth) will be overwhelming for those who’re simply beginning on the subject.

Firebase Authentication (with its ready-to-use UI) and Authentication with Amplify are additionally very complete and versatile, and considerably offered in a extra easy method than Auth0. Firebase additionally presents nameless authentication! Curious? Take a look at this clip:

As soon as once more, Netlify appears to give you the simplest answer to implement with Netlify Identity and its open-source zero config netlify-identity-widget to create a secure login in 10 minutes! However in fact, there are some limitations (try Four Dealbreakers in Netlify Identity, by Jean Cochrane).

You too can examine Okta, FusionAuth and LoginRadius, all of which have free plans. There are not any freebies for Ping Identity, OneLogin, and Ubisecure, that are extra oriented to the enterprise sector. Lastly, contemplate Cloudflare Access, as every part Cloudflare does is rock strong.

I can hear a few of you saying “all of this is perhaps okay for future initiatives, however my websites are already dynamic, so what to do?” Right here’s when static website mills enter the image.

You possibly can have one of the best of each worlds — the comfort of a well-recognized CMS and static pages with code and data splitting, preloading, caching, picture optimization, and all kinds of efficiency enhancements. An SSR will bridge that hole by querying your database and producing static output out of it (for instance, Markdown pages), and with some settings to set your template, you’ll be all set.

The itemizing right here is tiny in comparison with the ever rising checklist of SSRs. Take a look at StaticGen for more information.

Foremost Merchandise

GatsbyJS is powered by React.js and webpack, which means that it might probably generate progressive internet apps (aka PWAs, web sites that feel and appear like an apps). It additionally helps GraphQL (see Write Apps with Better Building Blocks) and it has +1,000 plugins to get data from anywhere (WordPress, Drupal, Contentful, GraphCMS, DatoCMS, and lots of extra). See how GatsbyJS says it compares to its main competitors, Hugo and Jekyll.

All of this flexibility comes at a price, as setting and customizing GatsbyJS could be a time-consuming course of, and for those who don’t have a good understanding of React — and subsequently JavaScript — you gained’t be capable to make a lot of it. That’s the place Gatsby Cloud is available in, providing assist to construct and keep Gatsby websites for free or for a fee, the place you would automate your quick builds, entry to previews, generate day by day edits, and fireplace deployments with ease to Netlify, Cloudflare, AWS CloudFront or Akamai.

Hugo claims to be “the world’s quickest framework for constructing web sites”, and it positive can generate huge websites in milliseconds. With built-in templates (actually hundreds of them available) and native assist for internationalization (i18n), it’s additionally probably the most in style SSGs. Hugo is a Go app, and whereas Go isn’t exhausting to set and be taught, you’ll positively have to be checking the documentation typically for those who aren’t accustomed to it.

Not like GatsbyJS, configuring and deploying Jekyll is a reasonably easy course of. Moreover, Jekyll is the one SSR supported by GitHub Pages (Tom Preston-Werner, creator of Jekyll, can be a co-founder of GitHub), and may easily deploy static websites free of charge proper out of your GitHub repos! Jekyll makes use of Shopify’s Liquid template language, which can be simple to be taught. The downsides? As a Ruby app, Jekyll will be exhausting to set on a Home windows setting, and optimizations corresponding to minimizing JavaScript code and picture preloading aren’t included by default. Actually, Jekyll doesn’t even intention at producing a PWA however simply purely static websites — which could nonetheless be effective relying on what you want.

Comparability

Others

WP2Static is an SSR designed particularly for WordPress (WP). It has a small however very fascinating set of plugins, like Algolia search, and Cloudflare Employees and Netlify deployments. HardyPress is definitely a SaaS answer to generate static WP websites, and for a fee you’ll have an admin panel from the place you’ll be able to enter some credentials to entry your on-line WP installations to handle every part: shut down stay WP installs that had been already imported, clear deployment to international a CDN, HTTPS, kinds, search. Different WP-related SSGs with business assist are Shifter, Strattic, and Sitesauce.

Since I’m admittedly biased in direction of Vue.js, I needed to embrace VuePress, which is meant to generate single web page functions (SPAs) and has a minimal setup with markdown-centered recordsdata, and it’s additionally powered by webpack. Gridsome and Nuxt.js are extra featured Vue.js powered frameworks with SSR capabilities.

The structure and advantages of headless ecommerce is just not that totally different from that of a headless CMS: huge value discount (internet hosting, licenses, upkeep), much less time to market, seamless integration, and — a giant one for commerce — “omnichannel” capabilities.

Headless buying carts are considerably totally different from companies like Shopify, as you aren’t certain to a storefront and you may transfer information round to a wide range of media and from a wide range of sources. A headless ecommerce supplier is just not opinionated on the way you current your content material or entry your information and has no management over it.

Exactly that is what allows an omnichannel technique, by which you can’t solely ship content material to a number of channels (internet, cell, IoT) but additionally centralize the processes administration throughout totally different channels for a holistic, improved UX. Thoughts you, research by Harvard Business Review and Aspect Software have proven that such methods present a important edge over the “multi channel” or “on-line alone” method.

Providers

Foxy.io and Snipcart present a easy service that’s ridiculously simple to combine into a variety of codecs. Cunning.io is subscription-based, whereas Snipcart prices a percentage of transactions.

At a extra company degree, Elastic Path presents headless ecommerce companies for the automotive, manufacturing and healthcare industries, amongst others. And Salesforce Commerce Cloud leverages the Salesforce platform into headless ecommerce for business-to-consumer (B2C) and business-to-business (B2B).

Discovering What You Need: Search as a Service

Internet search can additionally be built-in in our web sites through search as a service, letting a third-party do the indexing and sorting of the outcomes for us.

Google Custom Search (and its rebranding as Programmable Search Engine) was a pioneer on this area, however whereas very simple to make use of and implement, it didn’t combine nicely with the appear and feel of the location, and the search outcomes trusted what Google beforehand listed.

There’s Elasticsearch with managed options like Amazon Elasticsearch Service, and different AI-powered companies like Azure Cognitive Search, Amazon Kendra and Amazon CloudSearch, and Apache Solr. They usually’re all wonderful and can yield wonderful outcomes if nicely carried out. However that’s exactly the issue — implementation. It takes high quality time and abilities to craft an answer that truly works.

Merchandise

Algolia is the one service that took built-in search to a different degree with its extremely quick Search API that can be utilized in a number of situations (website, voice, geo, cell, ecommerce, media, and extra). It presents a beneficiant free “Community” plan.

Klevu and Sooqr Search are search options particularly focused at ecommerce, to make it simpler to attach consumers with the merchandise it’s a must to supply. Sooqr presents a free plan for as much as 100 distinctive merchandise, whereas Klevu doesn’t.

Expertrec and Swiftype are different companies you may need to examine for website and app search. No free plans, although.

Staying As much as Date: Notifications

Having a method to speak throughout a variety of channels is vital to stimulating consumer engagement, and but it’s even higher to mix them in a programmatic means with a single API to ship messages throughout all platforms.

There are primarily 4 complimentary pathways you should utilize:

  • Cellular push is a extremely seen approach to ship (hopefully) related messages in order that customers return to your app.
  • Internet push follows the identical precept however for desktop and cell browsers.
  • In-App messages are yet one more approach to retain subscribers, offering help your customers may want.
  • And Electronic mail, as a result of even in 2020 and with all the IMs and social apps, e-mail advertising continues to be a factor.

Providers

Have you ever ever heard that most people think they’re above average? Looks as if corporations fall into bias as nicely, as OneSignal, Pushwoosh and Truepush all proclaim themselves because the “#1 push notifications service”. In any case, all of them have beneficiant free plans (and numerous advertising insights to get out of the information you ship via them), with OneSignal having more integrations to supply.

You too can examine Airship, Catapush, Leanplum, Pushover, and many more

Additionally, for those who’re already utilizing Google Firebase, you may want to take a look at Cloud Messaging and In-App Messaging. Likewise, for AWS Amplify, examine Push Notifications.

Google Analytics for Firebase is one thing of a Google Analytics wrapper for the cell, and likewise for a simplified internet expertise. It’s managed from the user-friendly Google Firebase console.

Netlify Analytics actually has an edge right here. It’s so easy to arrange that there’s really no setup! The one requirement to make use of the service (apart from paying the $9/mo price per website) is that you just already host your website in Netlify. With that, they have already got all the data they want “proper from the supply of fact” to current you with the stats — no JavaScript code, no cookies, no pixels monitoring wanted. Whereas this doesn’t scale to cell apps like Google Analytics for Firebase does, it presents higher efficiency (no affect on the render time) and extra correct numbers (session runs on the server, not on the consumer).

Analytics with Amplify is Amazon’s method to a service that works in just about the identical style as Google Analytics for Firebase, engaged on Android, iOS and the Internet.

Conclusions (or Why Pay for One thing You May Develop Your self?)

When you’ve bought this far, you’ve in all probability seen that many of the companies we’ve lined can be utilized free of charge up to some extent — which is mostly when your website or app takes off. So why not develop your individual search or authentication answer, or handle your individual server and create ad-hoc notifications which can be precisely what you want?

Properly, right here’s a query: have you ever seen that even large firms with the best IT departments that cash can purchase additionally use these companies?

  • Twitch makes use of Algolia
  • Spotify and Airbnb use GatsbyJS
  • Atlassian makes use of Auth0
  • Netflix makes use of CloudCannon
  • Alibaba makes use of Firebase
  • Mozilla makes use of Ghost
  • just about everybody makes use of AWS and Cloudflare
  • … and so forth, and so forth

The final word query is — are you actually going to economize and/or have extra management by shifting your sources and focus into fixing an issue that isn’t the core of your enterprise, and that anyone with a extra certified staff has already solved? If that’s the case, by all means go for it! Or else you’ll be able to settle for the value tag, overlook about that one drawback, and transfer on to the following one.

Jamstack Foundations

Rise up to hurry with the Jamstack. Our Jamstack Foundations assortment helps you are taking your first steps into the Jamstack and past, and we’re including to it continuously. We’ll deliver you the tutorials you’ll want to turn into a professional. You possibly can at all times seek advice from our index because it’s up to date on the finish of our Introduction to the Jamstack:

Jamstack Foundations

LEAVE A REPLY

Please enter your comment!
Please enter your name here