Triplebyte Entry Level Quiz [Part 2 in series]. 80th-100th percentile, no externship

On June 3, 2020, Triplebyte announced their new Externship Program for students who lost their internships from the COVID-19 problem. These Externships aren’t as well paid as actual internships, but their remote, about ~6 weeks or so in length, and not a bad way at all to gain experience.

In the last article, I passed the Triplebyte Generalist quiz with 60-80th percentile, and “failed” the FastTrack on-site program with 40th-60th percentile in a 2-hour-long automated interview. For this Externship program, you get to take the new “Entry-Level Generalist” quiz instead of the full Generalist. I decided, why not try it? If it had been available in January 2020, I probably would have taken the Entry-Level version instead of the Full version.

So, even though I passed the Full version quite well, I took the Entry-Level quiz for Software Engineering. Holy smokes.

This image has an empty alt attribute; its file name is entrylevel.png
This image has an empty alt attribute; its file name is entrylevel2.png

I absolutely more-than-qualify for the entry-level Externship program, and Triplebyte sent me the application form immediately. So, that’s fun. I’ll see what happens.

Update: Despite my high score, Triplebyte informed me that they could not find a match this cycle. That’s disappointing. 🙁

I passed the Triplebyte Quiz, but failed the automated review

A few months ago, I was browsing the internet and saw one of those many adds on Reddit for a service called Triplebyte. You’ve probably seen them all the time on programming websites (they are fairly aggressive in advertising everywhere it seems), and their pitch is fairly simple. “Just take the quiz, pass the interview, and you are ‘fast-tracked’ to the final-round of onsite interviews with major tech companies.” With Apple and other companies on their list and being bored for the day, I figured, why not try?

I ultimately decided to take the standard Generalist quiz. (This is not the new Generalist Entry-Level edition quiz which came out recently and what I would now have taken instead.) It was a boring New Year’s Day when I took it, and then…

I did unexpectedly well. I even got a 3/5 for Academic CS, despite having never having taken any CS courses in high school or college. I guess reading all of those programming books and reading Hacker News enough taught me enough Academic CS concepts to pass.

Despite passing that quiz very well, I was nervous about taking an in-person interview. Furthermore, my college studies got started again and I didn’t need a job immediately, so I waited a while. Then COVID-19 struck and my college eventually ended for the semester. Triplebyte switched from online interviews to an “automated interview” system, which turned out to be basically a much longer, more complicated, 2 hour quiz. The results were less good but still impressive for my age and non-academic background:

As you can see, the categories for the more rigorous, 2 hour test were much different than the shorter introductory quiz. There was no “Coding Productivity” or “Algorithmic Knowledge” categories on the prior exam. It said I mainly lost because I didn’t have the strong understanding of algorithms required, though I wasn’t that surprised by this. After all, Academic CS has to mean something in the real world and you can’t really implement algorithms from math by reading a programming book from the library.

Even though Triplebyte said they wouldn’t be taking me because I simply wasn’t “exceptional” enough, I was still a solid performer, and they said they think I was ready for everyday web engineering roles. If you read about my analytics programming, that probably helped a bit.

What I really wish I could do instead of that would be to try my hand at the new “Entry-Level Generalist” exam instead of the “Generalist” exam I took and passed. It would be interesting to see how good I would be at that one. I’m still glad to have gotten this far in the exam. People far smarter than me have failed. I have emailed Triplebyte Support to see if they will allow me to take something just a bit easier. In the meantime, I think this validates my skill at least a little bit. 🙂

Trad Catholic Media Analysis: Part Two

My first post on the decline of various Catholic media outlets got a little bit of attention, as well as some good criticism. Namely:

  1. What about some more niche but still popular websites, like Rorate Caeli, or Barnhardt, or
  2. Could you balance out the data from Alexa (known to be egregiously inaccurate on occasion) with data from other estimates, like SimilarWeb, so as to get a more accurate estimate?
  3. How are some other, non-blogger websites doing throughout these events, such as the SSPX website?

In this post, I shall try to answer those questions, with a new round of research. First, I will research the old round from part one on other websites to see if the Alexa analytics hold, and then I will inspect the following websites:

  • (Taylor Marshall’s group)
  • (Sedevacantist, I believe, but still interesting)
  • (Also Sedevacantist, but still interesting)
  • (Alexander Tschugguel’s group)

As well as some of the more “mainstream” Catholic media to see how they are fairing specifically, such as:

  • National Catholic Register
  • National Schismatic Reporter (Fishwrap!)
  • Catholic Answers
  • (Lesser known but I read it a bit once, and it was awful! Fr. Z would lose his mind over some of their NCReporter-level antics. Just read their Wikipedia for a taste!)
  • (Fishwrap 2.0)
  • (because why not?)

Hey Alexa, how does the first set rank?

This is a really interesting image. From Alexa’s perspective:

  • Patrick Coffin doesn’t rank at all. He also owns, but that also doesn’t rank.
  • Everyone suffered a decline around the same time as in Part One, and it mostly remains flat to today except for, (dun-dun-dun) and Which are, as far as I am aware, are both sedevacantist or sedevacantist-leaning. They saw a big uptick. Hmm…
  • Alexander Tschugguel’s Boniface institute is half a year old, has no activity on their website, and doesn’t rank at all.
  • New St. Thomas Institute got some activity going once in a while, and then flatlines for a while for it to happen again.
  • Barnhardt is kind of hard to see, but she’s the pink line that is behind many of the other lines. She suffered a decline at the same time as everyone (again), yet is actually going up again.

Pure traffic statistics in the US:
Global Rank689814179387039447387351428173460642033795647624
Global Reach7.00E-070.0000447.30E-074.30E-075.3E-060.00000172.00E-077.30E-07
Global Pageviews2.90E-082.06E-062.50E-086.60E-081.90E-070.000000077.20E-093.30E-08
Rank in [US]2313643047911997316318117150470877255818

And your obligatory traffic sources:

And the obligatory fascinating bubble map:

Okay, fascinating. Kind of weird that SSPX and New St. Thomas are in the same bubble and so far away from, but it’s all estimates here. Fr Z and OnePeterFive are in the same bubble like before with CatholicFamilyNews and Church Militant. I guess the “bubbling” depends on the level of density and sites you set. In this case, because the SSPX is so different than Barnhardt and, it makes the differences between viewers of 1P5 and CM look smaller my comparison, so they share a bubble. But what about outside of Alexa? What about SimilarWeb?

SimilarWeb is a service like Alexa, and it provides data that covers the same general topics as Alexa. However, SimilarWeb can be very different than Alexa. This depends heavily on where they are getting their data from. For example (and I don’t know these specific details for a fact): If Alexa gets some of it’s data from an Internet Service Provider (ISP) in NYC, that can be very different than if SimilarWeb bought their data from an ISP in MN. Or if one has a browser toolbar to get their data while the other weighs different datasets higher, the results can be different.

What is important to know about SimilarWeb and Alexa is that popular websites are generally much more accurate than smaller websites. Smaller websites, as a rule of thumb, are much harder to rank than popular ones. Because some of the websites I’m talking about are considered “small,” both Alexa and SimilarWeb can screw up royally when trying to come up with their estimates. Still, if we put them together, we can still get a good idea of where things are going.

There is a big reason I didn’t use SimilarWeb the first time. SimilarWeb only sells the full version (with the 3 years of data) to Enterprises, and does not even offer the option of a trial. It’s just “Contact Us” or use the free, 180 day data with no ability to directly compare websites. Still, I’ll try.

To help make the reference easier, here is the same graph from Alexa, but over a 180 day span (like SimilarWeb) instead of 3 years:

I was going to do a direct comparison, when I noticed an immediate flaw. See if you can spot it yourself.

The Alexa graph was for the Alexa ranking, which basically means that it believes this website is the #X most popular website in the world. The graph on SimilarWeb is for Total Visits, which is a very different metric and one that Alexa doesn’t try to keep track of nearly as much. Because the two graphs are for completely different criteria, the two cannot be directly compared.

What we can compare though, is the global rank for today. Unfortunately, this doesn’t give much for a trend, but at least it will be accurate.

#WebsiteAlexa GlobalSimilarWeb Global,814#371,467,938#14,425,944#182,356,735In Database, but N/A,817#360,813,064Error – Not in database,033,795Error – Not in database
boniface-institute.comN/AError – Not in database,624#231,876
patrickcoffin.netN/AError – Not in database,313,302In Database, but N/A

What can we glean from this? It’s clear that SimilarWeb has much less data than Alexa does, or at least makes less assumptions. And for everything except, it tends to place most websites much higher. However, based on the increased amount of “Error – Not in database” messages I had compared to Alexa, this means that SimilarWeb might have far fewer websites in-between levels, meaning the difference between rankings might actually not be so drastic when you consider all of the possible missing websites in between.

When you rank them, you get some surprisingly different and yet similar results:

# of websiteAlexaSimilarWeb

And that, ladies and gentlemen, is why it is important to consult multiple sources if you want more accurate data. Remember though that the Alexa data in the last post was over a 3 year period, whereas this ranking is only valid as of today, 4/28/2020, because SimilarWeb won’t sell their data to anyone who isn’t an enterprise.

Do I trust SimilarWeb more? Some people do, but a BIG NO from me. SimilarWeb was missing data on many of the websites, and not just missing data: For four of the websites entered, it told me they didn’t even exist. And, for two more websites after that, it said they existed but there wasn’t enough data. Alexa always knew every website I entered existed, but told me there was not enough data for three of them.

Some of you might be seeing the above numbers and thinking that this must render my last article pointless. That is not the case. Both Alexa and SimilarWeb struggle tremendously when ranking these “small” websites (you have to remember that it is ranking hundreds of thousands of non-Catholic websites in the mix too, which is why Google is #1.) How does SimilarWeb compare to my results in Part 1?


  1. LifeSiteNews (#27,556)
  2. National Catholic Register (#93,531)
  3. Church Militant (#97,799)
  4. The Remnant (#285,071)
  5. OnePeterFive (#476,753)
  6. Taylor Marshall (#545,025)
  7. Fr. Z (#706,751)
  8. Canon212 (#2,262,969)


  1. LifeSiteNews (#29,680) – Pretty close to Alexa
  2. National Catholic Register (#42,355)
  3. Church Militant (#58,778)
  4. Fr. Z (#193,171)
  5. OnePeterFive (#263,572)
  6. Canon212 (#273,566)
  7. The Remnant (#286,052)
  8. Taylor Marshall (#353,319)

As you can see, they are both struggling to figure out who’s more popular. However, like I said before, I trust SimilarWeb’s “ranking” less than Alexa because SimilarWeb was completely unaware some of the websites I entered earlier even existed. I do think that some of the results from SimilarWeb are more logical though (see Canon212). All estimates, and less popular websites are less accurate. I wish I could truly compare SimilarWeb’s data more than this, but unless SimilarWeb opens up to individuals and makes a ranking history chart, it’s not happening.

Okay, enough moping about SimilarWeb’s lack of a free trial and public data compared to Alexa. What about mainstream Catholic news?

Well, that’s interesting. Many of them saw a decline as well, but not as severe as trad media did. Something is clearly wonky with America Magazine though, as that looks… wrong. Were they trying to manipulate Alexa? (I say this half in jest and half in seriousness). You can see it actually raises to the full height on the very far left. Weird.

  • Leading up to October 2018, EWTN had a significant decline, but it’s recovering.
  • Looks like many had a bit of a drop in October, but not catastrophic. And people are rising up again, and recovering, except for Crisis Magazine which is heading downward starting in March…
  • It’s hard to see, but the National Schismatic Reporter rose quite a bit after October. It’s growth mirrors that of the liberal Commonweal and the more conservative CrisisMagazine, although Crisis’s growth didn’t last as long. Looks like it drove people to both sides of the argument (orthodox and heretical).
Global Rank93683586504442411057037607655062721065359320503611404
Global Reach0.0000090.000010.0000167.1E-060.0000220.000012.5E-060.0000173.3E-060.00006
Global Pageviews2.90E-071.21E-061.09E-062.50E-070.0000017.00E-078.30E-085.70E-071.30E-073.95E-06
Rank in [US]274172078211846199141014424779148991168898670517166

It’s kind of interesting how this graph lines up to what these websites actually do. Spirit Daily is an aggregator – they don’t publish articles, so they get little search traffic and lots of direct traffic. Right above them is Catholic Answers (, which is almost all search traffic and little direct (which makes sense for what they do).

The bubble graph below is fascinating, and it lines up to exactly what one would expect.

There’s actually a few interesting correlations in this graph. ties into Commonweal Magazine. Both have a liberal bent, and Mark Shea is a big First Things fan and has been known recently for his very liberal view of Catholicism. America Magazine is incredibly close, like directly next to, National Schismatic Reporter. Once again, due to the Zoom level, some websites that would be in their own bubble are forced together, like OnePeterFive next to Crisis Magazine and Church Militant. (The difference in bubbles is so great that it forces less-different websites together even if they would typically have a bubble of their own. is very different than Church Militant, but CM is less different than 1P5, so they go together even though they have different crowds).

Current rank is:

  1. (#11,404, down 1,171)
  2. EWTN (#37,607, up 16,058)
  3. Catholic Answers (#44,424, down 3,482)
  4. America Magazine (#53,593, down 13,002)
  5. National Schismatic Reporter (#58,650, down 8,352)
  6. New Advent (#65,506, up 8,693)
  7. National Catholic Register (#93,683, up 1,538) – Was at #93,531 in last article, went up 152 since yesterday
  8. Spirit Daily (#110,570, up 21,258)
  9. Crisis Magazine (#205,036, down 29,973)
  10. Commonweal (#272,106, up 175,523)

Commonweal, which you’ve probably never heard of is growing. And it absolutely must be stopped are we’ll have a third fishwrap on our hands. (Fishwrap is a term invented by Fr. Z to refer to National Catholic Reporter aka National Schismatic Reporter. Recently, America Magazine and Commonweal are writing like they are fishwrap too.)

Compare those global rankings with SimilarWeb for today, 4/28/2020:

  1. (#10,188)
  2. EWTN (#16,132)
  3. Catholic Answers (#19,557)
  4. America Magazine (#40,887)
  5. National Catholic Register (#42,355)
  6. National Schismatic Reporter (#60,557)
  7. New Advent (#72,181)
  8. Spirit Daily (#86,899)
  9. Crisis Magazine (#174,098)
  10. Commonweal (#249,901)

Notice that this time, only the National Catholic Register changed order between the two websites. Like I said, bigger websites are easier to rank then smaller ones like ours. Still, when did good people allow the National Schismatic Reporter to become so strong? It must be destroyed – and we need to keep a lookout on Commonweal. Alexa thinks it is rising, and even if that isn’t true, we need to keep a sharp eye on this new National Schismatic Reporter / America Magazine hybrid.

UPDATE: Semi-confirmed by Rorate Caeli.

Trad Catholic Media Analysis: The decline, analyzed

Before I start – I am not a theologian, a book writer, a YouTube commentator, or anyone special within the Catholic media sphere. However, if you have been following traditional Catholic media for a while, you will almost certainly seen arguments about the SSPX, their legitimacy, and its various (supposed) scandals. The disagreement has divided many popular “Trad Inc.” commentators, and there are now questions as to whether those fermenting the divide have financial interests. Here’s a quick recap:

Well, those are definitely interesting messages, but considering the fact that I have actually programmed analytics systems (hire me) and have used analytics before, I figured it would be an interesting afternoon to find out what financial interests there may be. I can’t get to the bottom of whether the SSPX is right or wrong, but I can probably assist the conversation with information showing whether there are financial interests or not.

So, where do I start? The graph from the top tweet actually comes from a service called Alexa, which is owned by Amazon (and not Trackalytics, which just buys Alexa data). This is not the same Alexa that powers those smart speakers. Amazon actually owns two Alexas: The smart speaker one, and a data and web traffic analysis company. This Alexa buys traffic data from Internet Service Providers and repackages it for web development agencies, who pay $299/mo. for the privilege of using that data. This data is certainly not perfectly accurate, and any numbers provided should be taken as just an estimate.

I do freelance web programming and analytics work, and so I signed up for a trial of Alexa to get some information. Who are the most popular commentators? And, what is the popularity graph for those commentators? And, what websites do listeners of these commentators visit most often? And other questions of the sort. Anything interesting that Alexa could give me, honestly. I decided to start out with the elephant in the room, Church Militant, and expand to other commentators.

This is a 1-year graph of Church Militant’s worldwide internet rank. Basically, how popular is the website worldwide? Google is #1 at this, YouTube is #2, Facebook is #3, etc, all the way down to Church Militant’s 1 year peak of #60,376. This rank is not perfectly accurate, and I don’t know quite what the margin of error is. Church Militant’s current rank is #97,799, which is a major rank drop from June 2019. That peak in March, before the SSPX fight, was #79,181. Still a massive drop in rank.

If you aren’t shocked enough by that downward trend, take a look at the 3-year graph. It gets worse for the ranking:

The peak was around #43,715 in November 2018. Remember, it is now #97,799. This does not mean that Church Militant has only half the traffic, it just means that they are much lower in the list of most-visited addresses. It is safe to say though, that Church Militant has significantly less traffic than previously, and that doesn’t help when you just did a studio expansion.

However, this isn’t the beginning of what looks like a worrisome image for Church Militant. This is a graph of where Church Militant gets most of their viewership from:

As you can see from this graph, Church Militant gets roughly ~84% of their viewership from users who directly enter the URL into their address bar. This means that the massive drop in rank cannot be solely attributed to, say, Google and Bing demoting the website. Church Militant does not have a strong social media presence, getting only ~2.5% of website traffic from social media posts and 5% from links on other websites. Only ~8% of Church Militant’s traffic comes from search. This is especially notable considering Church Militant’s large numbers of paying subscribers, and it is logical to assume that almost all subscribers visit Church Militant directly. Thus, a drop this large in viewership may certainly correlate with a drop in paying subscribers, but only Michael Voris could confirm this. Remember, these are just estimates from Amazon Alexa, and only Church Militant has access to certifiably accurate numbers.

Church Militant has declining viewership, and so the SSPX story is all about saving money, right, or repositioning brands? It’s a little more complicated than that. Almost every Catholic trad media outlet has a similar trajectory.

As you can see from the graphs, just about everyone except the Remnant is suffering right now, but if you look at the overall graph, some are definitely hit more than others. I am not sure what caused the December 2017 drop within Patheos. Remember that these graphs are not quite as they appear: The difference between #100,000 and the #1,000,000 lines is 10x, not 1x. Also remember that Alexa rank does not correspond to viewership. It just means that Alexa believes this website is #X more/less popular worldwide.

As you can see from the three-year graph, Church Militant and National Catholic Register are actually neck-in-neck with each-other in popularity, weaving in and out and around each-other. You can see the bump in the October/November 2018, and a large decline around October/November 2019, with the Amazon synod. 1PeterFive was most impacted (yellow) and makes the Church Militant decline look like nothing in comparison. LifeSiteNews shot slightly up, Fr. Z took a bit of a tumble, and Taylor Marshall and The Remnant actually didn’t move much downward at all by comparison. The Remnant in the last month has actually shot up significantly, defying the downward trend.

Another data point is the traffic metrics for the last three months (the only range available for these “high-precision” numbers). Blank fields have no data available.

SiteGlobal Rank (now)<- Over last 3 months Rank in Country (US)Global Reach % Over last 3 monthsGlobal Pageviews %Over last 3 months 
churchmilitant.com97,799Down 12,997 24,2780.00072%Down
onepeterfive.com476,753Down 154,074230,2350.00011%Down
complicitclergy.com1,805,619 0.00002% 9.3e-7% 
ncregister.com93,531Up 2,05229,3330.0009%Down
wdtprs.com706,751 165,8490.000078% 0.0000022% 
lifesitenews.com27,556Down 5,6195,3760.0027%Down
taylormarshall.com545,025 0.0001% 0.0000034% 
patheos.com9,905Down 1,0862,6030.00712%Down
canon212.com2,262,9690.00002% 5e-7% 
remnantnewspaper.com285,071Up 183,083166,7970.00022%Up
From Alexa Internet

As you can see from the numbers, Church Militant pageviews are down 23% estimated in three months, which is massive. OnePeterFive is down 28% in three months, also massive. The Remnant is having a breakout last three months, with more than 70% more pageviews in the last three months. Great news for Michael Matt! [Full disclosure: Michael Matt lives, like, ~20 miles from me and I actually see him time to time at church, but I have never met him.]

And with that, the most powerful (Alexa ranked) Catholic blogging websites are, at this time of publication (4/25/2020):

  1. LifeSiteNews (#27,556)
  2. National Catholic Register (#93,531)
  3. Church Militant (#97,799)
  4. The Remnant (#285,071)
  5. OnePeterFive (#476,753)
  6. Taylor Marshall (#545,025)
  7. Fr. Z (#706,751)
  8. Canon212 (#2,262,969)

I think what is also important to consider when looking at the above numbers is the question, Where are these sources getting their traffic from? Church Militant gets 84% directly. With other websites, it’s very different. Here’s the full graph:

These percentages are for the last three months, Alexa doesn’t keep such detailed information for long. As you can see, Church Militant is a very weird anomaly with it’s unparalleled 84% direct traffic. That may be driven by the subscribers, but a loss of subscribers would also correlate with the drop in traffic after the synod and the SSPX debate?

I decided to look more at anything else Alexa could give me. I discovered a tool called Audience Overlap, and for those actively in the debate, the connections are frighteningly realistic. With # of sites set to a little over the default #50 (and Patheos removed, because that’s like every religion in one), we see a very interesting set of groupings that I believe may be the most important image in this post:

Data from Alexa internet [CLICK IMAGE TO OPEN LARGE]

This is a graph as to what visitors of a bolded website tend to visit most often, visualized into thought bubbles, with the distance between them indicating the frequency of overlap between viewers. Some very interesting details can be brought from this:

  • Church Militant and LifeSiteNews viewers go together, apparently. This is generally an Anti-SSPX, Pro-TLM crowd. Church Militant has also done stuff with Live Action and the Daily Wire, which surprisingly shows.
  • National Catholic Register floats around with other, popular, sometimes heretical papers, such as America Magazine, National Catholic Reporter, and Commonweal.
  • Taylor Marshall’s viewership don’t read National Catholic Register much, but instead love visiting reference sites like, USCCB,, and CNA.
  • The more SSPX-friendly crowd is a bubble of it’s own with Fr. Z and the Remnant, but it has a bit of overlap with the leaning-benevacantist crowd, such as Canon212, Catholic Family News (blocked by Church Militant, remember), and even the official SSPX website.
  • Remember that the image above is made from estimates from web traffic. Alexa doesn’t know the content of the websites or what is going on at all: It just knows that people tend to congregate around the shown websites based on their web traffic patterns, which is fascinating.

So that’s all interesting stuff. What about YouTube? What’s going on there? Websites are only part of the story, right? The best we have for this information is SocialBlade, which archives YouTube data to help advertisers determine trends.

To avoid confusion, be aware that when SocialBlade shows a percentage, that’s in comparison to the previous 30 days. So if you see, say, 500 new subscribers in 30 days, down ~20%, it means the month earlier you got 600 new subscribers in 30 days and are ~20% down in comparison to last month.

Starting off, they are looking great, until you remember this is only 30 days.

Has Church Militant been losing subscribers or video views on YouTube? Nope, they are doing fine and gained after the Amazon synod. What about the breakout star online, The Remnant?

Michael Matt has been doing great! Just look at that 68% video viewership growth in 30 days and 200%-greater-than-average subscriber growth! What about Taylor Marshall?

Slow and steady, but at the same time, doubling the amount of new subscribers you are getting each month is a great statistic. Doesn’t look like the SSPX feud hurt him much, even if he is stagnating a bit. What about his former friend, Timothy Gordon? This is where things look worse.

His channel is younger, that must be remembered, but his channel is stagnating. He hasn’t lost viewership, but he’s gaining viewership comparatively slowly and the amount of new subscribers he’s getting each month is going down, which you wouldn’t exactly expect for his previously higher-profile status in Catholic Trad Media.

So, back to the beginning again? Are there financial motives for the SSPX feud? Well, Canon212 and Fr. Z, who are SSPX-friendly, are declining in viewership. On the other hand, SSPX-friendly Remnant has grown the most. Taylor Marshall is doing fine, but Timothy Gordon’s channel just isn’t taking off as much as it should be. The Anti-SSPX Church Militant hasn’t taken a major hit, but has definitely gone way down in viewership over the last year or two, which is not great right after you finished an expansion campaign. Are there financial motives? Who can say, as there are winners and losers on both sides. Look at the data, and think about it yourself a bit. Think about it over coffee. Read and re-read. Maybe Church Militant, or 1P5, or any of these groups will release official, guaranteed-accurate numbers to disprove this article, but I don’t count on it. And of course, popularity doesn’t determine truth. I wish I could write a happier or more journalistic ending to this post, but I’m only a college student, not a reporter. (Again, I’ve programmed analytics systems, that’s my realm of knowledge. If you liked this, hire me or take a look at other stuff on my website.)

NEW! Read Part Two →

My Homelab: Part One

I was browsing Barnes & Noble about a month ago, and while I was there, I bought Wendell Odom’s CCNA 200-301 Official Cert Guide, Parts One and Two. It wasn’t really a career choice: I had the books for CompTIA A+, Network+, and Security+ on my shelf already, plus plenty of Raspberry Pi and Arduino books. I didn’t know much about networking (the CompTIA Network+ book is the most neglected book on my shelf), so I figured I might as well learn something about networking.

After downloading Cisco Packet Tracer, well… Cisco Packet Tracer is fun, but I prefer learning in a hands-on environment. I built my desktop computer in 2016 when I was 14, and I learned quite a bit during that project. I have the collection of eight Raspberry Pi computers on my desk thorough which I learned Linux (1, 2, 3, 3+, 4 2GB, 4 4GB, Zero, ZeroW) and the Arduino Uno from 2011, through which I learned the basics of the C programming language. With some spare money in my pocket, why not learn with something physical? I have plenty of Ethernet cables in the closet…

My initial impulse was to open up eBay and start looking for Cisco routers and browsing on r/Homelab. What I didn’t immediately realize was that the CCNA 200-301 had only come out about a month or two earlier, and it requires Cisco IOS 15. Fortunately, I realized the difference between IOS 12.1 and IOS 15. Most of the r/Homelab guides and videos (particularly this one from only a year ago) advised buying some Cisco 2621s and 2950s because they are cheap and plentiful. What they failed to mention was that with the new unified CCNA certificate launch, knowledge of IOS 15 is required and these older recommendations from only a year ago only run IOS 12.1.

In the end, I purchased 3x Cisco Catalyst WS-C3560G-48TS-S. I could have also done some 3750s, but I was happy with this one as it came with power cords, bezels, and console cables. The 3560 has 48 ports, some variations (such as this one) support IOS 15, it has 10/100/1000 Ethernet, and it is only about $50 per unit. Also, it is a Layer 3 switch, meaning that it can be configured to take on most (but not all) of the functions a separate Cisco router would have. The general advice online is to get at least 1 router and 2 switches, and so to have one device which can do almost everything is excellent.

The package comes tomorrow. My Serial->USB adapter comes on Saturday (delayed Amazon Prime because of a certain pandemic), and my desktop 8U Rack mount on Friday. This will be interesting.

As for the rest of equipment that I have right now: I have the homebuilt computer from 2016 (it’s still got 16GB RAM and an i5-6500), Original Prusa Mini 3D Printer, piles of books, the 8 Raspberry Pis, 2 Arduinos, Intel Edison Board, Ti Launchpad, piles of other odd equipment that came with the hardware raffle, MacBook Pro and iPad, and a Netgear AC1750 router that I flashed with OpenWRT. It’s a good beginning.

If you are looking for more information on what to buy for Cisco routers, this impartial guide was very valuable.

My longest-running project (2016-present): LMS analytics system, Part One

When I was 14, I was a happy homeschooled kid in a devout Catholic family, and I had been taking classes for two years from Homeschool Connections. I was quite ahead, doing 10th grade work and mathematics (Algebra 2, if I’m not mistaken). This was before homeschooling became more popular after the COVID-19 pandemic.

Between being homeschooled, having many siblings, and having a surprising amount of free time, I had been experimenting with BuddyPress and WordPress for almost a year. Before Homeschool Connections, I had taken classes at a now-defunct online school which had a messaging system, but it was shut down due to it having no moderation system. While most students were generally well-behaved, the occasional undetectable incident forced the closure of that system in my old school. With my technical mind, I wondered how I could share my knowledge and learn from other students in my new school.

I set up a simple BuddyPress website, spent a long time perfecting it, and presented it to the president of Homeschool Connections. Though interested, it wasn’t the highest priority for him. Instead, he had a very different thought. His company has a subscription-style business model, similar to Netflix, Coursera, or Pluralsight. You pay your $30 (now $35) a month, and in return you get unlimited access to their catalog of courses. Unfortunately, it was very difficult to know how to pay teachers accurately or fairly long-term. A recurring royalty would have been ideal, but there wasn’t a good way to figure out what royalties were owed, or what courses and teachers got the most attention. He contacted Moodlerooms, his learning system hosting provider, but they wanted “an arm and a leg” for the service.

We sketched out the general idea together: Every time a student clicked on a course, this would be tracked as a view and sent to a database, which had the names of each course, what category the course belonged to, and the name of the teacher instructing the course. With this data, we could then find out the total views the teacher had, by adding up all of the views for the courses that the teacher instructed. Every view would be timestamped, to allow analysis over a specified time period. With this information, you could get a pretty good percentage of how much website traffic was to courses taught by a specified teacher, and this could be used as a factor in figuring out what royalties to pay.

I got to work that very day in the language I knew best: PHP 5.4. Yes, a 14 year old writing PHP 5.4, which has a reputation to this day for being an unusually poorly-designed language, even if it was fairly easy to learn. But, hey, it was a project, and I got to work immediately. In those days, I didn’t even know or care what these things called Version Control Systems were. If I wanted to add a new feature, I copied the folder holding my code and worked on that. If I didn’t have a backup and managed to screw up my code royally, I’d spend up to an hour fixing my code until it ran again. I used Bootstrap 3 as my front-end, because why not? You’ve got to start somewhere.

Eventually, I ended up with a ridiculous amount of files, most of it boilerplate. My code wasn’t very secure, or pretty, or well-documented, and had wildly inconsistent variable names. Despite looking atrocious in the backend, it worked, and the frontend looked pretty good for 2016. If I did anything technically right, at least I used PDO to keep my database somewhat safe.

I don’t have any screenshots surviving that I could find of what it initially looked like, even though I remember taking a few. Maybe they are on a backup hard drive somewhere? I did, however, manage to get the latest and last version of Tracker 1.13 running on my laptop with a little tweaking to the source code. It wasn’t meant for PHP 7 and it will let you know quite clearly.

So, with that, the administrators could easily see what courses were getting viewed the most, and what teachers should get the most (or least) royalties. You might be slightly curious about how I implemented this without using a Moodle plugin.

The company was, at the time, on Moodlerooms, and they didn’t allow community or unapproved Moodle plugins without a very expensive code review. It was part of the deal that there needed to be some way to figure out what courses were getting most viewed without needing an expensive plugin.

I’m not going to share my full technique, but basically, the admins created a “parallel” copy of all courses within my program. Every time a course was added to Moodle, it was added to my program as well. I then used some JavaScript within Moodle’s theme which scanned the URL a user clicked on for a course ID. If it found one, it added a view.

My database wasn’t exactly pretty, but it was functional: There was a table for every course, and in each table was a row for date and views on that date.

Adding up the views for a teacher was simple and slow: Just open up the table for every course the teacher taught, and add up the views for all of those courses, and repeat for every teacher. I didn’t know how to do good caching either, so my initial implementation could take a good ~30-60 seconds to process on a good day.

Even though the code looked atrocious and was difficult to fix, the company was impressed and I sold it to them for what was, in my estimation, a significant amount of money. Even though it was slow and had awful code, it worked and was actually almost bug-free. Other than a bug with timestamps after a year rollover, the company never contacted me about any major bugs: “It just works!” They did have some ideas for improvements though such as Excel exports, which I quickly added using a library. (Those were another thing I hadn’t known about. My initial version didn’t have any composer dependencies! Handy things, libraries!)

My program ran for about 2 years in production without fail. I sold them my program just after my 15th birthday, but I was learning so much about how to do things better that it didn’t age well in my mind. Even though the company didn’t really care, I was learning better ways to do almost everything.

Shortly after my 17th birthday, I discovered Laravel and Laravel Nova, and I was hooked.

Part Two coming soon, and revisions to this article “Secure Everything” Hardware Box – Part Three: The MT3620 becomes an Arduino

If you haven’t read parts one and two of the series, I’d suggest reading them for some background. Long story short: I won a raffle and got a box of assorted hardware from in a contest from a Microsoft/AVnet collaboration. The deal was that over 20,000 people (including myself) received an AVnet Azure Sphere MT3620 development board to try to make something interesting with.

See the source image

And, well, sadly, my C/C++ programming skills in the embedded space are almost nonexistent (unless you count Arduino as C). I kept the board online for the 15 days to win the Raspberry Pi, and won the raffle though, so I have definitely got the better end of this deal.

After getting my hardware though, I noticed something quite interesting: This board has a Grove connector and two mikroBus slots. Previously, I didn’t have any devices which used Grove or mikroBus to test with. But now, with a Relay mikroBus Click Board and a whole box of Grove sensors, I wondered if there was, perhaps, a better way to program the MT3620.

It turned out, with some digging, that there was a better way to program it for my purposes. A programmer named Georgi Angelov (aka @Wiz-IO) released a mostly-complete port of PlatformIO to the MT3620. PlatformIO’s basic goal is to add support for multiple ecosystems (Arduino, ESP, Linux) to multiple boards (Arduino, Raspberry Pi, Adafruit Feather). There are obvious incompatibilities (your Arduino isn’t going to support the Linux ecosystem), but it is still a neat attempt at cross-platform embedded programming. By porting the AVnet board with the MT3620 to PlatformIO, it could be possible to write Arduino programs and run them on the dev board.

Of course, I was hooked and began digging through his code. It’s sadly not a complete PlatformIO port, and it hasn’t been updated in a while. Furthermore, it appears (please pardon me if I am mistaken) that English is a second language to Angelov, and so some of the documentation is difficult to understand and is not as clear as it could be. He also has no screenshots of the install process. That didn’t stop me from doing what I could with his code.

I started by installing PlatformIO into Visual Studio Code. It looks quite interesting, no matter what board you are using:

The Avnet MT3620 development board is sadly not one of the officially supported 700+ boards yet. That’s where Angelov’s port comes in. I had to install it manually into PlatformIO, but that was shockingly easy. PlatformIO just lets you paste in a GitHub URL, and it will automatically fetch the custom board information. (I wish all development tools could do stuff like this.) If you are following along, be aware that the original port requires some lines of code to be changed to work on the newer SDKs.

Once installed, you should see something like this:

If you click on the examples tab, you should see this:

Click “Import,” and PlatformIO will soon give you a path to a folder containing the code. Open that folder within Visual Studio Code, and open the src/main.cpp file. Admire it’s Arduino-like syntax:

However, we aren’t out of the woods yet. The SDK platform installs for Azure Sphere has significant issues with the AVnet development kit. This can be fixed according to the Install Notes (which are actually for 19.10 SDKs and higher, not just that particular SDK) with the following instructions:

  1. Close Visual Studio Code. It might overwrite files we’ve changed.
  2. Open the folder C:\Program Files (x86)\Microsoft Azure Sphere SDK\Tools in a File Explorer window.
  3. Open the folder C:\Users\YourUserName\.platformio\packages\tool-azure\azsphere in another File Explorer window.
  4. Select all items in the first folder with CTRL+A, and then drag the items into the PlatformIO folder, while holding down the CTRL key to Copy instead of Move. If File Explorer asks you what to do with duplicates, choose Replace.
  5. Close both windows.

The next step is to open the folder C:\Users\YourUsername\.platformio\platforms\azure\builder\frameworks in a File Explorer window. Open the file and look for this block of code:

See the last lines of the highlighted area? Replace image with image-package and package-application with pack-application as the comments indicate. It should now look like this:

Save and close.

Open up Visual Studio Code again, click the PlatformIO Sidebar rail, and chose “Upload.” If all goes well, it should run the Blink sketch on your MT3620! Please be aware that even though Angelov lists Serial as supported (and has it working on video), I have not managed to get Serial communications to work on any COM port in Windows.

There are some immediate differences with this Blink sketch and the regular Arduino Blink sketch though. The first is the #include <Arduino.h> at the top of the file. Because Arduino is technically based on C and is a (very large) C library, we are importing that into our code. The second thing you may notice is that the code already knows what GREEN_LED, BLUE_LED, and RED_LED are. These are defined in the board variant file, which includes definitions for board-specific variables:

The third, and last thing to notice is that I am setting the LEDs that I want to turn on to LOW, and the LEDs I want to turn off to HIGH. What gives? Well, it’s a quirk with the onboard LEDs on the AVnet board itself. This doesn’t happen with external LEDs. For the board’s onboard LEDs, 0/LOW is on and 1/HIGH is off. This quirkiness is not unique to the Arduino on MT3620 components. This happens even in the Azure Sphere example sketch, which I’ve customized slightly to make the point:

Looking at my example derived from an official example, it would appear that this would turn the LED off for two seconds and on for one second in a loop. Nope. Because LOW is on and HIGH is off for those onboard LEDs, this actually turns the LED off for one second and on for two seconds. So, it’s not Arduino-specific, it’s just the onboard LEDs on the AVnet board in general. Weird. If anyone has any ideas why this is, let me know.

Back to the board though. Now that I had the RGB LEDs blinking on the board, I looked at my Relay Click board. How hard could it be to get running on the MT3620?

MikroE Miscellaneous Relay click front

This relay click board will snap perfectly into one of the two sockets on the MT3620. I opened up the relay’s product page and ran to the pinout diagram.

So, for the left side relay, I need to turn Pin 3 to high to activate the relay. For the right side relay, I need to activate Pin 16 to trigger the relay. But hold on: This is on the Relay board itself. The pins have completely different from the Arduino’s perspective: The pins certainly aren’t the same if you plug the board into, say, Socket #2 instead of Socket #1, or vice versa. How do you find the correct pins?

After some searching, I found the official datasheet for the AVnet MT3620 development board. And it’s right in there:

Looking back at the Click board, I need to activate Pin 3 / CS to activate the left side relay, and Pin 16 / PWM to activate the right side relay. The module name for the left side pin is GPIO34_CSA1_CTS1, and the module name for the right side pin I need is GPIO0_PWM0.

But, alas, I’m not done yet. Every Azure Sphere program has a app manifest, and this app manifest lists every capability your program (or in this case, sketch) has. It’s kind of like a permissions system for Android or iOS. It looks like this in your folder:

Right now, I have GPIO pins 8, 9, and 10 allowed, which are the three onboard LEDs. Using the module names, I know that I need to allow GPIO pins 34 and 0. You may notice the odd “PINX-GPIOY” format. I have no idea what the “PINX” value is for, and it’s not consistently changing with the GPIO value either. We want to match the GPIO value. This is where that avnet_aesms_mt3620.json file (also available here) comes into play. It includes a list of all possible permissions for the board.

For pin 34, I need to add AVNET_AESMS_PIN25_GPIO34 to my app manifest. For Pin 0, I need to add AVNET_AESMS_PIN5_GPIO0 to the manifest. My final manifest looks like this:

With all of that permissions work doing, it’s time to try controlling the Relay click board from the MT3620! Open up main.cpp and let’s add a bit of code to control our relays:

Upload, and with that, I’ve built a relay metronome!

Awesome as this is, there is one little bug: When a new pin is initialized with pinMode(), that pin is automatically set to HIGH, resulting in both relays being turned on until the code turns one off. I’m not sure quite why this is, but it means that the relay momentarily turns both relays on. I just follow up my pinMode() calls with a simple digitalWrite() call to take care of that.

So, what do I have so far? An MT3620 with the ability to package Arduino sketches to run on it, and a working Relay click shield. What about a Grove module? There’s a Grove connector just sitting there. And not just any Grove module with a single-wire signal: A Grove module which uses I2C.

I immediately reached for the best I2C Module in the Grove box: The RGB Backlit 16×2 LCD display. For that module, there is an Arduino library, which I extracted into a convenient libs folder in my sketch.

After this, I had one major problem: the build process couldn’t find Wire.h, which is a pretty common library. Odd. Just as an experiment, I tried downloading a new copy of Wire.h online and putting it in the libs, but it didn’t work. After some researching, I found that PlatformIO comes with a working Wire.h and Wire.cpp in the C:\Users\YOURUSERNAME\.platformio\packages\framework-azure\arduino\libraries\Wire\src folder. It is supposed to be included in the build path, but PlatformIO shows that it is in the build path already, so I am not sure what’s going on. I copied the wire files from there into the root directory of lib and my build succeeded!

I then got excited and immediately wrote some code to do an RGB blinking sequence on the LED, with the RGB onboard light and relay working together.

I uploaded it… and it didn’t work! After some thinking, I realized I forgot to add I2C permission to my app manifest.

With that out of the way, I clicked “Upload” and… well, the RGB Backlight was flashing, showing that I2C sensors were completely workable with Grove! Alas, I made one major oversight: The LCD module needs 5V, whereas the MT3620 provides only 3.3V (as most Grove sensors need only 3.3V, the LCD being the exception to the rule). As a result, even though the backlight works, the LCD could not display any text when I tried due to not enough power. I had a similar issue on the Edison board, so this isn’t a communications problem.

Ladies and Gentlemen, there you have it. An MT3620 development board running an Arduino sketch on a Linux-based OS from Microsoft, controlling a mikroElektronica Relay Click board and an I2C Grove LCD Display. Of course, the possibilities could go on a long way from here. There are definitely disadvantages to programming your MT3620 this way: It’s unfinished, some things like Serial don’t work, and you can’t accept or send many important system calls (i.e. your app can’t receive warnings of an incoming update or reboot, for example). Still, being able to program the MT3620 like an Arduino makes prototyping much easier than writing C++, and I can’t wait to see what I will use the MT3620 for in the future. “Secure Everything” Hardware Box – Part Two

I finished off with getting both the Intel Edison, Grove Kit, and Ti Launchpad running quite good, but there were some rough edges and more things to discover.

Starting with the Intel Edison: I discovered that the Arduino IDE comes with a huge collection of Intel Edison sample sketches.

I immediately went to WiFi(Edison) > SimpleWebServerWifi. I entered my network info into the sketch and changed the LED from the default 9 to 13 (which is the onboard LED). I tried loading in the IP Address that was printed out in the Serial Monitor, but no connection. I went back to my research and found that the Edison contains an Edison configuration service that uses Port 80. I don’t know the full repercussions, but you’ve got to have some risk in life, and so I disabled that service:

systemctl stop edison_config
systemctl disable edison_config

And with that, I discovered that the Intel Edison is powered by systemd, all the way back in 2016 (when this last release was published, though it probably ran systemd since launch in 2014). It isn’t the happiest systemd though, reporting that it is running in a degraded state. The Edison also has PulseAudio, apparently.

So, with that out of the way, I restarted my sketch, and…

… it worked exactly as it should have, with the LED responding to my web server commands. The code for having the Arduino literally run a simple web server on the Edison is shockingly clean, because the Edison actually pretends to be the official Arduino WiFi Shield:

  WiFi Web Server LED Blink
 A simple web server that lets you blink an LED via the web.
 This sketch will print the IP address of your WiFi Shield (once connected)
 to the Serial monitor. From there, you can open that address in a web browser
 to turn on and off the LED on pin 9.
 If the IP address of your shield is yourAddress:
 http://yourAddress/H turns the LED on
 http://yourAddress/L turns it off
 This example is written for a network using WPA encryption. For 
 WEP or WPA, change the Wifi.begin() call accordingly.
 * WiFi shield attached
 * LED attached to pin 9
 created 25 Nov 2012
 by Tom Igoe
#include <SPI.h>
#include <WiFi.h>

char ssid[] = "yourNetwork";      //  your network SSID (name) 
char pass[] = "secretPassword";   // your network password
int keyIndex = 0;                 // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;
WiFiServer server(80);

void setup() {
  Serial.begin(9600);      // initialize serial communication
  pinMode(9, OUTPUT);      // set the LED pin mode

  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present"); 
    while(true);        // don't continue

  String fv = WiFi.firmwareVersion();
  if( fv != "1.1.0" )
    Serial.println("Please upgrade the firmware");

  // attempt to connect to Wifi network:
  while ( status != WL_CONNECTED) { 
    Serial.print("Attempting to connect to Network named: ");
    Serial.println(ssid);                   // print the network name (SSID);

    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:    
    status = WiFi.begin(ssid, pass);
    // wait 10 seconds for connection:
  server.begin();                           // start the web server on port 80
  printWifiStatus();                        // you're connected now, so print out the status

void loop() {
  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("new client");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c =;             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        if (c == '\n') {                    // if the byte is a newline character

          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {  
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:    
            client.println("HTTP/1.1 200 OK");

            // the content of the HTTP response follows the header:
            client.print("Click <a href=\"/H\">here</a> turn the LED on pin 9 on<br>");
            client.print("Click <a href=\"/L\">here</a> turn the LED on pin 9 off<br>");

            // The HTTP response ends with another blank line:
            // break out of the while loop:
          else {      // if you got a newline, then clear currentLine:
            currentLine = "";
        else if (c != '\r') {    // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine

        // Check to see if the client request was "GET /H" or "GET /L":
        if (currentLine.endsWith("GET /H")) {
          digitalWrite(9, HIGH);               // GET /H turns the LED on
        if (currentLine.endsWith("GET /L")) {
          digitalWrite(9, LOW);                // GET /L turns the LED off
    // close the connection:
    Serial.println("client disonnected");

void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.println(" dBm");
  // print where to go in a browser:
  Serial.print("To see this page in action, open a browser to http://");

Now for the second issue I’ve noticed when using the Edison. Let’s say you have automatic starting of the sketch (from Part 1) turned on. If you edit your sketch on the Arduino IDE and start it, the old auto-started sketch and the new sketch will end up running simultaneously, which will make things quite… interesting, but not exactly fun.

I haven’t figured out an elegant fix for this, but my solution so far is to use the Linux top command to find the process ID of the auto-started sketch, and then kill that process before uploading new code.

In this window, the sketch is process 241. I then just run kill 241 or whatever number in the command prompt to stop the auto-started sketch. I only need to do this when I plug in the Edison after a reboot to upload new code with the IDE. Maybe there’s something I’m missing?

This brings me to my biggest discovery. The Yocto Poky image for the Edison is old. 2016 old. Linux 3.10 old. Some engineers have created an auto-building branch system for much more up-to-date, unofficial images for the Edison at and . These images are, well, unofficial, not necessarily reliable, may break things between releases, and you have to build them yourself on a Linux machine or VM. However, considering the speedily disappearing information about the official release and the fact that the new firmware is 4 years newer, I can put up with that, but I don’t have a Linux dual-boot system at the moment, so I’m going to put that on hold for things to try someday. You may feel differently.

I then looked at the 3D Magnetic Sensor, TLE493D A2B6. Apparently, it has a Cortex M0 processor which could be theoretically programmed, but I don’t really know how this can be done, and the programming language would probably be quite difficult. This sensor works by measuring magnetic force in all three cardinal directions from a small, nearby object (the very small magnetic cube that comes in the box). There’s a neat 3D printed demo of this with a GUI for Windows to demonstrate this:

Neat as that is, I don’t really feel like 3D printing the parts for that demo, even though I have a Original Prusa Mini on the desk. It just doesn’t seem like the best use of plastic. Instead, I got digging and on page 27 of 30 on the sensor datasheet is the link to an Arduino library. I really don’t have any uses for the sensor at this time, but just knowing how to attach it to the Arduino or the Edison greatly improves my odds of using it in the future. (I’m noticing a pattern about how almost all of the equipment I’ve gotten in these boxes can be connected or turned into an Arduino one way or another.) They say that the sensor doesn’t work in “low-power mode” with that library, but I’m looking at the sensor and wondering how much power it would normally draw, especially considering it’s running on regular USB. The library also has convenient links to the datasheets and other sensor information.

In other news, it took a while, but I finally found the MOSFET datasheet. The model is IPT60R028G7. I initially didn’t know what to do with this device, but was stunned to see that it cost $15.80 each on Digi-key, so this was no average MOSFET. I contacted’s Jessica Tangeman to ask what it was for, and it turns out it is a very powerful MOSFET. She sent me a link to all of the amazing projects that could be built with it, and also mentioned some reasoning behind the part selection:

Check out some other projects with the MOSFET – it’s incredibly powerful.

And yes, it’s the old Intel Edison. They don’t sell them anymore and there are a lot of hardware collector fanatics out there so once the hardware boxes hit the $ value mark, we decided to throw in some extra things for fun.

And, there you have it. I’m still figuring out what I’ll probably build with it, but for now I’m keeping that MOSFET safe and don’t want to lose it!

Read the epic Part Three “Secure Everything” Hardware Box

Several months ago, the “Secure Everything with Azure Sphere” contest concluded. I didn’t win any prizes, but unexpectedly, I received an email saying that I was one of 20 winners for a box filled with “miscellaneous hardware” worth up to $200. I did not remember signing up for this raffle (neither did other contestants), but I was happy to get the hardware. About a month and a half later, the box showed up at my doorstep with the following parts:

  • Intel Edison with Arduino Breakout Board
  • Grove Starter Kit: IoT Edition
  • Ti Launchpad MSP-ESP432E401Y
  • Avnet SmartEdge Agile with Brainium
  • 3D Magnetic Sensor 2Go TLE493D A2B6
  • mikroBus ClickShield with unsoldered headers
  • Adafruit extra-length Arduino Shield headers
  • MikroElektronika Relay Click Board

I had predicted that some of the parts would probably be stock clearance, and Googling some of the parts, it appears that this is somewhat the case. The Intel Edison was discontinued in 2017, the Ti Launchpad is still for-sale (but has a 2017 copyright date on the box), and the Grove IoT Edition was built for the Edison (more on that later). Other parts, like the SmartEdge Agile are new, and the 3D Magnetic Sensor appears quite recent. This blog post is going to be a long guide to everything I learned about these parts in about 24 hours to save you the research if you are using any of these parts in your kit.

Naturally, I first opened up the Edison and plugged the module into the Edison board. It looks like a really powerful Arduino (and indeed has Arduino-compatible headers).

After putting the hardware together, then it came time to research how to get it to do something. I didn’t know much about the Edison, so I got researching and found some useful general information:

  • The Intel Edison runs an Intel x86 processor, running at 500mhz, running an OS called Yocto Poky Linux.
  • The board can be programmed using the Arduino IDE, including the latest release, as an Arduino.
  • The board oddly requires two microUSB cables for programming and flashing. One impersonates a 750MB flash drive for some reason, while the other shows the debug and Serial interface.
  • The barrel jack is Arduino-compatible. I used a 12V 2.5A adapter from a wireless router until I discovered the included one.

My first initiative was to set up the board using Intel’s guide, which sadly is significantly out of date. The main problem is that Intel’s Easy Setup tool was broken due to broken download URLs, which makes the whole setup process unnecessarily difficult. Here’s a rough list of what I did, and all instructions for Windows 10 1909.

Firstly, download IntelEdisonDriverSetup1.2.1.exe and run. This will set up the USB Drivers, even if Intel’s Setup tool won’t recognize it (more on that later).

Secondly, we need to update the board’s firmware. The following instructions are a simplified version of Intel’s instructions. Download the latest Yocto Poky image for the Edison. Unzip to a folder. Next, go to this address and download dfu-util.exe and libusb-1.0.dll, and place them in the same folder as the unzipped Poky image.

Chose the “File” menu in File Explorer, then choose “Open in new PowerShell window.” Run the following commands:


This will flash the latest firmware, which will take several minutes.

Example of running the flashall script
Image from

Now that the board is updated, you need to download latest Edison Configuration tool and run. First, make sure the Edison is fully connected like the image below:

This installer is partially broken, as it will not detect the USB drivers you set up earlier. However, it will present a window which looks something like this:

Of course, on your window, the password won’t be set and the board won’t be online. Paradoxically, the installer will be able to set up your password, SSH, and networking for your Edison despite saying that it isn’t detected and doesn’t have USB drivers. 🤷‍♀️ So, obviously, set up your network, password, and enable SSH, then exit the installer.

Now, open the Windows Device Manager, and look under COM/LPT. You should see something like this:

Make a note of that COM numbers next to USB Serial Port and Intel Edison Virtual Com Port. In my case, it’s COM7 and COM4, but yours may vary. Close Device Manager.

Now, download and install PuTTY. This will allow us to login to the Yocto Poky OS installed on your board. Open PuTTY and make the main window look something like this:

Replace the Serial Line option with whatever number you found for USB Serial Port, which in my case should be COM7 (though I typed COM4 incorrectly in the screenshot). Click Open. You will see an empty black window, this is normal. Press ENTER and you will see a login prompt. Sign in with the username root and the password you set earlier. You will now have a Linux command prompt.

This will come in handy later. For now, we want to program this thing like an Arduino. Download and install the latest Arduino IDE, and open it. Go to Tools menu > Boards > Boards Manager, and install the Intel i686 Boards package.

Next, choose Tools menu > Boards > Intel Edison. Then, under port, choose the port that you wrote down for Intel Edison Virtual Com Port. This is not the same port as you used earlier! That was the USB Serial Device port, this is a different one. In my case, it should be COM4. Finally, choose File > Examples > Basics > Blink.

Choose Upload. If everything goes well, your Edison’s onboard LED will begin blinking. Happy to have made it this far?

From this point, you should check out the Edison examples underneath the File menu, as there are examples for Ethernet, microSD cards, and other unique Edison functionality. But I soon ran into a problem. Due to a glitch with the latest (and last) release, Arduino sketches don’t automatically run when you reboot the Edison! Time to fix that, using more thorough instructions based on Intel’s defunct guide.

Using the PuTTY window, enter in the following commands (except for the stuff in <>s):

cd /etc/init.d
<PRESS the S key on your keyboard>
exec /sketch/sketch.elf /dev/ttyGS0 /dev/ttyGS0
<Press the ESC key on your keyboard>
:wq <ENTER>
<You should be back at the prompt. If you made a typo, press ESC and type :quit! to exit without saving.>
chmod +x /etc/init.d/
update-rc.d defaults

With those commands, the sketch should automatically load on boot. One problem I have not solved is that the sketch, when running on power and not connected to the computer, will freeze after exactly 5 minutes or 300 seconds. There are some online forum postings about this (use Google), but I will update this page once I get that fixed myself.

With that, the Edison is fully set up and ready to be used like an Arduino. It’s time for the Grove Kit!

The Grove kit: IoT edition was actually designed for use with the Intel Edison using a program called the Intel XDK. The Intel XDK looked like an impressive piece of software when it was available: It let you easily write smartphone apps which could react to the sensors that were attached to the Edison. This was all built in, and if you browse around in the Edison PuTTY window, you can find evidence of this with the multitude of files with “xdk” in the name.

 Intel® XDK
Image from

Alas, Intel shuttered the XDK in 2017, and I actually could not find any copies of the XDK online. All I could find were a few dead XDK installers which didn’t work due to broken links. So, I had to make do without the XDK, and wondered how one could use the Grove kit with the Arduino IDE.

It turned out easier than I had anticipated. Grove is well supported within the Arduino ecosystem, and so I could control each sensor using just the IDE and some libraries, which the Arduino IDE can easily install.

After some browsing (it was surprisingly hard to find this page), but I found the SeeeD Wiki for the Base Shield V2. It contains the code and diagrams for wiring together a simple circuit which uses a buzzer and button. It’s an excellent read, and the only change needed to the guide is that instead of using the Seeeduino (a Chinese Arduino clone), just use the Edison!

enter image description here
Image from

I was surprised that after you snap on the base shield, you can just directly access some simple sensors without using any library:

const int button = 2;       // connect a button
const int buzzer = 3;       // connect a buzzer
void setup()
    pinMode(button, INPUT); //set button as an INPUT device
    pinMode(buzzer, OUTPUT);   //set LED as an OUTPUT device
void loop()
    int btn = digitalRead(button); //read the status of the button
    digitalWrite(buzzer, btn);

The button is in slot 2, the buzzer in slot 3. Despite all of the pins and complications of the Base Shield, there’s no library needed for these simple sensors. What about something fancier though, like the included LCD?

For that, a library is needed, and it’s really best to just look up the part exactly as named on the Seeed Wiki. For the LCD, that’s available here.

The are only two things I’d add to the wiki: The first is that the wiki shows how to download the code from GitHub and add it to the IDE. This works, but there’s a simpler way. Go to Sketch > Include Library > Library Manager, and then search for “Grove.” Simply find your sensor in the list (in this case, the Grove LCD library) and choose Install. After that, just copy-paste an example sketch and try it out.

The second thing I’d add is that the Base Shield V2 comes with a voltage switch for 3.3V or 5V, and is set to 3.3V by default. The LCD and some other sensors require 5V, and so the LCD is blank (even though the backlight is illuminated) if the switch is on 3.3V. That had me confused for a while.

So, overall, that’s the Intel Edison and Grove Kit. I haven’t got to the mikroBus shield yet or the Relay Click board, but I assume that if it’s for the Arduino Uno, there’s probably a good library for it.

Time to shift gears: What about the Texas Instruments Launchpad board? To be honest, I had no idea what to do with it. I first installed the MSP432 SDK, then the Code Composer SDK. I used the On-Demand installer, chose “Custom Install,” and installed only the MSP432 components.

After installing these essential components, I opened up Code Composer, and tried reading Texas Instruments’ guide to making a Hello World program, but… it’s a mess for a hobbyist. It’s like C++, and it’s really, really complex. If this was a professional system, it would be great, but it’s just absolute overkill for almost any hobbyist.

Image from

Upset, I started looking for anything simpler and found out about Energia. Energia lets you program the Ti board like a really fancy Arduino, and I was instantly sold. I downloaded it and tried it, and… it didn’t work.

It turns out that my board, the Ti MSP432E401Y, isn’t really supported correctly by Energia without some hacking. Using a pile of forum posts, I’ve figured out what needs to be done.

First, download the latest Energia release for Windows. Open Energia, and then choose Tools > Board > Boards Manager. Install the MSP432E Ethernet Red Boards package and the Energia TivaC Boards package. Close the Boards Manager.

Next, open File Explorer and navigate to the following address:


Edit platform.txt by replacing the contents with the code at my GitHub gist:

(I’ve also filed a Pull Request to fix support for the MSP-EXP432E401Y in Energia, but no telling when it will get merged.)

Finally, open Device Manager again, and find the COM port for your Ti Launchpad. The Launchpad oddly has two COM ports, one main and one auxiliary. Both, I believe, should work.

Going back to Energia, change the Board under the Tools menu to Launchpad /w MSP432E (120mhz), and the COM port to your Launchpad. Click the “Open” button, go to “Examples > 10.Multitasking > MultiBlink.”

Click Run, and if luck is on your side, the code will run on your Ti Launchpad. You will notice that three LEDs will be flashing on the Launchpad different rates. One will be flashing 5 times per second, one twice per second, and one once per second. This is a neat demo of the Launchpad’s abilities: It’s actually three separate sketches, each with the similar code to the standard Arduino Blink example, running simultaneously! Each tab in the sketch pile runs simultaneously with the other tabs. Awesome!

And after all of that, I think that is the end to this unnecessarily long blog post. I didn’t touch the Avnet Brainium system, or the Click Shield, or figure out what the MOSFET is for, or the Magnetic sensor, but I hope that this will help those who received the kit to get started and to make some great projects. 🙂

Read Part Two