From the initial beta release, through the addition of Docker as the primary development environment, the public beta release, the addition of teams, Vue 3, mobile responsive design, scripting, and seemingly endless amounts of cleanup, upgrades, and polish, to here - the 1.0 official full release, a little over a full year after open beta.  It has been a journey, but Nodewood has finally launched.

Nodewood is in a great place.  It is in active production use, still under active development, and with the 1.0 release, brings even more quality-of-life improvements as well as providing another option for a significant part of the lifecycle of any application - production deployment.

Let's talk about that last one first.

New feature: Pulumi deploy system

Pulumi is an infrastructure-as-code system designed to make it easy and reliable to stand up and modify cloud infrastructure for your projects.  It's similar to Terraform, but instead of declarative YML files, you can write actual code to describe your system.  And since Nodewood is all JavaScript, Nodewood's Pulumi deploy system is also written in JavaScript.

The included Pulumi deploy system will stand up an AWS-based production stack.  It will create a Postgres RDS instance, a Fargate cluster running instances of your app (1 to start, but easily scalable) and a load balancer to route between them.  It is simple by default (which helps keep costs down in early days), but easy to scale up to a larger database or application instance sizes as your needs grow.

Healthcheck endpoints and a more-reliable Docker startup

Before, the Docker containers started up in really any order, and this mostly worked - most of the containers started up quickly enough that it usually didn't cause issues.  But occasionally (like on initial project install) certain containers (like Postgres) would take longer to start, and other containers that depended on it would fail and not give a good reason why.

Now, all dependee containers have a healthcheck added to them in the Dockerfile, and the api container has a new healthcheck endpoint.  This ensures that these containers will always start up in the correct order, and you can use the new healthcheck endpoint for uptime monitoring services.

Services are automatically injected into Controllers, Scripts, and other Services

Sometimes, you might have a Service that relies on another Service, which in turn relies on that first service.  For example, a PostsService that creates a new post, then an AttachmentsService that creates a new attachment, and then uses the PostsService to update the time of the post to the time of the attachment.  This is what's called a "circular dependency", and it's especially problematic in Node, where that second require statement will import an empty PostsService and leave you scratching your head.

Since Services are supposed to be where your business logic is primarily stored and broken up into logical steps, this is not a good problem to have.  So instead of requiring you to manually include Services into other Services and to try to think about your dependency chain long in advance, these Services are now automatically injected and available for use from any Controller, Script, or other Service.  Just call this.postsService.updatePost(...) and you're golden.

As always, a variety of updates, cleanup, and polish

  • Adds an afterRequestAugmented() function in AppBuilder, in case you want to add properties to the request after user/team/subscription have been added to it.
  • More-reliable version of testResolver that can handle when test directories and sibling files have the same name.
  • Moves positioning styling out of UserMenu and into App/AdminTemplate, so you can more-easily style your app layout.
  • Changes keys parameter in Service's update() and insert() to be optional.  This simplifies a lot of common use cases.
  • Fixes issue where ejected Controllers or Services wouldn't be loaded unless the feature was explicitly enabled in app feature list.  This makes ejecting files a lot easier to understand.
  • Updates passport version for security.
  • And a lot more!

Launch sale!

For the next two weeks, Nodewood is 20% off when you use coupon nodewood-launch!  I know some folks have been holding off on taking advantage of the beta discount until closer to launch, and now that launch is here, I don't want to suddenly yank the rug out from underneath them.

And for everyone else, this just means a nice little discount if you act in the next two weeks!

Again, this has been a long journey, and this isn't the final step.  But it is an important one, and one I'm happy to finally release to the world.

Looking to save time building your next SaaS app?  Save weeks or even months of time developing a mobile-responsive, easy to extend application when you build with Nodewood, a Node.js/Vue SaaS boilerplate and starter kit.

Photo by Jean-Philippe Delberghe on Unsplash