I'm on the developer relations team at Mozilla. The "devrel" role has many parts, but generally means communicating to developers about web technologies important to Mozilla and our mission, and being an advocate for developers in our product development process.
I spent 2017 on typical developer relations activities - coding, writing, speaking - but entirely in UTC+5 and higher timezones. I'd lived in Asia before, and learned how much presence matters in order to learn about a place, and also I wanted to reduce my carbon footprint by not flying back and forth across mega-oceans.
From a "devrel at Mozilla" perspective, I had specific reasons for doing this:
- The largest internet populations are in Asia, as well as the largest offline populations. We need to be where the users are, and where growth will happen in the future.
- It's estimated that ~90% of the world's electronics are manufactured in Shenzen, China. If we want to make a safer internet, then Shenzhen is a place we must be.
- I wanted to learn about how technology decision making is happening - by developers, or otherwise, in as many different communities in Asia as possible.
I'll be publishing a series of briefs on what I learned this year about things like mobile payment patterns and the rise of physical computing, the transient nature of mobile web task workflows, where technical decision making happens, the relationship between the web and messaging apps, cultural and community verticalism, timezone bias, app investor ecosystem, ethical echo-chambers, Chinese maker spaces, a survey of noodle soups across Asia, and more.
But first, here's my 2017 in review.
Firsts
It was a year with a few firsts:
- First keynote speaking appearances, three different events, each very different from the other.
- First time at #1 on Hacker News
- First press briefings, in Taipei and Singapore
- First modules published on NPM!
Events
In 2017, I spoke at or facilitated 22 events in 12 different countries.
I specifically chose a diverse set of events, in an effort to learn about communities of technology decision-making outside the typical web developer or open source events. I spoke to high school and university students, designers, developers, open source die-hards, startup founders, entrepreneurs, investors, device manufacturers, academics, and people in various levels and roles in governments.
Some of the speaking happened because I submitted a proposal to conference CFPs, some from events reaching out to Mozilla for a speaker, some because I reached out to the organizer asking to speak, some from just being present and offering to speak, and one because I had a drink with a friend who introduced me to another friend whose dad ran a conference and thought I'd be a good match.
- Barcamp Yangon, Yangon, Myanmar, Jan 28-29, "Virtuality Reality on the Web"
- Phandeeyar, Yangon, Myanmar, Feb 2, "Preparing for the App-ocalypse: The Web and the Age of Physical Computing"
- Code for Nepal, Kathmandu, Nepal, Mar 4, "Preparing for the App-ocalypse"
- Digital Nepal, Janakpur, Nepal, Mar 8
- FOSSAsia, Singapore, Mar 17-19, "Integrated Physical Computing on the Web" (video)
- Thailand Startup Summit, Bangkok, Thailand, Mar 31 (keynote), "Touching the Future: Merging the Physical and Digital for Creative Experiences on the Web"
- Dev Day Danang, Danang, Vietnam, Apr 16, "Preparing for the App-ocalypse: The Web in the Age of Physical Computing"
- ThingsCon Shenzhen, Shenzhen, China, May 17, "App-ocalypse Now: The Future of User Onboarding in IoT"
- Tech In Asia Singapore, Singapore, May 17-18
- CommunicAsia, Singapore, May 23-25
- WebConf.asia, Hong Kong, June 3, "Touching the Future: Designing Physical Experiences with the Web"
- HKOSCON, Hong Kong, June 9-10 (keynote), "Preparing for the App-ocalypse: The Web in the Age of Physical Computing"
- Mozilla Developer Conference, Taipei, Taiwan, Sept 22, "Designing Physical Experiences: The Web in the Age of Room-Scale Computing"
- MDN Roadshow, Kuala Lumpur, Malaysia, Sept 23, "Designing Physical Experiences: The Web in the Age of Room-Scale Computing"
- MDN Roadshow, Penang, Malaysia, Sept 25, "Designing Physical Experiences: The Web in the Age of Room-Scale Computing"
- ICMAC, Denpasar, Indonesia, Nov 16-17 (keynote), "(Em)Powering Smart Cities: Designing for Resiliency in the Leapfrog Age"
I also spoke at, designed and ran or facilitated various trainings, workshops and briefings:
- Speaker training for the Mozilla Taipei university program, Jan 17
- Facilitator for Common Voice design sprint, Mozilla Taipei, Apr 28-29
- Spring Firefox press briefing, Taipei, May 19
- Spring Firefox press briefing, Singapore, May 26
- Augmented City VR/AR Workshop, VRARA & Intel, Singapore, Jul 15
- Speaker training for Mozilla dev conf, Mozilla Taipei, Sept 20
Intent To Ship
Early in 2017 I scratched an itch I'd been having around the "Intent to..." messages on Mozilla's dev.platform mailing list, and Blink's blink-dev mailing list. These "intent" messages are sent when either of these engines is changing their implementation of the web platform. These messages are extremely useful for communication between the browser vendors - which was validated by how quickly the tweets from this account got picked up by key members of Gecko and Blink development teams, being retweeted and favorited regularly.
Now, nine months after starting the account, it has only ~1600 followers, but they are largely influencers in web/browser devrel, or web platform implementors. And the tweets from the account had 375k impressions in the last month, according to Twitter's analytics.
- @intenttoship on Twitter
- Bot source code on Github
- The bot runs on Glitch.com, with a cron.org keepy-uppy job
Feed-to-tweet is a module I wrote for easily creating Twitter bots driven by feeds
Infinite-rss is a module I wrote for generating test feeds through URL configurations
Performance
Around the Quantum launch I started some work around performance testing, digging into some low-level performance characteristics of Firefox while running the Speedometer 2.0 benchmark. It resulted in some handy cross-browser automation tooling - I implemented part of Chrome's Puppeteer API in Node.js.
Once it was easy to run Speedometer with multiple browsers and different versions, I added some measurements of things like CPU usage and disk IO. The work isn't done yet, but the most interesting learning yet is that it's beginning to look like the quantity of writes, irrespective of the amount of data, is the determining factor in performance on Mac for this particular test. More to come in 2018 on this.
- Automation scripts for cross-browser Speedometer testing on Mac
- Puppeteer for Firefox on Github
- Puppeteer for Firefox on NPM
Speech Recognition
I worked with Andre Natal to take the work done in the Voice Fill Test Pilot experiment for Firefox, and make it accessible to developers both for web and Node.js use.
Voice Fill is an extension, which uses a cloud-based speech recognition service run by Mozilla. It's a private cloud service - not connected to any type of account, and no audio is saved on our servers.
This means that developers who want to add speech recognition to their web pages, apps and devices can do so without having to buy into a cloud provider ecosystem.
I started by modularizing the extension code into a single library for web pages.
- Source is at speaktome-web on Github
- Module is at speaktome-api on NPM
I also wrote a module for using the service from Node.js in your own devices - a RaspberryPi with a USB microphone, for example. This was a fun jaunt through the various libraries that deal with mics and recording and codecs and I only cried a little bit. But it works pretty well now, so time well spent.
- Source is at speaktome-node on Github
- Module is at speaktome-node on NPM
WebExtensions
I've been writing browser extensions for Firefox since 2005, and in 2017 Mozilla made the biggest change in how extensions are written since they were initially added to the browser: The WebExtensions API. It's a change that sets the stage for Firefox to be much faster and safer while still being customizable. I spent some time migrating some of the extensions I'd written that I just couldn't live without, and also doing some experimentation with making new browser APIs and a few more experiments.
- Tab hiding: The tab groups extension needs an API for hiding and showing tabs, so I wrote an experimental version of that API.
- Dormancy: Once the tab.discard API was implemented, I ported Dormancy, an extension that unloads the web content in tabs after five minutes of not being used. Source code on Github, AMO listing
- Peek: An experiment in quick access to web content without breaking the user workflow. Source code on Github, AMO listing
- Tab Statistics: Extensions for showing different statistics about how you use tabs. It is implemented as a single extension, but since WebExtensions only allows a single menu item per extension, I listed four different versions on AMO, each showing a different piece of information. Source code on Github
- Force Google Locale: Detect your locale, and add it to Google URLs. Source code on Github, AMO listing
- Vim Keybindings: HJKL navigation on web pages. Source code on Github, AMO listing
- Always Right: New tabs in the same place all the time forever. AMO listing, Source code on Github
Miscellanous Projects
- Web and Messaging: Research exploring how the web and messaging apps can play together. Research on Github
- TreeViewSortable: An extension for the Atom Editor for sorting the file tree in different ways. Source code on Github
- Twitter Inline Oembed: Embed Tweets in a single line of code in your blog posts. Source code on Github, On NPM
Writing
While I had a few posts that I really liked and were successful, I really thought I'd write more this year, and am disappointed by how little I managed to publish. I have a huge number of partially completed posts in my drafts folder. I need to create a habit of flexing the writing muscle regularly.
The big traffic post was about my absurd number of tabs. I did some basic performance testing across a bunch of versions of Firefox, which showed dramatic improvements in startup time even with more than 1000 tabs. I really didn't expect such a response - #1 on HackerNews (537 comments!), coverage by loads of mainstream tech news outlets like ZDNET, and pretty massive comment thread on /r/programming.
- Jan 11 - Infectious Ideas: Scaling the Physical Web (Medium post)
- Jan 31 - Barcamp Yangon 2017: Technology, Community and the Largest Unconference in the World (Medium Post)
- Mar 28 - FOSSAsia 2017 (blog post)
- Jun 12 - Trust, Lies and Fitness Wearables, for ThingsCon's State of Responsible IoT report
- Jul 06 - A-Frame Quickstart for Augmented City (blog post)
- Jul 12 - Augmented City - VR (blog post)
- Jul 20 - Augmented City - Singapore (blog post)
- Jul 21 - The New Firefox and Ridiculous Numbers of Tabs (blog post)
- Aug 08 - The Secret of Flow State - Productivity for Busy People, for SuperYesMore's Human in the Machine series
- Sep 21 - Always Right – An Extension Migration Story, for Mozilla Hacks