Install μlogger on CentOS 7 Server

If you are unfamiliar with μlogger, it is a handy Android application paired with a self hosted server application to keep track of your location. Or, in the author’s own words:

μlogger (‘micro-logger’) is an application for continuous logging of location coordinates, designed to record hiking, biking tracks and other outdoor activities. Application works in background. Track points are saved at chosen intervals and may be uploaded to dedicated server in real time. This client works with μlogger web server. Together they make a complete self owned and controlled client–server solution.

https://f-droid.org/en/packages/net.fabiszewski.ulogger/

You can actually just use the app on your phone to record yourself walking, biking, flying, etc., and then save your track as a gpx file for editing or viewing on any supporting app on your phone. But, if you wanted to save your adventures easily, or keep your adventures updating live for someone you know to view, then you can use the web server application as well. It works incredibly well, and if you are out of cell/wifi range, it will update with your personal server once you return, which is very useful.

The only problem was, while it had clear instructions for installation, they were written for someone smarter than me, so it took a bit of work to get it set up on my home CentOS 7 server. Hopefully, by writing this down, others can save themselves a little bit of a headache.

First, I would like to mention that this assumes you already are running a web server on your machine. In my case, I am running the Apache web server. So, I wont cover web server installing and setup here, but there are some great tutorials for that out there, like this one.

The instructions look like this, per the README.md:

  • Download zipped archive or clone the repository on your computer
  • Move it to your web server directory (unzip if needed)
  • Fix folder permissions: uploads folder (for uploaded images) should be writeable by PHP scripts
  • In case of development version it is necessary to build javascript bundle from source files. You will need to install npm and run npm install and npm run build in root folder
  • Create database and database user (at least SELECT, INSERT, UPDATE, DELETE privileges, CREATE, DROP for setup script, SEQUENCES for postgreSQL)
  • Create a copy of config.default.php and rename it to config.php. Customize it and add database credentials
  • Edit scripts/setup.php script, enable it by setting $enabled value to true
  • Make sure you have a web server running with PHP and chosen database
  • Open http://YOUR_HOST/ulogger-server/scripts/setup.php page in your browser
  • Follow instructions in setup script. It will add database tables and set up your μlogger user
  • Remember to remove or disable scripts/setup.php script
  • Log in with your new user on http://YOUR_HOST/ulogger-server/
  • You may also want to set your new user as an admin in config file.
  • Folders .docker/ and .tests/ as well as composer files are needed only for development. May be safely removed.

The biggest headache that I ran into was that the minimum requirement was for PHP 5.5, and CentOS 7 only comes with PHP 5.4 by default. However, that was easily fixed as root:

yum update
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install yum-utils
yum-config-manager --enable remi-php55 [Install PHP 5.5]
yum-config-manager --enable remi-php56 [Install PHP 5.6]
yum-config-manager --enable remi-php72 [Install PHP 7.2]
yum install php php-mcrypt php-cli php-gd php-curl php-mysql php-ldap php-zip php-fileinfo

This updated PHP to version 7.2, so you could skip that line if you didn’t want it, but I figured it might save me from having to update it in the future, so I went with it. Note that I did have to test out my other server functions that use PHP to make sure they were compatible.

After getting PHP up to date, I then downloaded the μlogger server repository from GitHub. It is pretty small, and only took a few seconds, even on my slow 10 mb internet to download it. I extracted in place, and went to work in the terminal, moving it to my web server location and giving it the proper ownership:

cd Downloads/
cd ulogger-server-master/
mkdir /var/www/html/ulogger
cp -Rav ./* /var/www/html/ulogger/
cd /var/www/html/
chown -R apache:apache ./ulogger
cd ulogger/

Now that it is in the right place, I needed a database for it to work with….

mysql -u root -p
enter password:
MariaDB> create database uloggerdb;
MariaDB> grant all privileges on uloggerdb.* TO 'EDITED_USERNAME'@'localhost' identified by 'EDITED_PASSWORD';
MariaDB> flush privileges;
MariaDB> exit

Keep in mind, the author of μlogger only suggests a few privileges, which he states in his read me as “(at least SELECT, INSERT, UPDATE, DELETE privileges, CREATE, DROP for setup script, SEQUENCES for postgreSQL)” however, as I monkeyed around with this, the script only seemed to run when I gave my user all privileges. Not sure if that’s just me, but here’s what I did, and praise God, it worked, because I was getting a little frustrated at this point. This write-up is the end result, not the “how many times I failed setting this up” story….

Now I needed to proceed and make a copy of the config file and edit it per the instructions:

cp config.default.php config.php
nano config.php
cat config.php 

<?php
/* μlogger
 *
 * Copyright(C) 2017 Bartek Fabiszewski (www.fabiszewski.net)
 *
 * This is free software; you can redistribute it and/or modify it under
 * the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

// This is default configuration file.
// Copy it to config.php and customize

// Database config

// PDO data source name, eg.:
//$dbdsn = "mysql:host=localhost;port=3306;dbname=uloggerdb;charset=utf8"
//$dbdsn = "mysql:unix_socket=/tmp/mysql.sock;dbname=uloggerdb;charset=utf8"
// pgsql:host=localhost;port=5432;dbname=uloggerdb
// sqlite:/tmp/uloggerdb.db
//$dbdsn = "uloggerdb";
$dbdsn = 'mysql:dbname=uloggerdb;host=127.0.0.1';

// Database user name
$dbuser = "EDITED_USERNAME";

// Database user password
$dbpass = "EDITED_PASSWORD";

// Optional table names prefix, eg. "ulogger_"
$dbprefix = "";

?>

The key part that went wrong here, was that there were several examples of how to set the “$dbdsn” or database name and location. I tried the ones included in the file, but none of them worked, so I web searched and found this line worked: $dbdsn = ‘mysql:dbname=uloggerdb;host=127.0.0.1’; so that is what I used in the end, instead of any of the included examples.

Now I needed to enable the setup script:

nano scripts/setup.php 

.... edited for space ....
// This script is disabled by default. Change below to true before running.
$enabled = true;
.... edited for space ....

With the setup script enabled, it was now time to get started! I opened https://EDITED_HOST/ulogger/scripts/setup.php page in my browser, and followed the on screen instructions, logging in with the username and password I made earlier, and everything went smoothly! Keep in mind, once the setup is done, you need to delete or disable the setup script to prevent it’s future use. So I just deleted it. Here is the end result when you bring up the web page https://EDITED_HOST/ulogger/

Sorry, I blurred everything out because I didn’t want any uninvited house guests! 🙂 If you want to see a great demo of it from the author, though, you can check it out from his web server on Heroku. Here’s a screen shot of it:

The mobile app is very simple to setup. Under settings, you simply input the username, password, and URL for your web server. You can then choose if you want it to auto upload as you go, or you can update it manually by pressing an upload button on the main screen.

I thought it best to mention that the original user you make is an administrator, and can edit several settings. I recommend that you make a new user with lesser credentials (non-admin) for use with the phone app. When you are logged in as the administrator (the first account you made) you can choose to make new users. This allows you to have lesser accounts for daily logging of activity. It also is handy if you are using this for your company as a way to track drivers/workers or if you have multiple family members, because everyone can have their own username and password.

Hopefully, this will save others using CentOS 7 a little bit of time to set this up!

Linux – keep it simple.

Ship, Captain, and Crew: Ready to set sail!

Well, for better or worse, it’s finally finished! That’s right, my first, from scratch, no tutorial, 3D dice game, “Ship, Captain, and Crew” is now in Beta stage! Be sure to give it a try!

You can find all the source code here:

And you can download the Windows, Linux, and Android versions here:

Be sure to let me know in the comments if you find any bugs or have any suggestions. The game is not really for playing by oneself, although there is a player vs computer setting. However, the key point of this game is a sort of paper/rock/scissors game with your friends when you need to decide something, like who’s buying, or who gets to pick where/what/etc. next.

You can also read the official rules on Wikipedia, which my game follows. I mention this, because some play where you must roll a 4,5, then 6 for ship, captain, and crew, and others play 6, 5, then 4 instead. Either way, the mechanics of the game are the same, just which order you must roll the dice. In this game, I set it to follow the official 6, 5, and 4 rule-set.

Let me know if you tried it out!

Linux – keep it simple.

Which 3D engine to use?

Well, it’s time to pick which engine/sdk I am going to use to make my dice game.

Now the big question is what game engine to use. There may be many to choose from, but from a mobile app perspective, there seem to be only 3 that I would want to use. Of course, I’m ruling out Unity, because it is not open source. I’m trying to make an open source game, and I’d like to use open source tools so that anyone can openly tinker with it. I’m also ruling out several that work for Android, but the sdk is only available on Windows computers (irrlicht for example). That leaves the three main options of LibGDX, GoDot, Ogre, and jMonkeyEngine. There may be others, these are just the ones I know about.

Above is the quote from my post last week. I needed to do some research to decide which 3D engine and SDK (software development kit) to use to make my game. As I said, I’m sticking with open source tools, so that ruled out Unity and several other big name brands of SDK’s. I also am using a Linux computer, so it can’t be an SDK that only works on Windows or Mac. So, that leaves me with four main options that I could come up with. Obviously there are more options out there, but I’m trying to stick with ones that meet these criteria:

  1. Active development – Something that is still modern and will get updated over time, so I don’t have to learn a new SDK after I get the hang of this one.
  2. Guides and example code – I’m new to this, so I need it to have plenty of examples and guides to springboard off of.
  3. Active community – A place where I can go to ask questions if I get stuck.
  4. Easy Android integration – The whole point of this is to make an Android game, so it should be easy to get to that point.
  5. Java or C++ compatible – I don’t want to learn ANOTHER programming language just to make this game. I want to use and improve the tools I already have.
  6. Easy to use – It needs to make sense to me, or it will not work. If the API calls are ridiculous, I wont accomplish much.

So, with those in mind, I have sorted it out between my top four choices. Before I get to that, though, there are a lot of other options, but they don’t meet the above criteria, so I couldn’t spend my time on them, even though they may be great engines to use. That said, here is the breakdown of my thoughts on the top four choices, and what I plan to do. It’s not really a review, just my thoughts on what to do.

libGDX

I’ve actually used libGDX before, to make my open source game “Critical Velocity“, which was a 2D side scrolling space ship game similar to flappy bird. It does have an active community, is still being developed, and has lots of guides and tutorials and example code to draw from. It doesn’t have an SDK, you just add the java libraries to your app and use your standard Android SDK platform to build it, which is a big plus.

libGDX

The only downside is that it is made for 2D games with 3D kind of as an add on, which seems to still be under development. But, I would be familiar with it, since I’ve used it before, albeit for a 2D game. It also doesn’t have an “SDK” it is rather a library that you add to your own app.

jMonkeyEngine

There are quire a few perks to using jMonkeyEngine, it is actively being developed, and it seems to have a pretty good community behind it. There seem to be a lot of guides, documentation, and explanation of methods and classes, which is super helpful for me. It also seems to be a well fleshed out 3D engine, with a sustainable future and some neat features, most of which I am too new to understand. All the programming is done in Java, which is a plus for me, since it is a language that I am already familiar with.

jMonkeyEngine

I am not sure if I can see a downside to using this setup. It seems to be pretty solid, there are a lot of indie games made with it, and it even has book tutorials on Amazon, so this might be a good direction to go. I tried it out a little bit, and got confused right off the bat, but I’m not sure it that’s because of the interface, or because I am new to 3D game development.

Godot

Next up on the list is Godot. Hailed as “the game engine you waited for”, it seems pretty impressive. With a super permissive MIT license, an attractive interface, a visual editor, and full c++ support, this sounds too good to be open source true.

Godot

The only concern I have is that it will require some other languages as well. It seems to support c++, of which I am only a beginner, but used to. Yet it also uses GDScript as well, which is an open source scripting code they made just for this development SDK. Where I see that as a problem is it will probably only be useful inside of Godot.

Ogre

Last up is Ogre. Ogre seems to be very actively developed at the moment. So active, that it appears to have created some sort of rift between the different versions. From what I can gather by doing a little research (just my opinion based on what I saw), there is the old version Ogre1, which you can use to make Android games, and the new version OgreNext, which only works in Windows and Linux for now, with hopes of adding Android later.

If you use Ogre1, it appears to be more of a library that you add, like libGDX, but if you use OgreNext, it seems to be a full fledged SDK. So, I’m not sure about how I would want to use it.

It also appears that Ogre1 and OgreNext do not work the same, so if I learn Ogre1 to build my Android games, will I need to relearn OgreNext so I can continue with that in the future? Perhaps that’s just my perception, but my perception being my reality, I don’t think I can put in double the effort to learn how to make 3D games.

Final result

I think I am going to give Godot a try. However, if it doesn’t work out, jMonkeyEngine is the runner up. Ogre seems to be undergoing some massive changes, and I’d like to work with something that is a bit more stable, but libGDX doesn’t seem to have all the “bells and whistles”, seeing that it is just a library to add to your current development.

I struggled this week between jMonkeyEngine and Godot, but in the end settled with Godot because the interface was so intuitive. I was able to walk through a few things in no time. Literally, within minutes and without any documentation, I loaded someone else’s project and was playing a game and editing code. I am also looking to expand my c++ skills rather than work on my Java. So, Godot it is, at least, for now….

Linux – keep it simple.

Dice, anyone?

LowPolyDice

Now that I’ve completed the low poly course from Udemy, I’m ready to start using my fledgling, but newfound skills in some form of application. That said, the most fun and easiest way that I can imagine using 3D models is in some kind of game. The question is, what to make?

If you’ve been reading this blog for a while, you may remember that I once made a dice game app called “Ship, Captain, and Crew”, based on the sailor dice game of the same name. So, I’ve decided to revamp that project by creating a 3D version of the app. Essentially, I’ll be starting from scratch, but utilizing the same game mechanics that are in the first game.

The two big things I think I will need are the 3D objects and then some form of 3D game engine to render it. Today I completed the first part, which was making the dice. It took me about an hour to throw this together, but I think it will do as a low-poly die for the game. In theory, I will just use 5 of them during the game itself.

Now the big question is what game engine to use. There may be many to choose from, but from a mobile app perspective, there seem to be only 4 that I would want to use. Of course, I’m ruling out Unity, because it is not open source. I’m trying to make an open source game, and I’d like to use open source tools so that anyone can openly tinker with it. I’m also ruling out several that work for Android, but the sdk is only available on Windows computers (irrlicht for example). That leaves the four main options of LibGDX, GoDot, Ogre, and jMonkeyEngine. There may be others, these are just the ones I know about.

So, now I need to do some research and see which one will work best for me. I’ve never made a 3D game before, so this might take a while….

Linux – keep it simple.

QFIL Sahara Errors

wp-1582063069530.jpg

It sounds like some kind of desert problem, but QFIL is actually a tool that you can use to flash firmware on Qualcomm devices. I’ve made a YouTube video about using it as well as writing about it here on this site in the past. It’s a really simple tool to use, but it never ceases to amaze me at how much trouble it gives me every time I try to use it.

This time, I was trying to fix a BLU LifeXL and get it flashed back to stock. Unfortunately, after downloading the latest QFIL, it failed every time I tried to flash the firmware, telling me that “sahara” had failed:

ERROR: function: sahara_main:924 Sahara protocol error

Well, after spending a while fiddling with it, and searching the web, I found XDA post after post with people doing different things and solving their issues. Some had to unlock the bootloader, some had to get into download mode a different way, etc. But none of those helped me.

In the end, the real issue was that I needed to use an older version of QFIL. I started with version 2.7, but I finally got it to work by using version 2.0. So perhaps if you have a sahara error, you might check to see what version of QFIL you are using. I *think* that the old phone firmware was written back around QFIL version 2.0, and just wouldn’t work with the newer versions. But that’s the best I can figure of why it doesn’t work with the newer versions. It seems odd to me that you would need to know the specific version of QFIL needed for the specific phone firmware you have, but it seems to be the case.

Linux – keep it simple.

FreedomPop without Google Play Services?

Screenshot_20200218-071903

Using FreedomPop without Google Play Services? I have been tinkering with this for a couple days now, and I finally got it to work. Of course, I’ve mentioned FreedomPop on the website before, but for those who are new to it, here is a brief description:

FreedomPop is a wireless Internet and mobile virtual network operator based in Los Angeles, California. The company provides “free” IP mobile services including free data, text and VoIP and sells mobile phones, tablets and broadband devices for use with their service.

Essentially, it is a phone company that you can use to get free calling/texting/data. When they say free, they actually “mean” it. I wrote an article about how to set it up and actually use it for free. It even works in Alaska!

Now that I’ve gone Gappless, which I’ve been really enjoying, I thought I would switch my old backup phone to be Gappless as well. For the most part, it was just sitting in a drawer, but I keep a FreedomPop sim card in it, so if I absolutely ever needed it, it was available in a pinch. Unfortunately, it was easier said than done to use FreedomPop Gaplessly. And it is a toss up if you consider it “working”.

After setting up the APN for FreedomPop, I can connect to the network, as you can see in the picture, I have over three bars of signal, and I can initiate data transfer. I figured the app from FreedomPop wouldn’t work, since it requires push notifications through Google Services, but I did try the FreedomPop app anyways, as well as several older/newer versions of it, just in case. This is the main feature that is not working. Without the app, you can’t use your FreedomPop phone number to make or receive call and texts.

So for many, going Gappless would make using FreedomPop a no-go.

There are, however, lots of Jabber/XMPP apps that work great without Google Services, and I figured I could just use that, for which the FreedomPop sim card still works great. Essentially, it just becomes a LTE data device.

I did a few tests, as you can see above, and managed to pull a speed test as well as browse the internet for a minute or two. By the way, Google’s home page is 1.4 MB. Then I searched for a speed test, which brought me to 3.4 MB, and then I ran the speed test, which took me all the way up to 9.14 MB of data. It is noteworthy to mention that the phone believes it only used 8.92 MB of data thus far, so there is a disparity between the two. If you are using the free plan and don’t want to go over, you need to make sure you are careful about your limits and warnings you set on your phone.

So, I downloaded Xabber, one of my favorite XMPP messaging clients, and went to work. Sending and receiving messages seems to be in the low kilobyte range, which is great. In four messages, I only used 10 KB of data. The only problem is, that you are using data consistently because there is no push notification, so your phone is checking the server for messages all the time. This check seems to take only kilobytes, but I decided to let it run for a while and see how that went. After 30 minutes, it only used 110 KB of data. In theory, that is 5.3 MB per day, or 159 MB per month, when sitting idle.

Of course, you could only use the service when you want to use it, and most of the time the spare phone is at home or work, so there is a constant and available WiFi connection, which negates the need for any data at all. There are also plenty of apps that allow messaging and VOIP calls as well. Things like AnTox and Riot come to mind. I do think the whole service would be better with Google Services installed, so you can use the 200 free call minutes, and the 500 free texts as well, but it is nice to have it as an emergency phone option, and it is nice to know that you can use the data, even without Google Services.

Linux – keep it simple.

Still Gapp-less?

Trebuchet3

Back in July, I decided to go Google App-less, or gappless. Cold turkey. No baby steps, just quit using Google Apps on my phone. Of course, this is possible only with custom ROMs, and then I don’t install the Google Apps packages into those ROMs. I don’t want to belabor the point, but the one thing I want to say about going gappless is: I can’t even tell they’re gone.

I thought it would be a little inconvenient, or that it would be difficult to work with on a day to day basis, but the truth is, since going gappless, I don’t even notice a difference. Other than using a few different apps to do the exact same thing I was doing before, nothing has changed. Kind of makes me wonder what all those Google Apps were for anyways….

Truth be told, Google does make some great apps. But most of the time, even before going gappless, I wasn’t using them anyways. For instance, GMail is a great app, but I have multiple email accounts (because of work, etc.) and so I was using a different email app (librem, K-9, even AquaMail at one point) for all of my phone email needs.

The only big ticket item was the Play Store, which now I realize I can get just about any app (well, any app I ever needed) from F-Droid, Aptoid, or Amazon Apps. The other contender being Google Photos to store all of my pictures. Of course, if you’ve been around my blog a while, you’ve surely seen my home piwigo photo storage system, so I wasn’t using Google Photos either.

Overall, looking long term at my phone these past few months, my battery typically has a higher charge at the end of the day. Typically I was seeing around 60-65% at the end of the day, now I see about 70-80% when I get ready for bed. My data plan uses less data, usually in the 500 MB to 1 GB per month range over these past few months as well, which is a plus. Also, my phone uses about 200 MB ram to run during the day.

I’m actually not writing this to bash on Google or their apps. They actually work really well if you use them. I am writing this to answer that question that I’ve been asked dozens of times lately: “Are you still gappless? How’s that working out for you?” Truth is, yes, and I don’t even miss it.

Linux – keep it simple.

Android 10 on the XA2 Ultra!

Okay, so I’ve been playing around some more with the SODP material and AOSP 10. That’s right, they decided to stop naming Android versions after deserts and just give them numbers. Seems lame to me, but, oh well.

Either way, I did a build of Android 10 with the SODP material, and it is interesting. I’m also using the new 4.14 kernel as well, which is great to keep progressing with newer kernels.

Unfortunately, it’s not quite ready for release yet, it has random crashes and many issues at present, so perhaps I’ll go back and build Android 10 with the 4.9 kernel instead.

Linux – keep it simple.

Fix for MTP/PTP crashes on the XA2 Ultra!

One of the prevailing issues with the SODP build of AOSP was that every time I hooked up my phone to the computer to transfer files, it would cause the phone to crash and reboot. Obviously that is not very productive. I was a bit stumped and decided to join the unofficial SODP telegram group and ask if the developers there had ever seen this issue.

Sure enough, they had. Not only that, but they pointed me to a bug-tacker tool that allowed me to search issues they’ve seen before! It was a huge help! In there, I found a post by a user who had similar problems with another SODP phone. More importantly, there was a helpful response from a developer who pointed out what the issue was, and how to fix it!

It appears that the problem is the buffer size for the file transfer. All one has to do to fix it was make a simple change to the buffer size in

drivers/usb/gadget/function/f_mtp.c

Once you make the edits, then MTP works. He put together a patch, if you don’t want to hand edit them. Here it is:

diff --git a/drivers/usb/gadget/function/f_mtp.c b/drivers/usb/gadget/function/f_mtp.c
index 7692b9d86633..ddf5faedc3c6 100644
--- a/drivers/usb/gadget/function/f_mtp.c
+++ b/drivers/usb/gadget/function/f_mtp.c
@@ -42,8 +42,8 @@
 
 #include "../configfs.h"
 
-#define MTP_RX_BUFFER_INIT_SIZE    1048576
-#define MTP_TX_BUFFER_INIT_SIZE    1048576
+#define MTP_RX_BUFFER_INIT_SIZE    16384
+#define MTP_TX_BUFFER_INIT_SIZE    16384
 #define MTP_BULK_BUFFER_SIZE       16384
 #define INTR_BUFFER_SIZE           28
 #define MAX_INST_NAME_LEN          40

It’s great to have that working properly now! It’s also great to work with a team of really helpful developers, for a change.

Linux – keep it simple.

Google Apps on the SODP AOSP for the XA2 Ultra?

As you know, I’ve gone Google App-less, or “gappless”. But, for better or worse, not all of my ROM users have done the same. Typically, when you build a custom ROM, you build it without things like ROOT or GAPPS, and leave it to the ROM user to decide what they would like to install. In the case of installing GAPPS, they typically use TWRP to flash an opengapps zip file that installs all the desired Google Apps.

This is useful, because there are lots of Google Apps, and users may want some of them, but not all of them. Thus, when you install your zip from opengapps, you choose how many Google Apps you would like, pico, nano, mini, stock, full, etc., the bigger the tag, the more Google Apps you get.

Unfortunately, my SODP based AOSP ROM has an issue with Gapps. As I said, I don’t use Gapps anymore, but my users reported that they could not install Gapps. So I tried installing it myself to see what the issue was. Sure enough, it would install properly, but when you booted into the phone, the Gapps were not there! It was as if they never installed. I’d like to take credit for the Gapps resistant ROM, but it was purely unintentional.

So, this may seem counter productive, but I’ve release a build with built in Gapps as well. Since the end user can’t install it themselves, you can actually follow opengapps guide to build your ROM with Gapps included in the build. While I don’t like using Gapps anymore, I certainly want others to have the freedom to do so. The only difficult thing was figuring out which level of Gapps to include. In the end I decided with “stock”, which is less that full or all, and more than pico, nano, and mini. I figure that if you want Gapps, you probably want the standard, or stock amount of programs.

The only downside, is it makes my build almost three times the size! Believe me, it took three times longer to upload too! I think next go around, I’ll probably use mini for the Gapps level, to save myself some uploading bandwidth. I of course, still release my own builds without Gapps, for those so inclined.

Linux – keep it simple.