How to Start a Node.js User Group

09 Mar 2017

I started a Node.js User Group here in Jacksonville back in 2013, and I wanted to share my experiences about starting a Node.js User Group…

Picture of JaxNode meeting from Feb. 2017

February 2017’s JaxNode meeting with Brady Merkel speaking on Node 101 and mentoring

I started a Node.js User Group here in Jacksonville back in 2013, and I wanted to share my experiences about starting a Node.js User Group for anyone who has ever wanted to get one started in their community! FYI, the user group that was started is called JaxNode. Come join us next time you are in the area!

A Little Bit of My Background

Back in the summer of 2013, I became interested in learning more about Node.js. I had a side business where I was building native mobile applications for iOS and Android smartphones. My day job had been building ASP.NET web applications and web services. I was looking for a way I could build restful services for my mobile apps without having to run a Windows emulator since I was doing my mobile development on a Mac. This was pre .NET Core.

So I looked at the alternatives for doing backend service development that could be done on a Mac. I looked at Java, PHP, Python, Ruby and Node.js. I had some server experience with Java, but I was looking for something that did not require the overhead of using a compiler.

Node.js turned out to be a perfect fit for my needs. With Node’s evented IO, it had very quick startup times. My http requests took a few milliseconds to process as opposed to several hundred milliseconds with ASP.NET. There was also a huge open source community with tools and frameworks for building the applications and an amazing module ecosystem through npm (Node Package Manager).

Jacksonville has a great community of software engineers, and many programming User Groups, but none that were dedicated to Node.js or JavaScript. I had seen a few presentations on Node.js in Jacksonville, but no one had started a User Group just for Node.js.

The people were there, now we just needed to come together to learn more from each other around Node.js and JavaScript. If you find yourself in my same predicament and there is not a Node.js user group or JavaScript User Group in your community, then you should consider starting one. Here’s why and some suggestions on the how!

Why Start a Node.js User Group?

User Groups are great not just for learning about new subjects and trends in software, but they are also a great place to network with other developers and companies with similar interests.

Node.js has a non-profit organization that supports, i.e.. The Node.js Foundation and companies that support it, but almost everything in Node.js is driven by the community. User Groups are a great way to help foster and support that community.

Organizing your Node.js User Group

const startNodejsGroup = () => {

Ok, so now you have started your Node.js group, now what? How do you let the local community know about it, find a place to meet, and provide food and drinks for those meetings? The best suggestion is to use a site like Meetup or Eventbrite to organize your meetings and invite people to those meetings. Meetup does have a subscription cost, but if that is an issue, there are free alternatives like Facebook.

I used Meetup to start and advertise JaxNode. You also might want to create a website for your user group. It can be as simple as creating a GitHub pages site. GitHub provides free web hosting. I created an open source web application based on express that ties into Meetup’s API. It can also use the Twitter API. This site automatically displays the next meeting.

Once I started our Meetup group, a few companies here in town offered to provide a meeting room for free. Other companies also offered to provide food and refreshments at those meetings. Everything started to fall into place very quickly. If you cannot find a company or organization that will host your meetings, take a look at your local public library. Many libraries have meeting spaces that can be reserved.

Try to communicate with your users on a regular basis. Let them know about upcoming meetings, but don’t spam them. I try have future meetings topics posted at least a month out. I will send an email to my members the week of the meeting, and the day before the meeting as a reminder. Posting on you social media accounts is also important for getting the word out.

It is also important to meet on a regular basis, during the same time of the month, each month. JaxNode meets the third Thursday of the month.

Try to find volunteers to help run the group. Sharing responsibilities will help prevent you from burning out. Managing a User Group usually involves booking speakers, finding meeting locations and emceeing the meetings.

One of the challenges in running a user group is finding speakers and topics that can be discussed that will draw users to your meetup. Fortunately for us in the JavaScript community, there is no shortage of topics that can be discussed. npm now holds over 250,000 modules. That is a source of 250,000 topics that can be discussed. We have many speakers who have volunteered to speak at JaxNode, but I try to actively encourage members who have not spoken before to create presentations for our group.

Try to have some variety in your presentations as well. At JaxNode we have presentations on server-side web application frameworks, such as Express and Hapi; client-side frameworks like Angular and Ember. But, we have also have presentations on quirkier subjects like robots, and even how to write plugins to Photoshop using Node.js.

Soft skills are increasingly mentioned as an important skill for developers to have, and presenting a subject to a user group is a great way to develop those soft skills.

Marketing your User Group

Besides getting setup on Meetup or creating a website, it is a good idea to create social media accounts on Facebook, Twitter and Linkedin. We also use our @jaxnode Twitter account to repost interesting articles and posts around the web on Node.js.

JaxNode Logo based on the JS logo

If you need a Logo, there is a great repository created by Chris Williams featuring the ‘JS’ against a yellow background. We took that original Logo, and created our own version with the JaxNode logo. There is a company called Sticker Mule that makes stickers of your Logos. Those can be given away as swag at user group meetings. They help drive buzz about your group when people see your sticker emblazoned upon someone’s Laptop.

I also created a GitHub group just for our group so the members could fork their repos on presentations they have done at the group. I also put the source for our site on our GitHub site as well.

The Node.js github site also has a repo for evangelism. You can list your group in the Current Initiatives by making a pull request to this repo for adding your group to the list of meetups. They have a good article on this site explaining the format of the submission.

Make friends with the other User Group managers in your area. It is a great way to market your group and possibly find new members and speakers for your group.

Planting the Seed

Just in the last month here in Jacksonville, a React]( and React Native user group was started by members who have attended our meetings. This is one of the things that I have been happiest about in starting JaxNode. We had several meetings on React, and now we have two new user groups in Jacksonville dedicated to React.

I have to admit, the main reason I started a Node.js User Group was a selfish reason. I wanted to see other companies here in Jacksonville start to adopt Node and other JavaScript technologies. I knew that creating new opportunities for Node.js in Jacksonville would also help me in my career. The side benefit is that it has also helped other people get the opportunities that they wanted as well.

So what are you waiting for? Start that Node.js and JavaScript user group in your area. And if you need any help on the way, feel free to contact me at @jaxnode or @davidfekke on Twitter.

Dealing with a rejection from the Apple App Store

06 Sep 2016

Image of Jekyll Logo

This article is reprinted from a post I made to Hashnode.

I have been writing software for iOS since before it was the iOS, back when it was still called iPhone OS 2.0. Navigating the App Store approval process can be tricky, specifically when dealing with a rejected app.

Apple can reject an App for a lot of different reasons. After having gone through this process dozens of times, I thought I would share some insights about what to do when your app is rejected by Apple. I had an app I was working on rejected a couple of days ago, and I was able to get the App approved through Apple’s “Appeal Board”.

The app I was trying to submit was rejected because Apple said it did not work on IPv6 WiFi networks. Apple began requiring that apps submitted to Apple back in July should run on IPv6 networks because a lot of cellular networks are switching IPv6 only. This makes sense because ICANN ran out of IPv4 IP addresses some time ago. If your app does not run on a IPv6 network, Apple will reject the app.

Our app did work on IPv6 networks, but Apple still rejected our app. How did this happen? It is because their is a flaw in Apple’s WiFi testing network. You can read about it in this link There is reference to an article on Apple’s dev site on how to turn your Mac into a IPv6 WiFi router with NAT64 support. I used this to prove that our app ran on IPv6 networks.

How to win an Appeal

Don’t just re-submit your app! Apple provides a “resolution center” on iTunes Connect. In the resolution center you can reply to messages from Apple. Provide as much information to Apple as you can in your reply. You can even upload attachments. Apple also provides a link to “Appeal” the rejection for your app to Apple’s review board. That sounds pretty bureaucratic, but Apple usually repsonds to your appeal within 24 hours.

In our case, they requested that we add some additional information to the notes section in the metadata, which included a link to a video of our app working on an IPv6 network, and that we push the “Submit for Review” button in iTunes Connect.

The Basics of Submitting an App

The first thing I would recommend any developer do before submitting an App to Apple’s App Store is read their App Store review guidelines. Apple even released a comic book explaining the rules for Apple excepting an app. After reviewing our video, they accepted our app.

There are many different ways to create an App now. You can even pick your favorite programming language in a lot of cases. Some of these frameworks include PhoneGap, Cordova, Xamarin, Unity 3D, React Native, NativeScript and of course Apple’s CocoaTouch framework. Apple used to be restrictive on anything outside of their own tools, but they have opened up the App Store to most of these different frameworks. That being said, make sure that if you do use one of these non-Apple frameworks that you still follow their guidelines. Apple does not want anyone running compilers on the iPhone or iPad. Even if you do build your application with CocoaTouch, that does not guarantee that Apple will not reject your app.

App Completeness

Another reason Apple may reject your app is because of something they call “Completeness”. This means they do not want you publishing an app that is buggy or crashes on startup. Other things you may also want to consider is if your app requires a login, make sure your provide Apple with a login and password they can use when they are reviewing your app. If you app requires a backend service, make sure that service is turned on. Most of this is common sense, but this a common gotcha that catches some developers.


Apple is sensitive to content you put on your app. Make sure you respect the copyright and IP laws of the country you plan on releasing your app. It is also important to make sure that your app is age appropriate for the age group your are targeting for your app. They want to make sure that parental controls will work correctly. It is also important that you select the correct category for your app. If your app targets business, make sure you select that as your category.


Respect your users privacy. Don’t send data back about the users personal information without getting consent from that user. The scrutiny is amplified here if you are dealing with medical information or with children. There are also general privacy and HIPAA laws to take into account.


Using the GPS and other location based APIs on the phone can be expensive as far as battery use goes. I have had Apple reject an app update I made because they did not like the way I was using location in the background. In my situation, Apple recommended that we use geo-fencing, which is part of their location API.


This may sound trivial, but this is a common reason why Apple rejects a lot of apps, and that is because of incomplete or erroneous information supplied in the app’s metadata. I had an update rejected because we mentioned a companion app in our description that ran on a competitor’s operating system. I won’t say which OS that is now, but I can tell you it is the most common mobile operating system in the world, and it is put out by a company whose name rhymes with “foogle”.

To Summarize

The app submission process to Apple can seem onerous at times, but Apple has gotten a lot better at this now. Phil Schiller took over the part of Apple that runs the App Stores, and the review times have dropped dramatically since he took over. It used to take two weeks for Apple to approve an app. That time is now down to about a day.

Apple is about to release iOS 10 soon, so I am sure that these review times will go up again as developers race to get their apps ready for iOS 10, but the overall process seems to be a lot less painful now.

I love developing for iOS despite some of the hurdles that you have to jump through in dealing with the App Store. This should not prevent anyone who wants to develop an app for iOS from publishing on the App Store.

Dependency injection in Javascript without objects

13 Jan 2016

After programming in an object oriented way for 15 years, I am started to make the transition of programming in a more functional way with languages like Javascript and Swift. Javascript has always treated functions as first class citizens, and their is a movement in the Javascript community from developers such as Eric Elliot to never use the new keyword again.

I recently upgraded an express site from 3 to version 4. As part of that process I decided to refactor the code that called external services so they would be more testable and more loosely coupled. In languages such as Java and C# this can be achieved by using dependency injection.

In express it is actually very easy to inject functionality into a route. This can be done by either using middleware or injecting another function into a route.

var routes = require('./routes/index');

var exposeService = function(req, resp, next){
    req.service = require('./myservice');

app.use('/', exposeService, routes);

For one of the routes I needed to be able to inject two services that could be used by the route. In an earlier version of the combined service I created an object that had two properties that held references to other objects that had functions for returning the data I needed in my route. Here is how I intially wrote the service as an object.

"use strict";

// Creating function object
var Service = function Service(meetupdata, twitterdata) {
	this.Meetup = meetupdata;
	this.Twitter = twitterdata;

// Prototype function for getting the next meeting
Service.prototype.getNextMeetup = function getNextMeetup(cb) {

// Prototype function for getting the tweets
Service.prototype.getTweets = function getTweets(cb) {

// factory function for creating a new version of the object
function create(meetupdata, twitterdata) {
	return new Service(meetupdata, twitterdata); 

module.exports = create;

While this worked, it turns out there is a much simpler and more elegant way of creating this service.

"use strict";

function Service(meetupDataFN, twitterDataFN) {
	return {
        getNextMeetup: meetupDataFN,
        getTweets: twitterDataFN

module.exports = Service;

In the current version of my service I am returning an object with two functions. Not only is this approach cleaner, it is also more functional. I am also just passing in functions instead of whole objects.

I am moving my website over to Jekyll

12 Apr 2015

I have decided to move my web site off of the Orchard CMS, and to Jekyll.

Image of Jekyll Logo

If you are not familiar with Jekyll, it is a static site generator written in Ruby. I initially decided a couple of years ago that I would move my site and blog over to Orchard because it is based on ASP.NET MVC, and I am a C# ASP.NET developer. I also write web based software using Node.js, and there are a coupld of CMSs based on Node that are pretty good.

In the process of researching some of the Node based systems, I am came across a number of Node based static site generators. Most of them do essentially the same thing as Jekyll. They use Markdown for posts and pages, which I like.

I am also a fervent user of GitHub. GitHub has a very cool feature called GitHub pages. GitHub pages uses Jekyll in combination with their CI to automatically generate static content.

There are a number of advantages of using static content and GitHub pages. There is no backend database that is required to host the site. GitHub pages as hosted solution will automatically distribute the content over their servers so you get the benefit of having their infrastructure with your site. They have excellent documentation on hosting your website with GitHub pages.

TypeScript Presentation on February 26 at the JaxArcSig

07 Feb 2013

I am going to be doing the presentation this month at the JaxArcSig. The topic will be on TypeScript, which is a language based on Javascript. TypeScript essentially adds a type system to Javascript. It also allows developers create classes and modules in Javascript.

The language is being developed at Microsoft. Anders Hejlsberg is the primary designer. They have added a project type in Visual Studio 2012 where you can write TypeScript, and VS will compile TypeScript down into Javascript. You can also use the Node Package Manager in Node JS to download the compiler. The compiler is written in TypeScript.

The meeting will start at 6:00 PM at Building 500 at the Bank of America campus on February 26th. Here is a map to the location.

View Larger Map