Documenting VVV’s governance model

Earlier tonight I submitted a first draft of VVV’s governance model for comment by the community. This is one of those times as an open source software maintainer where you realize you’re doing something that should have been done a long time ago.

See also the time we added a license 1.5 years in 😅

As I started researching how one goes about documenting a governance model, I ran into “Planning for Sustainability“, from OSS Watch. At the bottom of that document are a few time estimates to help you project the level of effort in doing this all. They’ve marked 30 hours to “understand the different governance models” and create the document (from a template).

I kind of laughed at first, especially because VVV is not that big of a project. But here I am after 2 days of on and off research and documentation, probably somewhere about 6 hours in, thinking that they aren’t so far off.

It’s easier for VVV because it is (IMO) a fairly clear benevolent dictator model. I’ve led the project for 5 years and have relied on active members of the community for input throughout. I can imagine this being near impossible for larger projects where the project structure is less clear.

Of course, the benefit of spending so much time researching is parsing the great information that’s available thanks to years of others’ successful and failed attempts.

Here’s a walkthrough of some material I’ve found useful, along with commentary.

First, I’m happy to have run into the “Open-source governance” Wikipedia article early in the process. This does not directly describe governance for open source software, but instead the political philosophy of a community editable legislation. This helped set the tone in my head that my intent should be to document a clear explanation of how the project is managed rather than just a brief overview of my assumptions.

Next, all of the OSS Watch documentation was very useful. I spent some quality time with “Governance Models“, “Roles in Open Source Projects“, “Meritocratic Governance Model“, and “Benevolent Dictator Governance Model“. I almost used one of the provided templates, because it’s nicely open sourced as CC BY-SA 4.0, but decided to go completely custom.

I explored the models used by other other open source projects. In the process, I studied those from NodeJS, WP-CLI,  and Ubuntu among other random finds I stumbled on through GitHub’s search. This process taught me that not nearly enough open source projects provide a statement on governance. WP-CLI in particular inspired the inclusion of the project administration section so that clear documentation existed on server and domain management.

I also spent some time with some hard copies. The “Project Structures and Ownership” page from Homesteading the Noosphere was useful in wrapping my head around the word “benevolent dictator”, a term that I still don’t really like. And Producing Open Source Software is always so valuable. I went back again and again to “Benevolent Dictators“, “Social and Political Infrastructure“, “Choosing Committers“, and “Writing It All Down“.

My favorite phrase of the process comes from that last section:

living reflection of the group’s intentions, not a source of frustration and blockage

This sums the process up. A documented governance model is a document of intent, one that can be changed as the project matures, and it’s meant to provide a clear way for work to happen rather than a roadblock.

I’m looking forward to seeing what the community thinks!

What’s the right USB-C to HDMI adapter for a Dell XPS 13″ 9350 running Ubuntu 16.10


When I first got my Dell XPS 13″ 9350 (Developer Edition), I needed an adapter so that I could power an HDMI display via the laptop’s USB-C port.

After poking around for a few minutes, it seemed like the DA200 USB-C to HDMI/VGA/Ethernet/USB 3.0 adapter was the right choice. It works with plenty of Dell XPS laptops and says things like “USB-C to HDMI” in the name of the adapter.

I was wrong!

I have no idea why I was wrong, but thanks to the answer on this Ask Ubuntu post, I learned that the DA200 is not exactly what it claims to be. The only way this adapter actually works with a 55″ TV or similar is at 800×600 resolution. Definitely not what you expect when connecting HDMI.

After reading that post, I purchased the Apple USB-C Digital AV Multiport Adapter. It has only a 2 star rating on the Apple site, but it worked immediately and powered the 55″ TV as expected over HDMI at 1920×1080.

Hopefully this post helps make it more obvious via Google that the DA200 is the wrong adapter and the Apple USB-C Digitial AV Multiport Adapter works great!

Things I learned (or broke) while trying to fix my wireless in Ubuntu 16.10

I’ve had a series of strange issues with my Dell XPS 13 9350 DE under Ubuntu 14.04, 16.04, and now 16.10. Bouncing around between versions has helped some things, but this strange wireless issue seems to have followed me around.

Everything works just fine for X amount of time and then the wireless will just drop.  In my /var/log/kern.log file (or via dmesg), I’ll see something like this:

wlp58s0: disconnect from AP 58:6d:8f:99:8b:f4 for new auth to 58:6d:8f:99:8b:f5

Just in case I missed it, that message will generously repeat every 2 minutes or so. Sometimes nothing noticeable happens, other times my connection will break and I’ll have to restart the network manager service.

I spent some time today digging into the issue. I’m not sure that I actually fixed anything, but I at least learned a few commands and want to save links to a few helpful sites.

FWIW, my laptop has an Intel 8260 rev 3a wireless adapter, but these commands should help in general troubleshooting as well.

sudo lshw -C network

lshw is “a small tool to extract detailed information on the hardware configuration of the machine.”

This gave me some cool information like the product, vendor, and firmware version of the wireless adapter. The firmware version listed when I started was 21.302800.0, which didn’t make any sense when compared to the list of iwlwifi drivers maintained on

sudo iwlist scan

iwlist, combined with “scan”, provides  a list of in range access points. I didn’t really use this much this time, but it does help show what wireless frequencies other nearby APs are using.

uname -r -m

uname prints system information. This isn’t entirely useful for troubleshooting wireless issues, but is an easy way to get your kernel information. I didn’t know this command until recently, so I’m putting it here. See also: uname -a.

dmesg | grep iwl

dmesg displays “all messages from the kernel ring buffer”. There’s a term.

This is probably the most useful command. It showed me what firmware linux was trying to load for the wireless adapter, what failed, and what succeeded.

[ 8.687719] iwlwifi 0000:3a:00.0: Direct firmware load for iwlwifi-8000C-22.ucode failed with error -2
[ 8.690891] iwlwifi 0000:3a:00.0: loaded firmware version 21.302800.0 op_mode iwlmvm

There was a lot more than that, but I was able to see that it was attempting to load 3 wrong versions of the firmware and then successfully loading a very wrong version of the firmware.

modprobe -r iwlwifi; modprobe iwlwifi

I removed the “wrong” versions of the firmware from /lib/firmware/ and ran the modprobe commands to first remove the loaded module and then re-add it again. I confirmed through dmesg that the “correct” firmware version was loaded.

The worst part about all of this is that it’s still happening. So I guess it may not be a firmware issue, but some kind of hardware thing. The list of “platform noise” issue on the iwlwifi page is probably where I’m going to focus next. I changed the channel on my router once, but I may be able to dig deeper on that.

Update (an hour later): Things seem to be more stable after finding a more open 2.4Ghz channel. I also found what seems to be a maintained list of core releases for the iwlwifi drivers. That led me to what should be the latest mainline version of the 8260 driver that I need. After making iwlwifi-8000C-22.code available and running modprobe, the correct driver (22) was picked up and installed.

Update (Jan 8, 2017): The problem is definitely back, even with all of the fixes above. I’m starting to wonder if it’s partially the fault of my router as I’m always able to get to the router admin interface, just not over anything that requires DNS. Today I disabled IPv6 on the wireless adapter and set a static IP address with static DNS. We’ll see how that holds up!

Update (Jan 8, 2017): Disabling IPv6 didn’t matter at all. I did find a new piece of the puzzle though. Ubuntu’s Network Manager uses dnsmasq by default. I disabled the configuration for this and now when my wireless drops and reconnects, DNS will at least continue working. Some other network stuff is still having trouble, but I don’t have to completely restart the network services right now.

Here are some links that I found useful for learning how to troubleshoot this all:

The Powers of Money and Community

I’ve been looking at the draft of this since April, 2015. I’m going to take Jorbin’s advice and just press publish so that it’s no longer a draft. Most of this observation is informed by my perceptions of structure inside the university when providing a central service. It’s still interesting.

We provide an excellent base service for groups inside the university. We build features to extend this base service. Most built features are available to everyone.

We invite everyone to join our community. Open labs every Friday, a Slack group for use throughout the week.

Groups paying us to extend the base service tend not to join the community discussion—or not frequently.

Groups without dedicated funding have participated regularly.

Both groups, for the most part, have their concerns and requests addressed. Groups with funding can demand timelines. Groups involved in the community are frequently vocal and pleasant.

Balancing the concerns of each leads to useful features for all.

The difficult group is the one without funding that does not join the community. Our base setup is easy, but prioritizing feature requests is near impossible when juggled alongside the previous two groups. This group quickly becomes an outlier for our workflow.

How do you convince that group to join the community?



Specific focuses and vague goals for 2017

Hello from 2017! I’m sticking with the title from last year because I like the idea of focuses rather than trying to define specific objectives when the year has barely started.


My love of reading books has officially returned, and I’m now always on the lookout for things to explore. I set a goal of 26 books in my 2017 Goodreads reading challenge, an average of one every two weeks. It’d be great if I beat that!

I’m starting off the year in the middle of Neuromancer, so that should be done soon. I have a handful of non-fiction books that I’m excited about. After reading Kim Stanley Robinson’s excellent Aurora from last year, I want to go through the Mars Trilogy.

A couple days ago I poked at Moby Dick, which I’ve never made it through, so that could be an interesting one for the year. I was already surprised by some of the material in the opening pages—”GRAND CONTESTED ELECTION FOR THE PRESIDENCY OF THE UNITED STATES”.

Joyce is still interesting, and if I feel like going crazy I’ll probably try Finnegans Wake again. There’s also Dubliners, which should be more approachable.

And other random things. The bookshelves at home are full of things that haven’t been read. 📚


This will always be a focus. I preach sharing your work to everyone I talk to at WSU, but I don’t necessarily practice it so well myself. I’d like to spend more time stopping to explain some of the stuff I’ve done so that I remember and so that others may find it useful. This will also be important as part of our work at WSU to help ensure long term health of the community we’re building.


I’m going to focus on learning computer science a bit more. I pick up plenty of things here and there during the development process every day, but it would be fun to go back and explore some of the history and some of the basics from the beginning.

The two books that I’m starting with are Structure and Interpretation of Computer Programs and Foundations of Computer Science (C Edition). We’ll see where those take me, I’m already loving the beginning of SICP.

I also like the idea of being more familiar with cryptography. I got Bruce Shneier’s Applied Cryptography a while ago, but never really started past the first few pages. It should be fun to get past the first few chapters.

Aside: I’ll toss in a recommendation here for The Code Book, which is very approachable and an excellent introduction to the history of cryptography.


I’m not sure speaking will be a focus in 2017, but this is where one of my more specific goals exists. I’d like to find a new topic I’m passionate about and develop a talk around it. Once I have that, then I’ll be focused on speaking again.

Open Source

I should probably cover this as a separate blog post.

In general, open source will be a focus for me in 2017. I still believe open source is one of the most important things we have and it is worth the time we give it.

Most of my open source time is spent contributing to WordPress. I don’t expect this will change much, though I want to make sure I’m spending enough time thinking about and working on other things as well.

I had some inspiring conversations last year, as well as the opportunity to visit the open source lab at Oregon State University. It’d be great to turn some of those conversations into action. At the very least, it’d be great to continue having those conversations.

That’s a super vague way of saying “I don’t really know what I’m going to do, but open source is great everyone, let’s do more of it!” 😎

Washington State University

4 years in July! Whoa.

We’re still doing good work. I want to make sure that we make progress early this year on a couple things:

  • Have the best solution for monitoring web accessibility on all university sites.
  • Syndicate content throughout the university.
  • Give everyone a place to share their work with open registration for students, faculty, and staff. Free websites!

I’d feel a little weird making it through 4 years without at least having 2 of those 3 in a very good place. I think we’re close enough to say that.

Beyond those specific goals, my focus should be on documenting and sharing our work.


I decided that focusing on “exercise” wasn’t really any fun. I want to focus on being active in 2017.

We got snowshoes a few days ago and I’m super excited about that. I’d like to spend almost every weekend between now and the end of snow season exploring snowshoeing possibilities.

Once spring comes, and maybe even before then, I’d like to spend many weekends hiking, camping, exploring, and just getting the hell away from the computer.

With activity will come exercise, just because.

Saying Yes.

I want to make sure I say yes to the right opportunities. This probably requires saying yes to a few of the wrong opportunities along the way. But I think I have a bad habit of avoiding some fun things just because it’s easier. If I do have that habit, then I want to be conscious of saying “yes” this year just to see what happens.

This might be freelance opportunities, career opportunities, travel opportunities, whatever. On December 31, there should be more “yes” than “no”.

And all of the other stuff that gets focused on.

Because why limit it to a list you thought of on January 1… Happy 2017, see y’all around!

Previously, 2016 and 2015.


Snowshoeing at the Palouse Divide Nordic Ski Area

Every photo gallery comes with a story, right.

I grew up on skis. Or, really, I was fortunate enough to have the opportunity to ski about once a year in skiing places like Winter Park and Breckenridge from the time I was 3 or 4. At one point, I even got a great 1-on-1 lesson for a couple days while skiing at Jackson Hole and became good enough to feel like a confident skier, even if I was never really amazing at it.

For somewhere around 28 years, I thought that skiing was the best winter sport.

In 2011, Michelle and I had a chance to try snowshoeing for the first time while visiting my family in Colorado. We spent the day at YMCA of the Rockies in Estes Park and had a blast going wherever our snowshoes took us in the fresh layer of powder.

My favorite thing to do while skiing was always the small trails in the trees that took you way off of the large main trail and into these magical places. With snowshoeing, almost every trail was exactly that, just at a slower speed and in deeper powder. And even with the slower speed, it was exhilarating!

For almost 6 years we told ourselves that we were going to get snowshoes and never did. But this year was different!

On Thursday, we drove up to Spokane, walked into REI, and walked out with a couple pairs of snowshoes, raring to go.

On Friday, we drove up to the Palouse Divide Nordic Ski Area, which is only an hour drive, and had an absolute blast breaking them in for the first time. Even though we got a bit of a late start, we made it 5.3 miles before basically collapsing back at the car.

We now have snowshoes and we’re hooked, so I anticipate many more excursions before the snow disappears this winter.

And I’m now convinced that snowshoeing is the best winter sport! ❄️

2016 Reflection and Check-in

Every year I write one of these thinking that I’ll look at it throughout the next year as a guide to what I might want to be doing. Every year I write one of these and finally look back at the last one for the first time!

Oh well, it’s still fun for me to revisit see what was on my mind.

Reading was pretty great.

I originally set my Goodreads challenge at 15 books, then bumped it to 20 at some point. As of now, I’ve read 25 books this year with a chance of 26 by the end of the night. My hope for a split of 2/3 fiction was pretty close as I made it through 7 non-fiction books.

I read A Portrait of the Artist as a Young Man and loved it. It was so easy to read compared to Ulysses and there were many parts of the book that I dogeared due to great passages.

I finished the original Foundation Trilogy as I hoped. I liked how the trilogy just kept getting better throughout. So many crazy things to think about while reading about the Mule while Trump was winning an election in real life.

I started on Finnegans Wake but ran away quickly on page one. I was definitely not ready for that yet.

And I’ll repeat this from last year—If you read, you should add me as a friend on Goodreads! If you haven’t used Goodreads yet, here’s a good explainer.

“Learning” didn’t go as I expected.

I never really even started on conversational German, but that’s okay. Vienna was very welcoming in English.

I never really focused on learning JavaScript deeply, but that’s okay too. I did pick up a couple of computer science books that I’ve started to dig into and another on intellectual property and open source. So I’m always learning, but we’ll see about next year.

I did figure out a better front-end development workflow that doesn’t require Vagrant or WordPress, even without using the REST API or JavaScript. We’ll see where that ends up next year.

I kinda did some writing.

There wasn’t really a specific goal here, but I did take the time to stop and talk about my work several times throughout the year, so that’s good. I did a bunch of writing to document things at WSU that hadn’t yet been documented, so that’s good too.

I did less speaking.

Unless I’m forgetting something, I really only spoke a couple times this year and took my own advice from last year by really just focusing on one talk.

At WordCamp Europe in Vienna, I talked about multisite in the Leupold Museum, which was super cool. There was a great turnout and—even with an unexpected moment where my laptop dropped off the podium—things went really well.

At WordCamp Seattle, I talked about multisite and sat on a panel talking about contributing to WordPress. The talk went well and the panel was an absolute blast.

At WordCamp Vancouver, I didn’t really speak, but hung out in Ian‘s session on contributing to the WordPress meta team and helped troubleshoot a few local environment issues with VVV.

And at WordCamp US, I also didn’t really speak, but led a session for first time contributors to WordPress core that was a lot of fun.

But I still got some travel in.

I always feel like I’m forgetting something, but here goes…

  • London, UK in January for the A Day of Rest conference. I got there a day early and stayed a day late so that I had some time to hang out. The conference was great, the contributor day may have been the most productive I’ve ever been a part of, and I spent the final Saturday walking 15 miles around London! I even drank in a couple of Orwell’s favorite pubs. 🍺
  • Portland, OR briefly in February as part of a visit to WSU’s Vancouver, WA campus. Still enough time to have a couple good beers and visit Powell’s.
  • Vienna, Austria in June for 3 weeks (!) to enjoy Vienna with Michelle and for WordCamp Europe. Vienna is a great city and we had a lot of fun.
  • Whitefish, MT – Glacier National Park for a couple days in July on a whim to meet my parents who were staying there for a week or so. That park is very beautiful.
  • Vancouver, BC in August for WordCamp Vancouver. Yet another amazing brew fest planned by Flynn. Great time hanging out with the Vancouver group, a great bunch of people.
  • Ocean Shores, WA in September for a combo birthday/anniversary hangout. We had fun and walked quite a few miles on the beach. Don’t tell anyone, but Oregon’s coast is cooler.
  • Portland, OR in September for another quick visit to WSU Vancouver along with a side trip down to Corvalis to talk with Oregon State University’s Open Source Lab.
  • Seattle, WA in October for WordCamp Seattle.
  • Philadelphia, PA in November for WordCamp US week. I arrived a couple days early, but it was super rainy, so I didn’t get too much sight seeing in. Had a great time with everyone at WordCamp though.

I burned out less this year.

It took me a few months into 2016 to realize how burnt out I was towards the end of 2015. I was then able to turn that into a conscious decision not to get burnt out this year—or to at least recognized when it was happening and to calm down a bit.

Thanks to that effort, the last few months of the year have been great and productive. I’m finishing with 1000 open ideas rather than wondering when it will feel normal. 🎉

I voted for Hillary.

And Trump won? Shit. 👎


We made multisite better! At least I think so.

As 2016 comes to a close, we have WP_Site, WP_Network, WP_Site_Query, and WP_Network_Query along with a handful of good decisions that we’ve made and documented in various ways. I’m pretty satisfied with the multisite stuff we got done, especially during the 4.6 release cycle. I’m really excited about the group of contributors that we have focused on multisite right now. I have a feeling that 2017 will be pretty sweet.

A fun memory that will be fun to look back on is the development of meta registration. A group of us spent the A Day of REST contributor day talking about the challenges of registering meta keys for inclusion with REST responses. The original GitHub issue is gone now (!), but it led to the creation of a ticket.

That ticket then became a hot topic during the 4.6 cycle once we decided it really was the time to get that included so that the REST API could have something to work with. I spent several mornings and nights hacking on our Airbnb couch in between walks around Vienna trying to get that in. Such a relief when we finally shipped it. 🙂

Washington State University

It’s been a great year for the web at WSU. We hired a second WordPress developer in March and have been able to make a lot of progress since. Some of it isn’t visible yet, but we’re ramped up to do some excellent things in 2017.

The numbers:

Numbers don’t really tell the full story, but they’re fun to look at.

Here’s an assortment of photographs that may represent 2016 for me.

I wonder why I haven’t done this before.

Okay, that’s enough.

Thanks for reading. Hope you had a great 2016 and see you next year!

Previous reflective posts: 2015, 2014, 2013.

“VR” photos with Google Cardboard Camera

I was really excited when Google offered a Daydream VR headset with my new Google Pixel back in October, but I wasn’t really familiar with why I should be excited. I figured I’d play a couple games, but that it would mostly be just another stepping stone toward a real VR system in a few years.

When I got the Daydream, it took me a couple uses before I discovered the Google Cardboard Camera app, which is freaking amazing. I was surprised how well the panorama shots I had taken with my iPhone translated into the VR format. Even cooler (!) is that the app itself lets you capture 360° shots with audio. When you share them with others later, they can experience the surroundings along with the ambient noise you recorded.

It’s still a bit gimmicky, but I’m a pretty big fan of the concept. If you have the Google Cardboard Camera app, here’s the view I enjoyed earlier today when snowshoeing in the Saint Joe National Forest:

The crunching of snow is me turning around while taking the shot. Otherwise, it was a super peaceful day with hardly any wind. More about that in another post!

Things I’ve enjoyed reading about open source in 2016

I started this post back in February after reading Nadia Eghbal’s “What success really looks like in open source” so that I’d have something other than tweets to reference when I wanted to refer back to some good stuff.

So here’s a list, not in any particular order, and including the article already mentioned, of some things I’ve enjoyed reading about open source in 2016:

There were many more great articles that I likely forgot to add here, but that list is a good one to revisit.

The next two are videos. The first is Pieter Hintjens on building open source communities. I was so in love with this talk from the beginning that I opened a new post window to start writing while I was watching.

Pieter Hintjens on Building Open Source Communities

Hintjens, who passed away earlier this year, left behind a so very useful body of work in his writings on open source, development, and everything else. I know I’ll continue to go back and discover nice pieces.

The next video is Joshua Matthews on optimizing your open source project for contribution. Yet another one where I was just nodding along the entire time. I know I picked up a few useful tips from this.

I kind of like that I kept this post rolling this year, so I’m going to try to do the same thing next year. It’d probably be good if I wrote a sentence or two along the way on why I felt the piece was important enough to revisit!

Enjoy and feel free to send me links on open source that you think might be missing from the list above.

Remove an administrator from 58 networks at once with WP-CLI

Ok, so this is super specific and probably won’t come in handy for you. But it’s another example of how quickly you can perform a task using WP-CLI.

At WSU, we currently have 58 networks configured in WordPress multisite.

  • Global administrators are users that have been set under the site_admins option on network 1.
  • Network administrators are users that have been set under the site_admins option on any other network.

Depending on the page view, these are used to make up what WordPress validates as is_super_admin(). See WordPress core ticket #37616 for an eye into how this will get a lot better soon.

One of our excellent interns has graduated and we needed to remove him from ~25 different networks. Because I rushed the original UI on adding network administrators, there’s no great way to remove them.

Enter WP-CLI:

wp site option list --field=site_id --search=site_admins | xargs -n1 -I % wp eval 'if ( $sa = get_network_option( %, "site_admins" ) ) { if ( $tk = array_search( "old.username", $sa ) ) { unset( $sa[ $tk ] ); update_network_option( %, "site_admins", $sa ); } }'

WP-CLI isn’t really multi-network aware out of the box, so the wp site option list command will output all options for all networks. We can use this to our advantage by having only site_id output for only the site_admins option on each network.

We then pipe this to xargs and use wp eval to run arbitrary PHP code. This code retrieves the current site_admins data for the given network, removes the old user from the array, and then updates the network option with the new value.

This is a prime candidate for packing into some code and turning it into an actual command—wp network admin remove or something—but it does the trick for now!

And if we haven’t written a better UI or WP-CLI command by the time somebody else needs to be removed, then referring to this post and using the command will take 10 seconds instead of the 5 minutes it  took to make it in the first place. 🙂

Update: Daniel pointed out wp super-admin, which I hadn’t noticed before. This will take a --url argument, so if you know a URL on the network, then you can pass that and it will work. There’s no great way (that I know of yet) to generate list of URLs that covers all networks, but I started an issue on the WP-CLI repo to start figuring that out.