<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Ian Bicking: a blog - mozilla</title><link href="https://ianbicking.org/" rel="alternate"></link><link href="https://ianbicking.org/feeds/mozilla.atom.xml" rel="self"></link><id>https://ianbicking.org/</id><updated>2019-04-23T00:00:00-05:00</updated><entry><title>“Users want control” is a shoulder shrug</title><link href="https://ianbicking.org/blog/2019/04/users-want-control-is-a-shrug.html" rel="alternate"></link><published>2019-04-23T00:00:00-05:00</published><updated>2019-04-23T00:00:00-05:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2019-04-23:/blog/2019/04/users-want-control-is-a-shrug.html</id><summary type="html">&lt;p&gt;Making the claim &amp;#8220;users want control&amp;#8221; is the same as saying you don&amp;#8217;t know what users want, you don&amp;#8217;t know what is good, and you don&amp;#8217;t know what their goals&amp;nbsp;are.&lt;/p&gt;
&lt;p&gt;I first started thinking about this during the debate over what would become the &lt;a href="https://en.wikipedia.org/wiki/Patient_Protection_and_Affordable_Care_Act"&gt;&lt;span class="caps"&gt;ACA&lt;/span&gt;&lt;/a&gt;. The …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Making the claim &amp;#8220;users want control&amp;#8221; is the same as saying you don&amp;#8217;t know what users want, you don&amp;#8217;t know what is good, and you don&amp;#8217;t know what their goals&amp;nbsp;are.&lt;/p&gt;
&lt;p&gt;I first started thinking about this during the debate over what would become the &lt;a href="https://en.wikipedia.org/wiki/Patient_Protection_and_Affordable_Care_Act"&gt;&lt;span class="caps"&gt;ACA&lt;/span&gt;&lt;/a&gt;. The rhetoric was filled with this idea that people want choice in their medical care: &lt;em&gt;people want control&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;No! People want &lt;strong&gt;good health care&lt;/strong&gt;. If they don&amp;#8217;t trust systems to provide them good health care, if they don&amp;#8217;t trust their providers to understand their priorities, then &lt;em&gt;choice&lt;/em&gt; is the fallback: it&amp;#8217;s how you work the system when the system isn&amp;#8217;t working for you. And it sucks! Here you are, in the middle of some health issue, with treatments and symptoms and the rest of your life duties, and now you have to become a researcher on top of it? But the politicians and the pundits could not stop talking about&amp;nbsp;control.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Control&lt;/em&gt; is what you need when you want something and it won&amp;#8217;t happen on its own. But (usually) it&amp;#8217;s not control you want, it&amp;#8217;s just a&amp;nbsp;means.&lt;/p&gt;
&lt;p&gt;So when we say &lt;em&gt;users want control over X&lt;/em&gt; – their privacy, their security, their data, their history – we are first acknowledging that current systems act against users, but we aren&amp;#8217;t proposing any real solution. We&amp;#8217;re avoiding even talking about the&amp;nbsp;problems.&lt;/p&gt;
&lt;p&gt;For instance, we say &amp;#8220;users want control over their privacy,&amp;#8221; but what people really want is some subset&amp;nbsp;of:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;To avoid&amp;nbsp;embarrassment&lt;/li&gt;
&lt;li&gt;To avoid&amp;nbsp;persecution&lt;/li&gt;
&lt;li&gt;&amp;#8230; sometimes for doing illegal and wrong&amp;nbsp;things&lt;/li&gt;
&lt;li&gt;To keep from having the creeping sensation they left something sitting out that they didn&amp;#8217;t want&amp;nbsp;to&lt;/li&gt;
&lt;li&gt;They want to make some political statement against&amp;nbsp;surveillance&lt;/li&gt;
&lt;li&gt;They want to keep things from the prying eyes of those close to&amp;nbsp;them&lt;/li&gt;
&lt;li&gt;They want to avoid being manipulated by bad-faith&amp;nbsp;messaging&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;There&amp;#8217;s no easy answers, not everyone holds all these desires, but these are concrete ways of thinking about what people want. They don&amp;#8217;t all point in the same direction. (And then consider the complex implications of someone else talking about&amp;nbsp;you!)&lt;/p&gt;
&lt;p&gt;There are some cases when a person really does want control. If the person wants to determine their own path, if &lt;strong&gt;having choice is itself a personal goal&lt;/strong&gt;, then you need control. That&amp;#8217;s a goal about &lt;em&gt;who you are&lt;/em&gt; not just &lt;em&gt;what you get&lt;/em&gt;. It&amp;#8217;s worth identifying moments when this is important. But if a person does not pay attention to something then that person probably does not identify with the topic and is not seeking control over it. &amp;#8220;Privacy advocates&amp;#8221; pay attention to privacy, and attain a sense of identity from the very act of being mindful of their own privacy. Everyone else does&amp;nbsp;not.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s think about another example: &lt;em&gt;users want control over their data&lt;/em&gt;. What are some things they&amp;nbsp;want?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;They don&amp;#8217;t want to lose their&amp;nbsp;data&lt;/li&gt;
&lt;li&gt;They don&amp;#8217;t want their data used to hold them hostage (e.g., to a subscription&amp;nbsp;service)&lt;/li&gt;
&lt;li&gt;They don&amp;#8217;t want to delete data and have it still&amp;nbsp;reappear&lt;/li&gt;
&lt;li&gt;They want to use their data however they want, but more likely they want their data available for use by some other service or&amp;nbsp;tool&lt;/li&gt;
&lt;li&gt;They feel it&amp;#8217;s unfair if their data is used for commercial purposes without any&amp;nbsp;compensation&lt;/li&gt;
&lt;li&gt;They are offended if their data is used to manipulate themselves or&amp;nbsp;others&lt;/li&gt;
&lt;li&gt;They don&amp;#8217;t want their data used against them in manipulative&amp;nbsp;ways&lt;/li&gt;
&lt;li&gt;They want to have shared ownership of data with other&amp;nbsp;people&lt;/li&gt;
&lt;li&gt;They want to prevent unauthorized or malicious access to their&amp;nbsp;data&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Again these motivations are often against each other. A person wants to be able to copy their data between services, but also delete their data permanently and completely. People don&amp;#8217;t want to lose their data, but having personal control over your data is a great way to lose it, or even to lose control over it. The professionalization and centralization of data management by services has mostly improved access control and&amp;nbsp;reliability.&lt;/p&gt;
&lt;p&gt;When we simply say &lt;em&gt;users want control&lt;/em&gt; it&amp;#8217;s  giving up on understanding people&amp;#8217;s specific desires. Still it&amp;#8217;s not exactly wrong: it&amp;#8217;s reasonable to assume people will use control to achieve their desires. But if, as technologists, we can&amp;#8217;t map functionality to desire, it&amp;#8217;s a bit of a stretch to imagine everyone else will figure it out on the&amp;nbsp;fly.&lt;/p&gt;</content><category term="mozilla"></category></entry><entry><title>Open Source Doesn’t Make Money Because It Isn’t Designed To Make Money</title><link href="https://ianbicking.org/blog/2019/03/open-source-doesnt-make-money-by-design.html" rel="alternate"></link><published>2019-03-18T00:00:00-05:00</published><updated>2019-03-18T00:00:00-05:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2019-03-18:/blog/2019/03/open-source-doesnt-make-money-by-design.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;Or: &lt;em&gt;The Best Way To Do Something Is To At Least&amp;nbsp;Try&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We all know the story: you can&amp;#8217;t make money on open source. Is it really&amp;nbsp;true?&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m thinking about this now because Mozilla would like to diversify its revenue in the next few years, and one …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;Or: &lt;em&gt;The Best Way To Do Something Is To At Least&amp;nbsp;Try&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We all know the story: you can&amp;#8217;t make money on open source. Is it really&amp;nbsp;true?&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m thinking about this now because Mozilla would like to diversify its revenue in the next few years, and one constraint we have is that everything we do is open&amp;nbsp;source.&lt;/p&gt;
&lt;p&gt;There are dozens (hundreds?) of successful open source projects that have tried to become even just modest commercial enterprises, some very seriously. Results aren&amp;#8217;t&amp;nbsp;great.&lt;/p&gt;
&lt;p&gt;I myself am trying to pitch a commercial endeavor in Mozilla right now (if writing up plans and sending them into the ether can qualify as &amp;#8220;pitching&amp;#8221;), and this question often comes up in feedback: can we sell something that is open&amp;nbsp;source?&lt;/p&gt;
&lt;p&gt;I have no evidence that we can (or can&amp;#8217;t), but I will make this assertion: it&amp;#8217;s hard to sell something that wasn&amp;#8217;t designed to be&amp;nbsp;sold.&lt;/p&gt;
&lt;p&gt;We treat open source like it&amp;#8217;s a poison pill for a commercial product. And yes, with an open source license it&amp;#8217;s harder to force someone to pay for a product, though many successful businesses exist without &lt;em&gt;forcing&lt;/em&gt;&amp;nbsp;anyone.&lt;/p&gt;
&lt;p&gt;I see an implicit assumption that makes it harder to think about this: the idea that if something is useful, it should be profitable. It&amp;#8217;s an unspoken and morally-infused expectation, a kind of Just World hypothesis: if something has utility, if it helps people, if it&amp;#8217;s something the world needs, if it empowers other people, then there should be a revenue opportunity. It should be possible for the thing to be your day job, to make money, to see some remuneration for your successful effort in creating or doing this&amp;nbsp;thing.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s what we think the world &lt;em&gt;should&lt;/em&gt; be like, but we all know it isn&amp;#8217;t. You can&amp;#8217;t make a living making music. Or art. You can&amp;#8217;t even make a living taking care of children. I think this underlies many of this moment&amp;#8217;s critiques of capitalism: there&amp;#8217;s too many things that are important, even needed, or that fulfill us more than any profitable item, and yet are economically&amp;nbsp;unsustainable.&lt;/p&gt;
&lt;p&gt;I won&amp;#8217;t try to fix that in this blog post, only note: not all good things make&amp;nbsp;money.&lt;/p&gt;
&lt;p&gt;But we know there is money in software. Lots of money! Is the money in secrets? If OpenSSL was secret, could it make money? If it had a licensing paywall, could it make money? Seems unlikely. The license isn&amp;#8217;t holding it back. It&amp;#8217;s just not shaped like something that makes money. Solving important problems isn&amp;#8217;t&amp;nbsp;enough.&lt;/p&gt;
&lt;p&gt;So what can you get paid to&amp;nbsp;do?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;People will pay a little for apps; not a lot, but a bit. Scaling up requires marketing and capital, which open source projects almost never have (and I doubt many open source projects would know what to do with capital if they had&amp;nbsp;it).&lt;/li&gt;
&lt;li&gt;There&amp;#8217;s always money in ads. Sadly. This could potentially offend someone enough to actually repackage your open source software with ads removed. As a form of &lt;a href="https://en.wikipedia.org/wiki/Price_discrimination"&gt;price discrimination&lt;/a&gt; (e.g., paid ad removal) I think you could avoid&amp;nbsp;defection.&lt;/li&gt;
&lt;li&gt;Fully-hosted services: &lt;a href="https://automattic.com/"&gt;Automattic&amp;#8217;s&lt;/a&gt; wordpress.com is a good example here. Is &lt;a href="https://ghost.org/"&gt;Ghost&lt;/a&gt; doing &lt;span class="caps"&gt;OK&lt;/span&gt;? These are complete solutions: you don&amp;#8217;t just get software, you get a&amp;nbsp;website.&lt;/li&gt;
&lt;li&gt;People will pay if you ensure they get a personalized solution. I.e., consulting. Applied to software you get &lt;a href="https://www.joelonsoftware.com/2002/05/06/five-worlds/"&gt;consultingware&lt;/a&gt;. While often maligned, many real businesses are built on this. I think Drupal is in this&amp;nbsp;category.&lt;/li&gt;
&lt;li&gt;People will pay you for your dedicated and ongoing attention. In other words: a day job as an employee. It feels unfair to put this option on the list, but it&amp;#8217;s such a natural progression from consultingware, and such a dominant pattern in open source that I think it deserves&amp;nbsp;acknowledgement.&lt;/li&gt;
&lt;li&gt;Anything paired with a physical device. People will judge the value based on the hardware and software experience&amp;nbsp;together.&lt;/li&gt;
&lt;li&gt;I&amp;#8217;m not sure if Firefox makes money (indirectly) from ads, or as compensation for maintaining monopoly&amp;nbsp;positions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;#8217;m sure I&amp;#8217;m missing some interesting ideas from that&amp;nbsp;list.&lt;/p&gt;
&lt;p&gt;But if you have a business concept, and you think it might work, what does open source even have to do with it? Don&amp;#8217;t we learn: focus on your business! On your customer! Software licensing seems like a distraction, even &lt;em&gt;software&lt;/em&gt; is a questionable thing to focus on, separate from the business. Maybe this is why you can&amp;#8217;t make money with open source: it&amp;#8217;s a distraction. The question isn&amp;#8217;t open-source-vs-proprietary, but&amp;nbsp;open-source-vs-business-focused.&lt;/p&gt;
&lt;p&gt;Another lens might be: who are you selling to? Classical scratch-your-own-itch open source software is built by programmers &lt;em&gt;for&lt;/em&gt; programmers. And it is wildly successful, but it&amp;#8217;s selling to people who aren&amp;#8217;t willing to pay. They want to take the software and turn it around into greater personal productivity (which turns out to be a smart move, given the rise in programmer wages). Can we sell open source to other people? Can anyone else &lt;em&gt;do&lt;/em&gt; anything with source&amp;nbsp;code?&lt;/p&gt;
&lt;p&gt;And so I remain pessimistic that open source can find commercial success. But also frustrated: so much software is open source &lt;em&gt;except&lt;/em&gt; any commercial product. This is where the Free Software mission has faltered despite so many successes: software that people actually touch isn&amp;#8217;t free or open. That&amp;#8217;s a&amp;nbsp;shame.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You may also wish to read &lt;a href="https://news.ycombinator.com/item?id=19431444"&gt;Hacker News Comments&lt;/a&gt; on this post, or the &lt;a href="https://www.reddit.com/r/programming/comments/b30m3s/open_source_doesnt_make_money_because_it_isnt/"&gt;Reddit r/programming&amp;nbsp;comments&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="mozilla"></category></entry><entry><title>The Firefox Experiments I Would Have Liked To Try</title><link href="https://ianbicking.org/blog/2019/03/firefox-experiments-i-would-have-liked.html" rel="alternate"></link><published>2019-03-04T00:00:00-06:00</published><updated>2019-03-04T00:00:00-06:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2019-03-04:/blog/2019/03/firefox-experiments-i-would-have-liked.html</id><summary type="html">&lt;p&gt;I have been part of the Firefox Test Pilot team for several years. I had a long list of things I wanted to build. Some I didn&amp;#8217;t personally want to build, but I thought they were interesting ideas. I didn&amp;#8217;t get very far through this list at all …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I have been part of the Firefox Test Pilot team for several years. I had a long list of things I wanted to build. Some I didn&amp;#8217;t personally want to build, but I thought they were interesting ideas. I didn&amp;#8217;t get very far through this list at all, and now that &lt;a href="https://medium.com/firefox-test-pilot/adios-amigo-51bec2a00072"&gt;Test Pilot is being retired&lt;/a&gt; I am unlikely to get to them in the&amp;nbsp;future.&lt;/p&gt;
&lt;p&gt;Given this I feel I have to move this work out of my head, and publishing a list of ideas seems like an okay way to do that. Many of these ideas were inspired by something I saw in the wild, sometimes a complete product (envy on my part!), or the seed of an idea embedded in some other&amp;nbsp;product.&lt;/p&gt;
&lt;p&gt;The experiments are a spread: some are little features that seem potentially useful. Others are features seen elsewhere that show promise from user research, but we could only ship them with confidence if we did our own analysis. Some of these are just ideas for how to explore an area more deeply, without a clear product in&amp;nbsp;mind.&lt;/p&gt;
&lt;p&gt;Test Pilot&amp;#8217;s purpose was to find things worth shipping in the browser, which means some of these experiments aren&amp;#8217;t novel, but there is an underlying question: would people actually use it? We can look at competitors to get ideas, but we have to ship something ourselves if we want to analyze the&amp;nbsp;benefit.&lt;/p&gt;
&lt;p&gt;Table of&amp;nbsp;contents:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#sticky-reader-mode"&gt;Sticky Reader&amp;nbsp;Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cloud-browser"&gt;Cloud&amp;nbsp;Browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#modal-page-actions"&gt;Modal Page&amp;nbsp;Actions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#find-plus-one"&gt;Find+1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#your-front-page"&gt;Your Front&amp;nbsp;Page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#page-archive"&gt;Page&amp;nbsp;Archive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#personal-historical-archive"&gt;Personal Historical&amp;nbsp;Archive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#navigational-breadcrumbs"&gt;Navigational&amp;nbsp;Breadcrumbs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#copy-keeper"&gt;Copy&amp;nbsp;Keeper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#change-scout"&gt;Change&amp;nbsp;Scout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#popup-tab-switcher"&gt;Popup Tab&amp;nbsp;Switcher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#personal-podcast"&gt;Personal&amp;nbsp;Podcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#bookmark-manager"&gt;Bookmark&amp;nbsp;Manager&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#extended-library"&gt;Extended&amp;nbsp;Library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#text-mobile-screenshot"&gt;Text Mobile&amp;nbsp;Screenshot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#email-readable"&gt;Email&amp;nbsp;Readable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#your-history-everywhere"&gt;Your History&amp;nbsp;Everywhere&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#my-homepage"&gt;My&amp;nbsp;Homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#studying-electron"&gt;Studying what Electron does for&amp;nbsp;people&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#app-quick-switcher"&gt;App quick&amp;nbsp;switcher&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#just-save"&gt;Just&amp;nbsp;Save&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#open-search-combined-search"&gt;Open Search Combined&amp;nbsp;Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#notes-commander"&gt;Notes&amp;nbsp;Commander&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#automater"&gt;Automater&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sidekick"&gt;Sidekick&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#timed-repetition"&gt;Timed&amp;nbsp;Repetition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#reader-mode-improvements"&gt;Reader Mode&amp;nbsp;improvements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#digest-mode"&gt;Digest&amp;nbsp;Mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#firefox-for-x"&gt;&lt;strong&gt;Firefox for X&lt;/strong&gt;&lt;/a&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href="#firefox-study"&gt;Firefox&amp;nbsp;Study&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#firefox-media"&gt;Firefox&amp;nbsp;Media&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#firefox-for-finance"&gt;Firefox for&amp;nbsp;Finance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#firefox-low-bandwidth"&gt;Firefox Low&amp;nbsp;Bandwidth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#firefox-for-kids"&gt;Firefox for&amp;nbsp;Kids&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#firefox-calm"&gt;Firefox&amp;nbsp;Calm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusion"&gt;&lt;strong&gt;Concluding&amp;nbsp;thoughts&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;&lt;a href="#sticky-reader-mode" id="sticky-reader-mode"&gt;Sticky Reader&amp;nbsp;Mode&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="mockup of Sticky Reader Mode" src="/media/mockups/sticky-readable-start.gif"&gt;&lt;/p&gt;
&lt;p&gt;Give &lt;a href="https://support.mozilla.org/en-US/kb/firefox-reader-view-clutter-free-web-pages"&gt;Reader Mode&lt;/a&gt; in Firefox a preference to make it per-domain sticky. E.g. if I use Reader Mode on nytimes.com and then if I visit an article on nytimes.com in the future it&amp;#8217;ll automatically convert to reader mode. (The nytimes.com homepage would not be a candidate for that&amp;nbsp;mode.)&lt;/p&gt;
&lt;p&gt;I made an experiment in &lt;a href="https://github.com/ianb/sticky-reader-mode"&gt;&lt;code&gt;sticky-reader-mode&lt;/code&gt;&lt;/a&gt;, and I think it works really nicely. It changes the browsing experience significantly, and most importantly it doesn&amp;#8217;t require frequent proactive engagement to change behavior. Lots of these proposed ideas are tools that require high engagement by the user, and if you don&amp;#8217;t invoke the tool then they do nothing. In practice no one (myself included) remembers to invoke these tools. Once you click the preference on a site Sticky Reader Mode then you are opted in to this new experience with no further action&amp;nbsp;required.&lt;/p&gt;
&lt;p&gt;There are a &lt;a href="https://github.com/ianb/sticky-reader-mode/issues/5"&gt;bunch of similar add-ons&lt;/a&gt;. Sticky Reader Mode works a bit better than most because of its interface, and it will push you directly into Reader Mode without rendering the normal page. &lt;strong&gt;But&lt;/strong&gt; it does this by using APIs that are not public to normal WebExtensions. As a result it can&amp;#8217;t be shipped outside Test Pilot, and can&amp;#8217;t go in addons.mozilla.org. So&amp;#8230; just trust me, it&amp;#8217;s&amp;nbsp;great.&lt;/p&gt;
&lt;p&gt;Recently I&amp;#8217;ve come upon &lt;a href="https://brave.com/blog/speed-reader/"&gt;Brave Speed Reader&lt;/a&gt; which is similar, but without per-site opt-in, and using machine learning to identify&amp;nbsp;articles.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#cloud-browser" id="cloud-browser"&gt;Cloud&amp;nbsp;Browser&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="mockup of a Cloud Browser" src="/media/mockups/cloud-browser-start.gif"&gt;&lt;/p&gt;
&lt;p&gt;Run a browser/user-agent in the cloud and use a mobile view as a kind of semantic or parsed view on that user agent (the phone would just control the browser that is hosted on the cloud). At its simplest we just take the page, simplify it in a few ways, and send it on - similar to what Opera Mini does. The approach lends itself to a variety of task-oriented representations of remote&amp;nbsp;content.&lt;/p&gt;
&lt;p&gt;When I first wrote this down I had just stared at my phone while it took 30 seconds to show me a 404 page. The browser probably knew after a couple seconds that it was a 404 but it acted as a rendering engine and not a user agent, so the browser insisted on faithfully rendering the useless not found&amp;nbsp;page.&lt;/p&gt;
&lt;p&gt;Obviously running a full browser instance in the cloud is resource hungry and finicky but I think we could ignore those issues while testing. Those are hard but solved operational&amp;nbsp;issues.&lt;/p&gt;
&lt;p&gt;Prior art: Opera Mini does some of this. Puffin is specifically cloud rendering for mobile. Light Point does the same for security&amp;nbsp;reasons.&lt;/p&gt;
&lt;p&gt;I later encountered &lt;a href="https://www.brow.sh"&gt;brow.sh&lt;/a&gt; which is another interesting take on this (specifically with &lt;a href="https://html.brow.sh"&gt;html.brow.sh&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;This is a very big task, but I still believe there&amp;#8217;s tremendous potential in it. Most of my concepts are not mobile-based, in part because I don&amp;#8217;t like mobile, I don&amp;#8217;t like myself when using a mobile device, and it&amp;#8217;s not something I want to put my energy into. But I still like this&amp;nbsp;idea.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#modal-page-actions" id="modal-page-actions"&gt;Modal Page&amp;nbsp;Actions&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="mockup of Modal Page Actions" src="/media/mockups/modal-page-actions-start.gif"&gt;&lt;/p&gt;
&lt;p&gt;This was tangentially inspired by &lt;a href="https://help.vivaldi.com/article/image-properties/"&gt;Vivaldi&amp;#8217;s Image Properties&lt;/a&gt;, not because of the interface, but thinking about how to fit high-information inspection tools into the&amp;nbsp;browser.&lt;/p&gt;
&lt;p&gt;The idea: instead of context menus, &lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/user_interface/Page_actions"&gt;page actions&lt;/a&gt;, or other interaction points that are part of the &amp;#8220;chrome&amp;#8221;, implement one overlay interface: the do-something-with-this-page interface. Might also be do-something-with-this-element (e.g. replacing the 7 image-related context menu items: View Image, Copy Image, Copy Image Location, Save Image As, Email Image, Set As Desktop Background, and View Image&amp;nbsp;Info).&lt;/p&gt;
&lt;p&gt;The interface would be an overlay onto the page, similar to what happens when you start&amp;nbsp;Screenshots:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshots interface" src="/media/mockups/screenshot-interface-example-small.png"&gt;&lt;/p&gt;
&lt;p&gt;Everything that is now in the Page Action menu (the &lt;code&gt;...&lt;/code&gt; in the &lt;span class="caps"&gt;URL&lt;/span&gt; bar), or in the context menu, would be available here. Some items might have a richer interface, e.g., Send Tab To Device would show the devices directly instead of using a submenu. Bookmarking would include some inline &lt;span class="caps"&gt;UI&lt;/span&gt; for managing the resulting bookmark, and so&amp;nbsp;on.&lt;/p&gt;
&lt;p&gt;There was some pushback because of the &lt;a href="https://textslashplain.com/2017/01/14/the-line-of-death/"&gt;line of death&lt;/a&gt; – that is, the idea all trusted content must clearly originate from the browser chrome, and not the content area. I do not believe in the Line of Death, it&amp;#8217;s something users &lt;em&gt;could&lt;/em&gt; use to form trust, but I don&amp;#8217;t believe they &lt;em&gt;do&lt;/em&gt; use it (further user research&amp;nbsp;required).&lt;/p&gt;
&lt;p&gt;The general pattern is inspired by mobile interfaces which are typically much more modal than desktop interfaces. Modal interfaces have gotten a bad rap, I think somewhat undeserved: modal interfaces are also interfaces that guide you through processes, or ask you to explicitly dismiss the interface. It&amp;#8217;s not unreasonable to expect someone to finish what they&amp;nbsp;start.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#find-plus-one" id="find-plus-one"&gt;Find+1&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="mockup of Find + 1" src="/media/mockups/find-plus-1-start.gif"&gt;&lt;/p&gt;
&lt;p&gt;We have find-in-page but what about&amp;nbsp;find-in-anything-linked-from-this-page?&lt;/p&gt;
&lt;p&gt;Hit Cmd-Shift-F and you get an interface to do that. All the linked pages will be loaded in the background and as you search we show snippets of matching pages. Clicking on a snippet opens or focuses the tab and goes to where the search term was&amp;nbsp;found.&lt;/p&gt;
&lt;p&gt;I started experimenting in &lt;a href="https://github.com/ianb/find-plus-one"&gt;&lt;code&gt;find-plus-one&lt;/code&gt;&lt;/a&gt; and encountered some challenges: hidden tabs aren&amp;#8217;t good workers, loading pages in the background takes a lot of grinding in Firefox, and most links on pages are stupid (e.g., I don&amp;#8217;t want to search your Careers page). An important building block would be a way to identify the important (non-navigational) parts of a page. Maybe lighter-weight ways to load pages (in other projects I&amp;#8217;ve used &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP"&gt;&lt;span class="caps"&gt;CSP&lt;/span&gt;&lt;/a&gt; injection). The Copy Keeper concept did come about while I experimented with&amp;nbsp;this.&lt;/p&gt;
&lt;p&gt;A simpler implementation of this might simply do a text search of all your open tabs, which would be technically simpler and mostly an exercise in making a good representation of the&amp;nbsp;results.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#your-front-page" id="your-front-page"&gt;Your Front&amp;nbsp;Page&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="mockup of Your Front Page" src="/media/mockups/your-front-page-start.gif"&gt;&lt;/p&gt;
&lt;p&gt;Create a front page of news from the sites you already visit. Like an &lt;span class="caps"&gt;RSS&lt;/span&gt; reader, but prepopulated with your history. This creates an immediate well-populated&amp;nbsp;experience.&lt;/p&gt;
&lt;p&gt;My initial thought was to use ad hoc parsers for popular news sites, and at run an experiment with just a long whitelist of news&amp;nbsp;providers.&lt;/p&gt;
&lt;p&gt;I got the feedback: why not just use &lt;span class="caps"&gt;RSS&lt;/span&gt;? Good question: I thought &lt;span class="caps"&gt;RSS&lt;/span&gt; was kind of passé, but I hadn&amp;#8217;t looked for myself. I went on to do some analysis of &lt;span class="caps"&gt;RSS&lt;/span&gt;, and found it available for almost all news sites. The &lt;a href="https://developer.mozilla.org/en-US/docs/Archive/RSS/Getting_Started/Syndicating#Adding_the_.3Clink.3E"&gt;autodetection&lt;/a&gt; (&lt;code&gt;&amp;lt;link rel=alternate&amp;gt;&lt;/code&gt;) is &lt;em&gt;not&lt;/em&gt; as widely available, and it requires manual searching to find many feeds. Still &lt;span class="caps"&gt;RSS&lt;/span&gt; is a good way to get an up-to-date list of articles and their titles. Article content isn&amp;#8217;t well represented and other article metadata is inaccurate or malformed (e.g., there are no useful tags). So using &lt;span class="caps"&gt;RSS&lt;/span&gt; would be very reasonable discovery mechanism, but an &amp;#8220;&lt;span class="caps"&gt;RSS&lt;/span&gt; reader&amp;#8221; doesn&amp;#8217;t seem like a good direction on the current&amp;nbsp;web.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#page-archive" id="page-archive"&gt;Page&amp;nbsp;Archive&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is bringing back old functionality from Page Shot, a project of mine which morphed into &lt;a href="https://screenshots.firefox.com"&gt;Firefox Screenshots&lt;/a&gt;: save full &lt;span class="caps"&gt;DOM&lt;/span&gt; copies of pages. What used to be fairly novel is now well represented by several projects (e.g., &lt;a href="https://blog.webmemex.org/"&gt;WebMemex&lt;/a&gt; or &lt;a href="https://worldbrain.io/"&gt;World Brain Memex&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Unfortunately I have never been able to really make this kind of tool part of &lt;em&gt;my own&lt;/em&gt; day-to-day behavior, and I&amp;#8217;ve become skeptical it can work for a general populace. But maybe there&amp;#8217;s a way to package up this functionality that is more accessible, or happens more implicitly. I &lt;a href="https://github.com/ianb/pagearchive"&gt;forked a version of Page Shot as pagearchive&lt;/a&gt; a while ago, with this in mind, but I haven&amp;#8217;t (and likely won&amp;#8217;t) come back to&amp;nbsp;it.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#personal-historical-archive" id="personal-historical-archive"&gt;Personal Historical&amp;nbsp;Archive&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This isn&amp;#8217;t really a product idea, but instead an approach to developing&amp;nbsp;products.&lt;/p&gt;
&lt;p&gt;One can imagine many tools that directly interact or learn from the content of your browsing. There is both a privacy issue here and a privacy opportunity: looking at this data is creepy, but if the tools live in your user agent (that belongs to you and hosts your information locally) then it&amp;#8217;s not so&amp;nbsp;creepy.&lt;/p&gt;
&lt;p&gt;But it&amp;#8217;s really hard to make experiments on this because you need a bunch of data. If you build a tool that starts watching your browsing then it will only slowly build up interesting information. The actual information that is already saved in browser history is interesting, but in my experience it is too limited and of poor quality. For instance, it is quite hard to build up a navigational path from the history when you use multiple&amp;nbsp;tabs.&lt;/p&gt;
&lt;p&gt;A better iterative development approach would be one where you have a static set of all the information you might want, and you can apply tools to that information. If you find something good then later you can add new data collection to the browser, secure in the knowledge that it&amp;#8217;s going to find interesting&amp;nbsp;things.&lt;/p&gt;
&lt;p&gt;I spent quite a bit of effort on this, and produced &lt;a href="https://github.com/ianb/personal-history-archive"&gt;`personal-history-archive&lt;/a&gt;. It&amp;#8217;s something I still want to come back to. It&amp;#8217;s a bit of a mess, because at various times it was retrofitted to collect historical information, or collect it on an ongoing basis, or collected it when driven by a script. I also tried to build tools in parallel for doing analysis on the resulting&amp;nbsp;database.&lt;/p&gt;
&lt;p&gt;This is also a byproduct of experimentation with machine learning. I wanted to apply things I was learning to browser data, but the data I wanted wasn&amp;#8217;t there. I spent all my time collecting and cleaning data, and ended up spending only a small amount of time analyzing the data. I suspect I&amp;#8217;m not the only one who has done&amp;nbsp;this.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#navigational-breadcrumbs" id="navigational-breadcrumbs"&gt;Navigational&amp;nbsp;Breadcrumbs&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="mockup of Navigational Breadcrumbs" src="/media/mockups/navigational-breadcrumbs-start.gif"&gt;&lt;/p&gt;
&lt;p&gt;When I click on a link I lose the reminder of why I clicked on it. What on the previous page led me to click on this? Was I promised something? Are there sibling links that I might want to continue to directly instead of going back and selecting another&amp;nbsp;link?&lt;/p&gt;
&lt;p&gt;This tool would give you additional information about the page you are on, how you got there, and given where you came from, where you might go next. Would this be a sidebar? Overlay content? In a popup? I&amp;#8217;m not&amp;nbsp;sure.&lt;/p&gt;
&lt;p&gt;Example: using this, if I click on a link from Reddit I will be able to see the title of the Reddit post (which usually doesn&amp;#8217;t match the document title), and a link to comments on the page. If I follow a link from Twitter, I&amp;#8217;ll be able to see the Tweet I came&amp;nbsp;from.&lt;/p&gt;
&lt;p&gt;This could be interesting paired with link preview (like a tentative forward). Maybe the mobile browser &lt;a href="https://linkbubble.com/"&gt;Linkbubbles&lt;/a&gt; (now integrated into Brave) has some ideas to&amp;nbsp;offer.&lt;/p&gt;
&lt;p&gt;Technically this will use some of the techniques from Personal History Archive, which tracks link&amp;nbsp;sources.&lt;/p&gt;
&lt;p&gt;This is based on the train of thought I wrote down &lt;a href="https://news.ycombinator.com/item?id=17702206"&gt;in an &lt;span class="caps"&gt;HN&lt;/span&gt; comment&lt;/a&gt; – itself a response to &lt;a href="https://www.reinterpretcast.com/open-hypermedia"&gt;Freeing the Web from the Browser&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I want to try this still, and have started a repo &lt;a href="https://github.com/ianb/crossnav"&gt;&lt;code&gt;crossnav&lt;/code&gt;&lt;/a&gt; but haven&amp;#8217;t put anything there yet. I think even some naive approaches could work, just trying to detect the &lt;em&gt;category&lt;/em&gt; of link and the &lt;em&gt;related&lt;/em&gt; links (e.g., on Reddit the category is other submissions, and the related links are things like&amp;nbsp;comments).&lt;/p&gt;
&lt;h2&gt;&lt;a href="#copy-keeper" id="copy-keeper"&gt;Copy&amp;nbsp;Keeper&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="mockup of Copy Keeper" src="/media/mockups/copy-keeper-start.gif"&gt;&lt;/p&gt;
&lt;p&gt;A notebook/logbook that is filled in every time you copy from a web page. When you copy it records&amp;nbsp;(locally):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Text of&amp;nbsp;selection&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;HTML&lt;/span&gt; of&amp;nbsp;selection&lt;/li&gt;
&lt;li&gt;Screenshot of the block element around the&amp;nbsp;selection&lt;/li&gt;
&lt;li&gt;Text around&amp;nbsp;selection&lt;/li&gt;
&lt;li&gt;Page &lt;span class="caps"&gt;URL&lt;/span&gt; and nearest&amp;nbsp;anchor/id&lt;/li&gt;
&lt;li&gt;Page&amp;nbsp;title&lt;/li&gt;
&lt;li&gt;Datetime&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This overloads &amp;#8220;copy&amp;#8221; to mean&amp;nbsp;&amp;#8220;remember&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Clips would be searchable, and could be moved back to the clipboard in different forms (text, &lt;span class="caps"&gt;HTML&lt;/span&gt;, image, bibliographical reference, source &lt;span class="caps"&gt;URL&lt;/span&gt;). Maybe clips would be browsable in a sidebar (maybe the sidebar has to be open for copies to be collected), or clips could be browsed in a normal tab&amp;nbsp;(Library-style).&lt;/p&gt;
&lt;p&gt;I created a prototype in &lt;a href="https://github.com/ianb/copy-keeper"&gt;&lt;code&gt;copy-keeper&lt;/code&gt;&lt;/a&gt;. I thought it was interesting and usable, though whether it would actually get any use in practice I don&amp;#8217;t know. It&amp;#8217;s one of those tools that seems handy but requires effort, and as a result doesn&amp;#8217;t get&amp;nbsp;used.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#change-scout" id="change-scout"&gt;Change&amp;nbsp;Scout&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="mockup of Change Scout" src="/media/mockups/change-scout-start.gif"&gt;&lt;/p&gt;
&lt;p&gt;(Wherein I both steal a &lt;a href="https://www.businessinsider.com/mozilla-scout-voice-controlled-browser-2018-6"&gt;name from another team&lt;/a&gt;, and turn it into a&amp;nbsp;category&amp;#8230;)&lt;/p&gt;
&lt;p&gt;Change Scout will monitor a page for you, and notify you when it changes. Did someone edit the document? Was there activity on an issue? Did an article get updated? Put Change Scout to track it and it will tell you what changes and&amp;nbsp;when.&lt;/p&gt;
&lt;p&gt;It would monitor the page inside the browser, so it would have access to personalized and authenticated content. A key task would be finding ways to present changes in an interesting and compact way. In another experiment I tried some very simple change detection tools, and mostly end up frustrated (small changes look very large to naive&amp;nbsp;algorithms).&lt;/p&gt;
&lt;h2&gt;&lt;a href="#popup-tab-switcher" id="popup-tab-switcher"&gt;Popup Tab&amp;nbsp;Switcher&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Tab Switcher mockup" src="/media/mockups/tab-switcher-start.gif"&gt;&lt;/p&gt;
&lt;p&gt;We take the exact &lt;span class="caps"&gt;UI&lt;/span&gt; of the &lt;a href="https://github.com/mozilla/side-view"&gt;Side View&lt;/a&gt; popup, but make it a tab switcher. &amp;#8220;Recent Tabs&amp;#8221; are the most recently focused tabs (weighted somewhat by how long you were on the tab), and then there&amp;#8217;s the complete scrollable list. Clicking on an item simply focuses that tab. You can close tabs without focusing&amp;nbsp;them.&lt;/p&gt;
&lt;p&gt;I made a prototype in &lt;a href="https://github.com/ianb/tab-switchr"&gt;&lt;code&gt;tab-switchr&lt;/code&gt;&lt;/a&gt;. In it I also added some controls to close tabs, which was very useful for my periodic tab cleanups. Given that it was a proactive tool, I surprised myself by using it frequently. There&amp;#8217;s work in Firefox to improve this, unrelated to anything I&amp;#8217;ve done. It reminds me a bit of various &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/tree-style-tab/"&gt;Tree-Style Tabs&lt;/a&gt;, which I both like because they make it easier to see my tabs, and dislike because I ultimately am settled on normal top-tabs. The popup interface is less radical but still provides many of the&amp;nbsp;benefits.&lt;/p&gt;
&lt;p&gt;I should probably clean this up a little and publish&amp;nbsp;it.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#personal-podcast" id="personal-podcast"&gt;Personal&amp;nbsp;Podcast&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Create your own &lt;span class="caps"&gt;RSS&lt;/span&gt;&amp;nbsp;feed.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When you are on a page with some audio source, you can add the audio to your personal&amp;nbsp;feed&lt;/li&gt;
&lt;li&gt;When on an article, you can generate an audio version that will be added to the&amp;nbsp;feed&lt;/li&gt;
&lt;li&gt;You get an &lt;span class="caps"&gt;RSS&lt;/span&gt; feed with a random token to make it private (I don&amp;#8217;t think podcast apps handle authentication well, but this requires&amp;nbsp;research)&lt;/li&gt;
&lt;li&gt;Maybe you can just send/text the link to add it to your preferred podcast&amp;nbsp;app&lt;/li&gt;
&lt;li&gt;If apps don&amp;#8217;t accept &lt;span class="caps"&gt;RSS&lt;/span&gt; links very well, maybe something more complicated would be required. An app that just installs an &lt;span class="caps"&gt;RSS&lt;/span&gt; feed? We want to avoid the feed accidentally ending up in podcast&amp;nbsp;directories.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="#bookmark-manager" id="bookmark-manager"&gt;Bookmark&amp;nbsp;Manager&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There&amp;#8217;s a lot of low-rated bookmark managers in addons.mozilla.org and the Chrome Extension store. Let&amp;#8217;s make our own low-rated bookmark&amp;nbsp;manager!&lt;/p&gt;
&lt;p&gt;But seriously, this would anticipate updates to the Library and built-in bookmark manager, which are&amp;nbsp;deficient.&lt;/p&gt;
&lt;p&gt;Some resources/ideas:
* &lt;a href="https://news.ycombinator.com/item?id=17072803"&gt;Comment with a few gripes&lt;/a&gt;
* &lt;a href="https://chrome.google.com/webstore/detail/bookmark-manager/gmlllbghnfkpflemihljekbapjopfjik?hl=en"&gt;Google&amp;#8217;s bookmark manager&lt;/a&gt;
* &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/bookmarks-manager-and-viewer/?src=search"&gt;Bookmark section on addons.mozilla.org&lt;/a&gt;
* &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/bookmarks-organizer/?src=search"&gt;Bookmark organizers on addons.mozilla.org&lt;/a&gt;
* &lt;a href="https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/bookmarks"&gt;Relevant WebExtension&amp;nbsp;APIs&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;a href="#extended-library" id="extended-library"&gt;Extended&amp;nbsp;Library&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="mockup of the Extended Library" src="/media/mockups/extended-library-start.gif"&gt;&lt;/p&gt;
&lt;p&gt;The &amp;#8220;Library&amp;#8221; in Firefox is the combination history and bookmark browser you get if you use &amp;#8220;Show all bookmarks&amp;#8221; or &amp;#8220;Show all&amp;nbsp;history&amp;#8221;.&lt;/p&gt;
&lt;p&gt;In this idea we present the user with a record of their &lt;strong&gt;assets&lt;/strong&gt;, wherever they&amp;nbsp;are.&lt;/p&gt;
&lt;p&gt;This is like a history view (and would be built from history), but would use heuristics to pick out certain kinds of things: docs you&amp;#8217;ve edited, screenshots you&amp;#8217;ve taken, tickets you&amp;#8217;ve opened, etc. We&amp;#8217;d be trying hard to find long-lived documents in your history, instead of transitional navigation, articles, things you&amp;#8217;ve gotten to from public indexes,&amp;nbsp;etc.&lt;/p&gt;
&lt;p&gt;Automatically determining what should be tagged as a &amp;#8220;library item&amp;#8221; would be the hard part. But I think having an organic view of these items, regardless of underlying service, would be quite valuable. The browser has access to all your services, and it&amp;#8217;s easy to forget what service hosts the thing you are thinking&amp;nbsp;about.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#text-mobile-screenshot" id="text-mobile-screenshot"&gt;Text Mobile&amp;nbsp;Screenshot&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img alt="mockup of Text Mobile Screenshot" src="/media/mockups/text-mobile-screenshot-start.gif"&gt;&lt;/p&gt;
&lt;p&gt;This tool will render the tab in a mobile factor (using the devtools &lt;a href="https://developer.mozilla.org/en-US/docs/Tools/Responsive_Design_Mode"&gt;responsive design mode&lt;/a&gt;), take a full-page screenshot, and text the image and &lt;span class="caps"&gt;URL&lt;/span&gt; to a given number. Probably it would only support texting to&amp;nbsp;yourself.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve looked into this some, and getting the mobile view of a page is not entirely obvious and requires digging around deep in the browser. Devtools does some complicated stuff to display the mobile view. The rest is basic &lt;span class="caps"&gt;UI&lt;/span&gt; flows and operational&amp;nbsp;support.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#email-readable" id="email-readable"&gt;Email&amp;nbsp;Readable&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Emails the Reader Mode version of a site to yourself. In our research, people love to store things in Email, so why&amp;nbsp;not?&lt;/p&gt;
&lt;p&gt;Though it lacks the simplicity of this concept, &lt;a href="https://github.com/mozilla/email-tabs"&gt;Email Tabs&lt;/a&gt; contains this basic functionality. &lt;a href="https://www.emailthis.me/"&gt;Email This&lt;/a&gt; does almost exactly&amp;nbsp;this.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#your-history-everywhere" id="your-history-everywhere"&gt;Your History&amp;nbsp;Everywhere&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;An extension that finds and syncs your history between browsers (particularly between Chrome and&amp;nbsp;Firefox).&lt;/p&gt;
&lt;p&gt;This would use the &lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history"&gt;history WebExtension APIs&lt;/a&gt;. Maybe we could create a &lt;a href="https://en.wikipedia.org/wiki/Firefox_Sync"&gt;Firefox Sync&lt;/a&gt; client in Chrome. Maybe it could be a general way to move things between browsers. Actual synchronization is hard, but creating read-only views into the data in another browser profile is much&amp;nbsp;easier.&lt;/p&gt;
&lt;p&gt;Obviously there&amp;#8217;s lots of work to synchronize this data between Firefox properties, and knowing the work involved this isn&amp;#8217;t easy and often involves close work with the underlying platform. Without full access to the platform (like on Chrome) we&amp;#8217;ll have to find ways to simplify the problem in order to make it&amp;nbsp;feasible.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#my-homepage" id="my-homepage"&gt;My&amp;nbsp;Homepage&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Everyone (with an &lt;a href="https://www.mozilla.org/en-US/firefox/accounts/"&gt;FxA account&lt;/a&gt;) gets there own homepage on the web. It&amp;#8217;s like Geocities! Or maybe closer to&amp;nbsp;github.io.&lt;/p&gt;
&lt;p&gt;But more seriously, it would be programmatically accessible simple static hosting. Not just for you to write your own homepage, but an open way for applications to publish user content, without those applications themselves turning into hosting platforms. We&amp;#8217;d absorb all the annoyances of hosting content (abuse, copyright, quotas, ops, financing) and let open source developers focus on enabling interesting content generation experiences for users on the open&amp;nbsp;web.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.ianbicking.org/blog/2019/01/we-need-open-hosting-platforms.html"&gt;Here&amp;#8217;s a general argument&lt;/a&gt; why I think this would be a useful thing for us to do. &lt;a href="https://blog.lmorchard.com/2014/10/09/separating-publishing-from-hosting-on-the-web/"&gt;And another from Les Orchard&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#studying-electron" id="studying-electron"&gt;Studying what Electron does for&amp;nbsp;people&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is a proposal for user&amp;nbsp;research:&lt;/p&gt;
&lt;p&gt;Electron apps are being shipped for many services, including services that don&amp;#8217;t require any special system integration. E.g., Slack doesn&amp;#8217;t require anything that a web browser can&amp;#8217;t do. Spotify maybe catches some play/pause keys, but is very close to being a web site. Yet there is perceived value in having an&amp;nbsp;app.&lt;/p&gt;
&lt;p&gt;The user research would focus on cases where the Electron app doesn&amp;#8217;t have any/many special permissions. What gives the app value over the web&amp;nbsp;page?&lt;/p&gt;
&lt;p&gt;The goal would be to understand the motivations and constraints of users, so we could consider ways to make the in-browser experience equally pleasant to the Electron&amp;nbsp;app.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#app-quick-switcher" id="app-quick-switcher"&gt;App quick&amp;nbsp;switcher&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Per my previous item: why do I have an &lt;a href="https://www.irccloud.com/"&gt;IRCCloud&lt;/a&gt; app? Why do people use Slack apps? Maybe it&amp;#8217;s just because they want to be able to switch into and out of those apps&amp;nbsp;quickly.&lt;/p&gt;
&lt;p&gt;A proposed product solution: add a shortcut to any specific (pinned?) tab. Might be autocreated. Using the shortcut when the app is already selected will switch you back to your previous-selected tab. Switching to the tab without the shortcut will display a gentle reminder that the shortcut exists (so you can train yourself to start using&amp;nbsp;it).&lt;/p&gt;
&lt;p&gt;To make it a little more fancy, I thought we might also be able to do a second related &amp;#8220;preview&amp;#8221; shortcut. This would let you peek into the window. I&amp;#8217;m not sure what &amp;#8220;peeking&amp;#8221; means. Maybe we just show a popup with a screenshot of that other&amp;nbsp;window.&lt;/p&gt;
&lt;p&gt;Maybe this should all just overload ⌘1/2/3 (maybe shift-⌘1/etc for peeking). Note these shortcuts do not currently have memory – you can switch &lt;em&gt;to&lt;/em&gt; the first tab with ⌘1, but you can&amp;#8217;t switch&amp;nbsp;back.&lt;/p&gt;
&lt;p&gt;This is one suggested solution to &lt;em&gt;Whatever Electron does for people&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I started some work in &lt;a href="https://github.com/ianb/quick-switch-extension"&gt;&lt;code&gt;quick-switch-extension&lt;/code&gt;&lt;/a&gt;, but keyboard shortcuts were a bit wonky, and I couldn&amp;#8217;t figure out useful additional functionality that would make it fun. Firefox (Nightly?) now has Ctrl-Tab functionality that takes you to recent tabs, mitigating this problem (though it is not nearly as predictable as what I propose&amp;nbsp;here).&lt;/p&gt;
&lt;h2&gt;&lt;a href="#just-save" id="just-save"&gt;Just&amp;nbsp;Save&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Just Save saves a page. It&amp;#8217;s like a bookmark. Or a remembering. Or an archive. Or all of those all at&amp;nbsp;once.&lt;/p&gt;
&lt;p&gt;Just Save is a one-click operation, though a popup does show up (similar in function to Pocket) that would allow some additional annotation of your saved&amp;nbsp;page.&lt;/p&gt;
&lt;p&gt;We save:
1. Link
2. Title
3. Standard metadata
4. Screenshot
5. Frozen version of page
6. Scroll position
7. The tab history
8. Remember the other open tabs, so if some of them are saved we offer later relations between them
9. Time the page was saved
10. Query terms that led to the&amp;nbsp;page&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s like bookmarks, but purely focused on saving, while bookmarks do double-duty as a navigational tool. The tool encourages after-the-fact discovery and organization, not at-the-time-of-save&amp;nbsp;choices.&lt;/p&gt;
&lt;p&gt;And of course there&amp;#8217;s a way to find and manage your saved pages. This idea needs more exploration of &lt;em&gt;why&lt;/em&gt; you would return to a page or piece of information, and thus what we&amp;#8217;d want to expose and surface from your history. We&amp;#8217;ve &lt;a href="https://blog.mozilla.org/ux/2015/02/save-share-revisit/"&gt;done research&lt;/a&gt;, but it&amp;#8217;s really just a&amp;nbsp;start.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#open-search-combined-search" id="open-search-combined-search"&gt;Open Search Combined&amp;nbsp;Search&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We have several &lt;a href="https://dxr.mozilla.org/mozilla-central/source/browser/components/search/searchplugins"&gt;open search providers&lt;/a&gt;. How many exist out there? How many could we find in&amp;nbsp;history?&lt;/p&gt;
&lt;p&gt;In theory &lt;a href="https://developer.mozilla.org/en-US/docs/Web/OpenSearch"&gt;Open Search is an &lt;span class="caps"&gt;API&lt;/span&gt;&lt;/a&gt; where a user could do personalized search across many properties, though I&amp;#8217;m not sure if any sufficient number of sites has enabled&amp;nbsp;it.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#notes-commander" id="notes-commander"&gt;Notes&amp;nbsp;Commander&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;It&amp;#8217;s &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/notes-by-firefox/"&gt;Notes&lt;/a&gt;, but with &lt;a href="https://api.slack.com/slash-commands"&gt;slash commands&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I other words it&amp;#8217;s a document, but if you complete a line that begins with a &lt;code&gt;/&lt;/code&gt; then it will try to execute that command, appending or overwriting from that&amp;nbsp;point.&lt;/p&gt;
&lt;p&gt;So for instance &lt;code&gt;/timestamp&lt;/code&gt; just replaces itself with a&amp;nbsp;timestamp.&lt;/p&gt;
&lt;p&gt;Maybe &lt;code&gt;/page&lt;/code&gt; inserts the currently active tab. &lt;code&gt;/search foo&lt;/code&gt; puts search results into the document, but as editable (and followable) links. &lt;code&gt;/page save&lt;/code&gt; freezes the page as one big data link, and inserts that link into the&amp;nbsp;note.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s a little like Slack, but in document form, and with the browser as the context instead of a messaging platform. It&amp;#8217;s a little like a notebook programming interface, but less structured and more&amp;nbsp;document-like.&lt;/p&gt;
&lt;p&gt;The ability to edit the &lt;em&gt;output&lt;/em&gt; of commands is particularly interesting to me, and represents the kind of ad hoc information organizing that we all do&amp;nbsp;regularly.&lt;/p&gt;
&lt;p&gt;I experimented some with this in Notes, and got it working a little bit, but working with CKEditor (that Notes is built on) was just awful and I couldn&amp;#8217;t get anything to work well. Notes also has a very limited set of supported content (no images or links), which was problematic. Maybe it&amp;#8217;s worth doing it from scratch (with &lt;a href="http://prosemirror.net/"&gt;ProseMirror&lt;/a&gt; or &lt;a href="https://github.com/ianstormtaylor/slate"&gt;Slate&lt;/a&gt;?)&lt;/p&gt;
&lt;p&gt;After I tried to mock this up, I realized that the underlying model is much too unclear in my mind. What&amp;#8217;s this for? &lt;em&gt;When&lt;/em&gt; is it for? What would a list of commands look&amp;nbsp;like?&lt;/p&gt;
&lt;p&gt;Another thing I realized while attempting a mockup is that there should be a rich but normalized way to represent pages and URLs and so forth. Often you&amp;#8217;ll be referring to URLs of pages that are already open. You may want to open sets of pages, or see immediately which URLs are already open in a tab. A frozen version of a page should be clearly linked to the source of that page, which of course could be an open tab. There&amp;#8217;s a lot of pieces to fit together here, both common nouns and verbs, all of which interact with the browser session&amp;nbsp;itself.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#automater" id="automater"&gt;Automater&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Automation and scripting for your browser: make demonstrations for your browser, give it a name, and you have a repeatable&amp;nbsp;script.&lt;/p&gt;
&lt;p&gt;The scripts will happen in the browser itself, not via any backend or scraping tool. In case of failed expectations or changed sites, the script will halt and tell the&amp;nbsp;user.&lt;/p&gt;
&lt;p&gt;Scripts could be as simple as &amp;#8220;open a new tab pointing to this page every weekday at 9am&amp;#8221;, or could involve clipping information, or just doing a navigational pattern before presenting the page to a&amp;nbsp;user.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a huge amount of previous work in this area. I think the challenge here is to create something that &lt;em&gt;doesn&amp;#8217;t&lt;/em&gt; look like a programming language displayed in a&amp;nbsp;table.&lt;/p&gt;
&lt;h2&gt;&lt;a href="#sidekick" id="sidekick"&gt;Sidekick&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Sidekick is a sidebar interface to anything, or everything, contextually. Some things it might&amp;nbsp;display:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show you the state of your&amp;nbsp;clipboard&lt;/li&gt;
&lt;li&gt;Show you how you got to the current tab (similar to &lt;a href="#navigational-breadcrumbs"&gt;Navigational Breadcrumbs&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Show you other items from the search query that kicked off the current&amp;nbsp;tab&lt;/li&gt;
&lt;li&gt;Give quick navigation to nearby pages, given the referring page (e.g., the next link, or next set of&amp;nbsp;links)&lt;/li&gt;
&lt;li&gt;Show you buttons to activate other tabs you are likely to switch to from the current&amp;nbsp;tab&lt;/li&gt;
&lt;li&gt;Show shopping recommendations or other content-aware&amp;nbsp;widgets&lt;/li&gt;
&lt;li&gt;Let you save little tidbits (text, links, etc), like an extended clipboard or&amp;nbsp;notepad&lt;/li&gt;
&lt;li&gt;Show notifications you&amp;#8217;ve recently&amp;nbsp;received&lt;/li&gt;
&lt;li&gt;Peek into other tabs, or load them inline somewhat like &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/side-view/"&gt;Side&amp;nbsp;View&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Checklists and&amp;nbsp;todos&lt;/li&gt;
&lt;li&gt;Copy a bunch of links into the sidebar, then treat them like a&amp;nbsp;todo/queue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Possibly it could be treated like an extensible widget&amp;nbsp;holder.&lt;/p&gt;
&lt;p&gt;From another perspective: this is like a continuous contextual feature recommender. I.e., it would try to answer the question: what&amp;#8217;s the feature you could use right&amp;nbsp;now?&lt;/p&gt;
&lt;h2&gt;&lt;a href="#timed-repetition" id="timed-repetition"&gt;Timed&amp;nbsp;Repetition&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Generally in order to commit something to long-term memory you must revisit information later, ideally long enough that it&amp;#8217;s a&amp;nbsp;struggle.&lt;/p&gt;
&lt;p&gt;Is anything we see in a browser worth committing to long-term memory? Sometimes it feels like nothing is worth remembering, but that&amp;#8217;s a kind of nihilism based on the shitty aspects of typical web browsing&amp;nbsp;behavior.&lt;/p&gt;
&lt;p&gt;The interface would require some positive assertion: I want to know this. Probably you&amp;#8217;d want to highlight the thing you&amp;#8217;d &amp;#8220;know&amp;#8221;. Then, later, we&amp;#8217;d want to come up with some challenge. We don&amp;#8217;t need a &amp;#8220;real&amp;#8221; test that is verified by the browser, instead we simply need to ask some related question, then the user can say if they got it right or not (or remembered it or&amp;nbsp;not).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More information on the general technique in the &lt;a href="https://en.wikipedia.org/wiki/Spaced_repetition"&gt;Spaced Repetition Wikipedia article&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Incremental_reading"&gt;Incremental Reading&lt;/a&gt; is an approach to information consumption paired with flashcard&amp;nbsp;review.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apps.ankiweb.net/"&gt;Anki&lt;/a&gt; is the most prominent open source software in this area.  Oddly while there is a lot of WebExtension-based intake software for it, the actual testing is primarily done in a native&amp;nbsp;app.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://sansforgetica.rmit/"&gt;A bizarre hard-to-read font&lt;/a&gt; meant to aid in&amp;nbsp;memory.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="#reader-mode-improvements" id="reader-mode-improvements"&gt;Reader Mode&amp;nbsp;improvements&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Reader mode is a bit spartan. Maybe it could be a bit&amp;nbsp;nicer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pick up some styles or backgrounds from the hosting&amp;nbsp;site&lt;/li&gt;
&lt;li&gt;Display images or other media differently or more&amp;nbsp;prominently&lt;/li&gt;
&lt;li&gt;Add back some markup or layout that Readability&amp;nbsp;erases&lt;/li&gt;
&lt;li&gt;Apply to some other kinds of sites that aren&amp;#8217;t articles (e.g., a video&amp;nbsp;site)&lt;/li&gt;
&lt;li&gt;A multicolumn version like &lt;a href="https://anoved.github.io/mcreadability/"&gt;McReadability&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;a href="#digest-mode" id="digest-mode"&gt;Digest&amp;nbsp;Mode&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Inspired by &lt;a href="http://www.fullhn.com/"&gt;Full Hacker News&lt;/a&gt; (&lt;a href="https://news.ycombinator.com/item?id=18132281"&gt;comments&lt;/a&gt;): take a bunch of links (typically articles) and concatenate their content into one&amp;nbsp;page.&lt;/p&gt;
&lt;p&gt;Implicitly this requires Reader Mode parsing of the pages, though that is relatively cheap for &amp;#8220;normal&amp;#8221; articles. Acquiring a list of pages is somewhat less clear. Getting a list of pages is a kind of news/&lt;span class="caps"&gt;RSS&lt;/span&gt; question. Taking a page &lt;em&gt;like&lt;/em&gt; Hacker News and figuring out what the &amp;#8220;real&amp;#8221; links are is another approach that may be interesting. Lists of related links are everywhere, yet hard to formally&amp;nbsp;define.&lt;/p&gt;
&lt;p&gt;This would work very nicely with complementary text&amp;nbsp;summarization.&lt;/p&gt;
&lt;p&gt;Open question: is this actually an interesting or useful way to consume&amp;nbsp;information?&lt;/p&gt;
&lt;h2&gt;&lt;a href="#firefox-for-x" id="firefox-for-x"&gt;Firefox for&amp;nbsp;X&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;There&amp;#8217;s an underlying concept here worth&amp;nbsp;explaining:&lt;/p&gt;
&lt;p&gt;Feature develop receives a lot of skepticism. And it&amp;#8217;s reasonable: there&amp;#8217;s a lot of conceit in a feature, especially embedded in a large product. Are people going to use a product or not because of some little feature? Or maybe the larger challenge: can some feature actually change behavior? Every person has their own thing going on, people aren&amp;#8217;t interested in our theories, and really not that many people are interested in browsers. Familiar functionality – the back button, bookmarks, the &lt;span class="caps"&gt;URL&lt;/span&gt; bar, etc. – are what they expect, what they came for, and what they will gravitate to. Everything I&amp;#8217;ve written so far in this list are things &lt;em&gt;people won&amp;#8217;t actually use&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;A browser is particularly problematic because it&amp;#8217;s so universal. It&amp;#8217;s for sites and apps and articles. It&amp;#8217;s for the young and the elderly, the experienced and not. It&amp;#8217;s used for serious things, it&amp;#8217;s used for concentration, and it&amp;#8217;s used for dumb things and to avoid concentrating. How can you build a feature for everyone, targeting anything they might do? And if you build something, how can a person trust a new feature is really for &lt;em&gt;them&lt;/em&gt;, not some other person? People are right to be skeptical of the&amp;nbsp;new!&lt;/p&gt;
&lt;p&gt;But we also know that most people regularly use more than one browser. Some people use Chrome for personal stuff, and Firefox for work. Some people do the exact opposite. Some people do their banking and finance in a specific browser. Some use a specific browser just for watching&amp;nbsp;videos.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Which&lt;/em&gt; browser a person uses for which task is seemingly random. Maybe they were told to use a specific browser for one task, and then the other browser became the fallback. Maybe they once heard somewhere once that one browser was more secure. Maybe flash seemed broken on one browser when they were watching a video, and now a pattern has been&amp;nbsp;set.&lt;/p&gt;
&lt;p&gt;This has long seemed like an opportunity to me. Market a browser that actually claims to be the right browser for some of these purposes! Firefox has &lt;a href="https://www.mozilla.org/en-US/firefox/developer/"&gt;Developer Edition&lt;/a&gt; and it&amp;#8217;s been reasonably&amp;nbsp;successful.&lt;/p&gt;
&lt;p&gt;This offers an opportunity for both Mozilla and Firefox users to agree on &lt;strong&gt;purpose&lt;/strong&gt;. What is Firefox for? Everything! Is this feature meant for &lt;em&gt;you&lt;/em&gt;? Unlikely! In a purpose-built browser both sides can agree what it&amp;#8217;s trying to&amp;nbsp;accomplish.&lt;/p&gt;
&lt;p&gt;This idea often gets poo-pooed for how much work it is, but I think it&amp;#8217;s simpler than it seems. Here&amp;#8217;s what a &amp;#8220;new browser&amp;#8221;&amp;nbsp;means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Something you can find and download from its own page or&amp;nbsp;site&lt;/li&gt;
&lt;li&gt;It&amp;#8217;s Firefox, but uses its own &lt;a href="https://support.mozilla.org/en-US/kb/profiles-where-firefox-stores-user-data"&gt;profile&lt;/a&gt;, keeping history/etc separate from other browser instances (including&amp;nbsp;Firefox)&lt;/li&gt;
&lt;li&gt;It has its own name and icon, and probably a theme to make it obvious what browser you are&amp;nbsp;in&lt;/li&gt;
&lt;li&gt;It comes with some browser extensions and prefs changed, making it more appropriate for the proposed use&amp;nbsp;case&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The approach is heavy on marketing and build tools, and light on actual browser&amp;nbsp;engineering.&lt;/p&gt;
&lt;p&gt;I also have gotten frequent feedback that &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/multi-account-containers/"&gt;Multi-Account Containers&lt;/a&gt; should solve all these use cases, but that gets everything backwards. People already understand multiple browsers, and having completely new entry points to bring people to Firefox is a feature, not a&amp;nbsp;bug.&lt;/p&gt;
&lt;p&gt;Sadly I think the time for this has passed, maybe in the market generally or maybe just for Mozilla. It would have been a very different approach to the&amp;nbsp;browser.&lt;/p&gt;
&lt;p&gt;Some of us in the Test Pilot team had some good brainstorming around actual concepts too, which is where I actually get excited about the&amp;nbsp;ideas:&lt;/p&gt;
&lt;h3&gt;&lt;a href="#firefox-study" id="firefox-study"&gt;Firefox&amp;nbsp;Study&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;For students,&amp;nbsp;studying.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Integrate note-taking&amp;nbsp;tools&lt;/li&gt;
&lt;li&gt;Create project and class-based organizational tools, helping to organize tabs, bookmarks, and&amp;nbsp;notes&lt;/li&gt;
&lt;li&gt;Tools to document and organize&amp;nbsp;deadlines&lt;/li&gt;
&lt;li&gt;Citation&amp;nbsp;generators&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don&amp;#8217;t know &lt;em&gt;what&lt;/em&gt; to do with online lectures and video, but it feels like there&amp;#8217;s some meaningful improvements to be done in that space. Video-position-aware notetaking&amp;nbsp;tools?&lt;/p&gt;
&lt;p&gt;I think the intentionality of opening a browser to study is a good thing. iPads are somewhat popular in education, and I suspect part of that is having a device that isn&amp;#8217;t built around multitasking, and using an iPad means stepping away from regular&amp;nbsp;computing.&lt;/p&gt;
&lt;h3&gt;&lt;a href="#firefox-media" id="firefox-media"&gt;Firefox&amp;nbsp;Media&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;To watch videos. This requires very few features, but benefits from just being a separate profile, history, and&amp;nbsp;icon.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a small number of features that might be&amp;nbsp;useful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-service search (like &lt;a href="http://www.canistream.it/"&gt;Can I Stream.it&lt;/a&gt; or &lt;a href="https://www.justwatch.com/"&gt;JustWatch&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Search defaults to video&amp;nbsp;search&lt;/li&gt;
&lt;li&gt;Cross-service&amp;nbsp;queue&lt;/li&gt;
&lt;li&gt;Quick service-based&amp;nbsp;navigation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I realize it&amp;#8217;s a lot like Roku in an&amp;nbsp;app.&lt;/p&gt;
&lt;h3&gt;&lt;a href="#firefox-for-finance" id="firefox-for-finance"&gt;Firefox for&amp;nbsp;Finance&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;This is really just about&amp;nbsp;security.&lt;/p&gt;
&lt;p&gt;Funny story: people say they value security very highly. But if Mozilla wants to make changes in Firefox that increase security but break some sites – particularly insecure sites – people will then stop using Firefox. They value security highly, but still just below &lt;em&gt;anything at all breaking&lt;/em&gt;. This is very frustrating for&amp;nbsp;us.&lt;/p&gt;
&lt;p&gt;At the same time, I kind of get it. I&amp;#8217;m dorking around on the web and I click through to some dumb site, and I get a big ol&amp;#8217; warning or a blank page or some other weirdness. I didn&amp;#8217;t even care about the page or its security, and here my browser is trying to make me&amp;nbsp;care.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s true some of the time, but not others. If you are using Firefox for Finance, or Firefox Super Secure, or whatever we might call it, then you really do&amp;nbsp;care.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a second kind of security implied here as well: security from snooping eyes and on shared computers. &lt;a href="https://support.mozilla.org/en-US/kb/use-master-password-protect-stored-logins"&gt;Firefox Master Password&lt;/a&gt; is a useful feature here. Generally there&amp;#8217;s an opportunity for secure data at&amp;nbsp;rest.&lt;/p&gt;
&lt;p&gt;This is also a vehicle for education in computer security, with an audience that we know is&amp;nbsp;interested.&lt;/p&gt;
&lt;h3&gt;&lt;a href="#firefox-low-bandwidth" id="firefox-low-bandwidth"&gt;Firefox Low&amp;nbsp;Bandwidth&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Maybe we work with proxy services. Or just do lots of content blocking. In this browser we let content break (and give a control to load the full content), so long as you start out&amp;nbsp;compact.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cache content that isn&amp;#8217;t really supposed to be&amp;nbsp;cached&lt;/li&gt;
&lt;li&gt;Don&amp;#8217;t load some kinds of&amp;nbsp;content&lt;/li&gt;
&lt;li&gt;Block fonts and other seemingly-unimportant&amp;nbsp;content&lt;/li&gt;
&lt;li&gt;Monitoring tools to see where bandwidth usage is&amp;nbsp;going&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a href="#firefox-for-kids" id="firefox-for-kids"&gt;Firefox for&amp;nbsp;Kids&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Sadly making things for kids is hard, because you are obliged to do all sorts of things if you claim to target children, but you don&amp;#8217;t have to do anything if kids just happen to use your&amp;nbsp;tool.&lt;/p&gt;
&lt;p&gt;There is an industry of tools in this area that I don&amp;#8217;t fully understand, and I&amp;#8217;d want to research before thinking about a feature list. But it seems like it comes down to three&amp;nbsp;things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Blocking problematic&amp;nbsp;content&lt;/li&gt;
&lt;li&gt;Encouraging positive&amp;nbsp;content&lt;/li&gt;
&lt;li&gt;Monitoring tools for&amp;nbsp;parents&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&amp;#8217;s something very uninspiring about that list, it feels like it&amp;#8217;s long on negativity and short on positive engagement. Coming up with an answer to that is not a simple&amp;nbsp;task.&lt;/p&gt;
&lt;h3&gt;&lt;a href="#firefox-calm" id="firefox-calm"&gt;Firefox&amp;nbsp;Calm&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Inspired by a bunch of&amp;nbsp;things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://humanetech.com/"&gt;Humane&amp;nbsp;Tech&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.getsiempo.com/"&gt;Siempo&lt;/a&gt; (&lt;a href="https://techcrunch.com/2018/05/19/siempos-new-app-will-break-your-smartphone-addiction/"&gt;some coverage&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/grayscale-the-web-save-si/mblmpdpfppogibmoobibfannckeeleag"&gt;Grayscale&amp;nbsp;extension&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chrome.google.com/webstore/detail/text-mode/adelhekhakakocomdfejiipdnaadiiib"&gt;Text only mode&amp;nbsp;extension&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sticky-reader-mode"&gt;Sticky Reader&amp;nbsp;Mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What would a calm Firefox experience look like? Or maybe it would be better to think about a calm presentation of the web. At some point I wrote out some short&amp;nbsp;pitches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read without distraction: Read articles like they are articles, not interactive (and manipulative)&amp;nbsp;experiences.&lt;/li&gt;
&lt;li&gt;Stay focused on one thing at a time: Instead of a giant list of tabs and alerts telling you what we aren&amp;#8217;t doing, automatically focus on the one thing you are doing right&amp;nbsp;now.&lt;/li&gt;
&lt;li&gt;Control your notifications: Instead of letting any site poke at you for any reason, notifications are kept to a minimum and&amp;nbsp;batched.&lt;/li&gt;
&lt;li&gt;Focused writing: When you need to focus on what you are saying, not what people are saying to you, enter focused writing&amp;nbsp;mode.&lt;/li&gt;
&lt;li&gt;Get updates without falling down a news hole: Avoid clickbait, don&amp;#8217;t reload pages, just see updates from the sites you trust (relates to &lt;a href="#your-front-page"&gt;Your Front Page&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Pomodoro: let yourself get distracted&amp;#8230; but only a little bit. The Pomodoro technique helps you switch between periods of focused work and letting yourself&amp;nbsp;relax&lt;/li&gt;
&lt;li&gt;Don&amp;#8217;t even ask: Do you want notifications from the news site you visited once? Do you want videos to autoplay? Of course not, and we&amp;#8217;ll stop even&amp;nbsp;asking.&lt;/li&gt;
&lt;li&gt;Suggestion-free browsing: Every page you look at isn&amp;#8217;t an invitation to tell you what you should look at next. Remove suggested content, and do what &lt;span class="caps"&gt;YOU&lt;/span&gt; want to do next. (&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/remove-youtube-s-suggestions/"&gt;YouTube example&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;&lt;a href="#conclusion" id="conclusion"&gt;Concluding&amp;nbsp;thoughts&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Not just the conclusion of this list, the conclusion of my work in this&amp;nbsp;area&amp;#8230;&lt;/p&gt;
&lt;p&gt;Some challenges in the design&amp;nbsp;process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Asking someone to &lt;em&gt;do&lt;/em&gt; something new is hard, and unlikely to happen. My previous post (&lt;a href="http://www.ianbicking.org/blog/2019/01/overengaged-knowledge-worker.html"&gt;The Over-engaged Knowledge Worker&lt;/a&gt;) relates to this&amp;nbsp;tension.&lt;/li&gt;
&lt;li&gt;&amp;#8230; and yet a &amp;#8220;problem&amp;#8221; isn&amp;#8217;t enough to get someone to do something&amp;nbsp;either.&lt;/li&gt;
&lt;li&gt;If someone is consciously &lt;em&gt;and specifically&lt;/em&gt; doing some task, then there&amp;#8217;s an&amp;nbsp;opportunity.&lt;/li&gt;
&lt;li&gt;Creating wholistic solutions is unwelcome, unintuitively each thing that adds to the size of a solution &lt;em&gt;diminishes&lt;/em&gt; from the breadth of problems the solution can&amp;nbsp;solve.&lt;/li&gt;
&lt;li&gt;&amp;#8230; and yet, abstract solutions without any clear suggestion of what they solve aren&amp;#8217;t great&amp;nbsp;either!&lt;/li&gt;
&lt;li&gt;Figuring out how to package functionality is a big&amp;nbsp;deal.&lt;/li&gt;
&lt;li&gt;Approaches that increase the density of information or choices are themselves somewhat&amp;nbsp;burdensome.&lt;/li&gt;
&lt;li&gt;&amp;#8230; and yet context-sensitive approaches are unpredictable and distracting compared to consistent (if dense)&amp;nbsp;functionality.&lt;/li&gt;
&lt;li&gt;I still believe there&amp;#8217;s a wealth of material in the &lt;em&gt;content&lt;/em&gt; of the pages people encounter. But it&amp;#8217;s irregular and hard to understand, it takes concerted and long-term effort to do something&amp;nbsp;here.&lt;/li&gt;
&lt;li&gt;Lots of the easy stuff, the roads well traveled, are still hard for a lot of people. Maybe this can be fixed by optimizing current &lt;span class="caps"&gt;UI&lt;/span&gt;&amp;#8230; but I think there&amp;#8217;s still room for novel improvements to old&amp;nbsp;ideas.&lt;/li&gt;
&lt;li&gt;User research is a really great place to start, but it&amp;#8217;s not very prescriptive. It&amp;#8217;s mostly problem-finding, not&amp;nbsp;solution-finding.&lt;/li&gt;
&lt;li&gt;There&amp;#8217;s some kinds of user research I wish I had access to, specifically really low level analysis of behavior. What&amp;#8217;s in someone&amp;#8217;s mind when they open a new tab, or reuse one? In what order do they scan the &lt;span class="caps"&gt;UI&lt;/span&gt;? What are mental models of a &lt;span class="caps"&gt;URL&lt;/span&gt;, of pages and how they change, in what order to people compose (mentally and physically) things they want to share&amp;#8230; it feels like it can go on forever, and there would be a ton of detail in the results, but given all the other constraints these insights feel&amp;nbsp;important.&lt;/li&gt;
&lt;li&gt;There&amp;#8217;s so many variables in an experiment, that it&amp;#8217;s hard to know what failures really means. Every experiment that offers a novel experience involves several choices, and any one choice can cause the experiment to&amp;nbsp;fail.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As Test Pilot comes to an end, I do find myself asking: is there room for qualitative improvements in desktop browser &lt;span class="caps"&gt;UI&lt;/span&gt;? Desktop computing is waning. User expectations of a browser are calcified. The only time people make a choice is when something breaks, and the only way to win is to not break anything and hope you competitor &lt;em&gt;does&lt;/em&gt; break&amp;nbsp;things.&lt;/p&gt;
&lt;p&gt;So, is there room for improvement? Of course there is! The millions of hours spent every day in Firefox alone&amp;#8230; &lt;em&gt;this is actually important&lt;/em&gt;. Yes, a lot of things are at a local maximum, and we can A/B test little tweaks to get some suboptimal parts to &lt;em&gt;their&lt;/em&gt; local maximum. But I do not believe in any way that the browsers we know are the optimal container. The web is bigger than browsers, bigger than desktop or mobile or &lt;span class="caps"&gt;VR&lt;/span&gt;, and a user agent can do unique things beyond any site or&amp;nbsp;app.&lt;/p&gt;
&lt;p&gt;And&amp;nbsp;yet&amp;#8230;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=19304802"&gt;Hack News Comments&lt;/a&gt; if that&amp;#8217;s your&amp;nbsp;thing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;script src="/media/mockups/loader.js"&gt;&lt;/script&gt;

&lt;style&gt;
  img.paused {
    opacity: 0.5;
  }
  figure img {
    max-width: 100%;
  }
  body #main-container li {
    margin-bottom: 0.4em !important;
  }
&lt;/style&gt;</content><category term="mozilla"></category></entry><entry><title>The Over-engaged Knowledge Worker</title><link href="https://ianbicking.org/blog/2019/01/overengaged-knowledge-worker.html" rel="alternate"></link><published>2019-01-28T00:00:00-06:00</published><updated>2019-01-28T00:00:00-06:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2019-01-28:/blog/2019/01/overengaged-knowledge-worker.html</id><summary type="html">&lt;p&gt;I recently listened to a discussion of knowledge work in the browser. Along the way people imagined idealized workflows and the tools that could enable them. This result felt familiar from concept videos since forever (such as &lt;a href="https://www.youtube.com/watch?v=AYMA5W8b1zY"&gt;this old Mozilla concept video&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;The result featured lots of jet-setting highly engaged …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I recently listened to a discussion of knowledge work in the browser. Along the way people imagined idealized workflows and the tools that could enable them. This result felt familiar from concept videos since forever (such as &lt;a href="https://www.youtube.com/watch?v=AYMA5W8b1zY"&gt;this old Mozilla concept video&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;The result featured lots of jet-setting highly engaged people deep in collaboration. For instance: Joe sends his friend a mortgage refinancing proposal to get&amp;nbsp;feedback.&lt;/p&gt;
&lt;p&gt;None of my friends have ever just blasted a mortgage refinancing proposal to me for a quick review. Thank god. But I&amp;#8217;ve gotten similar requests, we all have, and nobody wants to receive these things. Usually the request sits guiltily in my inbox, mocking me and my purported friendship. If it&amp;#8217;s job-related I will eventually get to even the work I loathe, but there&amp;#8217;s always a particular pile of work that haunts me. This is not&amp;nbsp;engagement.&lt;/p&gt;
&lt;p&gt;This is the reality of knowledge work that none of these conceptualizations address: it&amp;#8217;s hard (in very specific ways), some of it we don&amp;#8217;t want to do, and the work we don&amp;#8217;t want to do piles up and becomes dominant simply because it remains&amp;nbsp;undone.&lt;/p&gt;
&lt;p&gt;Our real work looks different than how we idealize our work: work items are smaller, less impactful, higher-touch, and collaboration spreads work out over time, decreasing personal engagement. We also imagine situations where people are much more actively engaged as a total percentage of their interactions, while we spend a lot of time passively receiving information, or simply deciding: what, if anything, should I react&amp;nbsp;to?&lt;/p&gt;
&lt;h3&gt;So then&amp;nbsp;what?&lt;/h3&gt;
&lt;p&gt;So how might we approach idea generation around knowledge work without idealizing the knowledge&amp;nbsp;worker?&lt;/p&gt;
&lt;p&gt;We could still go too far into acceptance. We&amp;#8217;d build &lt;a href="https://www.arkadium.com/newsroom/microsoft-solitaire-most-boring-game-tops-100-million-users/"&gt;solitaire&lt;/a&gt; into the browser, the ultimate knowledge worker tool. It&amp;#8217;s what people want! People shouldn&amp;#8217;t have to pick up their phones to be distracted, we should keep the web as the universal distraction platform it was always meant to be. Oops, I make the mistake of thinking phone-vs-web, rather we should focus on providing &lt;em&gt;distraction continuity&lt;/em&gt; across all your platforms. Sorry, this sarcasm is becoming&amp;nbsp;uncomfortable&amp;#8230;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not sure a distraction tool is wrong. Giving people a mental break when they want it, &lt;em&gt;but without trying to capture those people&lt;/em&gt;, could be positive. The web is full of mental breaks, but they aren&amp;#8217;t &amp;#8220;breaks&amp;#8221;, they are manufactured to hold onto attention long after the needed break has&amp;nbsp;finished.&lt;/p&gt;
&lt;p&gt;But if we don&amp;#8217;t build engagement tools (because people aren&amp;#8217;t looking to be more engaged) and we don&amp;#8217;t build distraction tools (because a web browser is already a sufficiently good distraction tool), what do we&amp;nbsp;build?&lt;/p&gt;
&lt;p&gt;I think there&amp;#8217;s more opportunity in accepting the mentally fatigued and distracted state of knowledge workers, and working &lt;em&gt;from&lt;/em&gt; that instead of against it. With that in mind I&amp;#8217;d break down the problem into a few&amp;nbsp;categories:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Reduce the drain of knowledge work, so that distractions are less&amp;nbsp;necessary.&lt;/li&gt;
&lt;li&gt;Support positive mental&amp;nbsp;relaxation.&lt;/li&gt;
&lt;li&gt;Support continuity of mental effort; make it easier to &lt;em&gt;get back on track&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And I&amp;#8217;d leave&amp;nbsp;out:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Efficiency: usually efficiency means speed, number of steps, integrations, and so it calls for higher engagement. We care about efficiency, but only the &lt;em&gt;efficient use of mental resources&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Blocking distractions: people want something out of distractions, and while we might aspire to replace distractions it&amp;#8217;s probably unsustainable to block those distractions. Blocking is like starting an exercise plan by getting rid of all your&amp;nbsp;chairs.&lt;/li&gt;
&lt;li&gt;Communication and collaboration: even if distractions don&amp;#8217;t break your continuity, collaboration will! Collaboration is obviously an interesting space, but you can&amp;#8217;t do anything without pulling your collaborators into yet another tool. Trying to convert other people to a new way of working is not mentally&amp;nbsp;relaxing.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here&amp;#8217;s where I throw my hands up and admit that I don&amp;#8217;t have solutions to these problems, just a new problem&amp;nbsp;statement.&lt;/p&gt;
&lt;p&gt;But it does point in some different directions: how do we support a continuity of intention across a long task? In the context of the browser, how do we contextualize pages and interactions inside some abstract task? How do we clarify context? If the human is forced to multitask, can the multitasking tools be grounding instead of stretching us&amp;nbsp;out?&lt;/p&gt;
&lt;p&gt;The resulting exploration is not one that constructs an enviable user. It&amp;#8217;s a user with virtual piles of papers on their desk with a &lt;span class="caps"&gt;PB&lt;/span&gt;&amp;amp;J forgetten a third of the way down, with a People Magazine placed sneakily inside an important report, with a pile of mail and every single piece is marked Urgent: Open Immediately. People aren&amp;#8217;t always &lt;a href="https://www.curbed.com/2016/7/18/12215158/always-be-knolling-tom-sachs-knoll"&gt;knolling&lt;/a&gt;&amp;#8230; but maybe we could&amp;nbsp;be.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://news.ycombinator.com/item?id=19072680"&gt;Hacker News comments&lt;/a&gt; for the&amp;nbsp;curious.&lt;/p&gt;
&lt;/blockquote&gt;</content><category term="mozilla"></category></entry><entry><title>We Need Open Hosting Platforms</title><link href="https://ianbicking.org/blog/2019/01/we-need-open-hosting-platforms.html" rel="alternate"></link><published>2019-01-23T00:00:00-06:00</published><updated>2019-01-23T00:00:00-06:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2019-01-23:/blog/2019/01/we-need-open-hosting-platforms.html</id><summary type="html">&lt;p&gt;In &lt;a href="https://chrishardie.com/2018/04/rebuilding-open-web/"&gt;Bringing people back to the open web&lt;/a&gt; Chris&amp;nbsp;states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But most users don&amp;#8217;t care about the principles or implementation of an open web, at least not in those terms. Most people don&amp;#8217;t see themselves as ever having left the open web behind, and if you told them …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;In &lt;a href="https://chrishardie.com/2018/04/rebuilding-open-web/"&gt;Bringing people back to the open web&lt;/a&gt; Chris&amp;nbsp;states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;But most users don&amp;#8217;t care about the principles or implementation of an open web, at least not in those terms. Most people don&amp;#8217;t see themselves as ever having left the open web behind, and if you told them to try to get back to it, they wouldn&amp;#8217;t know what to do or why it was&amp;nbsp;worthwhile.&lt;/p&gt;
&lt;p&gt;No matter how much it might be in their long-term self interest, it&amp;#8217;s not up to the casual Internet user to figure that out. &lt;strong&gt;Instead, it&amp;#8217;s up to the developers, designers, entrepreneurs and technology leaders to create a version of the open web that also happens to be the best version of the&amp;nbsp;web.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I think he&amp;#8217;s starting with a reasonable, positive call: we can&amp;#8217;t just decry the state of things, we have to make things. And we have to make &lt;em&gt;good&lt;/em&gt; things. The open web &lt;em&gt;should&lt;/em&gt; be&amp;nbsp;better.&lt;/p&gt;
&lt;p&gt;I fear a moralizing approach to advocacy pushes people away, makes it &lt;em&gt;harder&lt;/em&gt; for people to care about the values we are espousing. When we frame something as depressing or hopeless we encourage people to pay attention to other things. So yes: the open web should be the best&amp;nbsp;web.&lt;/p&gt;
&lt;p&gt;But ignoring my advice, I&amp;#8217;m going to point out a depressing fact: open source &lt;em&gt;products&lt;/em&gt; aren&amp;#8217;t successful. Open source is not in line to be part of any&amp;nbsp;solution.&lt;/p&gt;
&lt;p&gt;Open Source has done a lot for developers, but it&amp;#8217;s not present on the surface of the web – the surface that people interact with, and that defines the &amp;#8220;open web&amp;#8221;. Actual sites. Actual interfaces. Open source is used everywhere &lt;em&gt;except&lt;/em&gt; at the point of interaction with actual&amp;nbsp;people.&lt;/p&gt;
&lt;p&gt;Why is open source so&amp;nbsp;absent?&lt;/p&gt;
&lt;p&gt;One big problem: the web isn&amp;#8217;t software. The web is deployed software, running on&amp;nbsp;servers.&lt;/p&gt;
&lt;p&gt;If, as a creator of software, I want to share what I&amp;#8217;ve done with everyone on the web – not just with other developers – then I actually have to deploy that software somewhere. But if maintaining open source is difficult and unsustainable, hosting that software is even&amp;nbsp;worse.&lt;/p&gt;
&lt;p&gt;I could create a whole company to support the service. But at that point I&amp;#8217;m not a developer, I&amp;#8217;m an &amp;#8220;entrepreneur&amp;#8221;. That&amp;#8217;s more of a pain in the ass than giving stuff&amp;nbsp;away.&lt;/p&gt;
&lt;p&gt;For open source developers to build the open web we need a platform that allows us to actually give the tools we&amp;#8217;ve created to everyone. Because of the hosting problem all our open source work is mediated through commercial entities, and we have this world where the web is very much built on open source, and yet that does nothing to make it more&amp;nbsp;open.&lt;/p&gt;
&lt;p&gt;An open hosting platform is &lt;em&gt;not&lt;/em&gt; a specification, it is &lt;em&gt;not&lt;/em&gt; a protocol, it is &lt;em&gt;not&lt;/em&gt; a piece of software. It is actual hosting. It is people who deal with abuse, security, takedown notices, denial of service attacks, naming, bill paying, authentication and recovery, and are committed to ongoing improvements to the platform. Those are the things that separate software from a running service, and only running services can participate in the open&amp;nbsp;web.&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t think decentralization, federation, or &lt;span class="caps"&gt;P2P&lt;/span&gt; is important or probably even desirable. I think these are ways to avoid the work of hosting, and they succeed to the degree no one uses the resulting software and so no work has to be done. It&amp;#8217;s better to start with a working&amp;nbsp;product.&lt;/p&gt;
&lt;p&gt;Would hosting change things? Probably not enough: products aren&amp;#8217;t just software, and open source development still struggles to include a diversity of skills and the consistent delivery of effort to make a product. Here, I have no suggestions. But still, an open, public, accessible hosting platform would be a&amp;nbsp;start.&lt;/p&gt;</content><category term="mozilla"></category></entry><entry><title>Thoughts on the Firefox Email Tabs experiment</title><link href="https://ianbicking.org/blog/2018/11/thoughts-on-email-tabs.html" rel="alternate"></link><published>2018-11-15T00:00:00-06:00</published><updated>2018-11-15T00:00:00-06:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2018-11-15:/blog/2018/11/thoughts-on-email-tabs.html</id><summary type="html">&lt;p&gt;We recently released &lt;a href="https://testpilot.firefox.com/experiments/email-tabs"&gt;Email Tabs&lt;/a&gt; in &lt;a href="https://testpilot.firefox.com/"&gt;Firefox Test Pilot&lt;/a&gt;. This was a project I championed, and I wanted to offer some context on&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Email Tabs is a browser add-on that makes it easier to compose an email message from your tabs/pages. The &lt;a href="https://testpilot.firefox.com/experiments/email-tabs"&gt;experiment page&lt;/a&gt; describes how it works …&lt;/p&gt;</summary><content type="html">&lt;p&gt;We recently released &lt;a href="https://testpilot.firefox.com/experiments/email-tabs"&gt;Email Tabs&lt;/a&gt; in &lt;a href="https://testpilot.firefox.com/"&gt;Firefox Test Pilot&lt;/a&gt;. This was a project I championed, and I wanted to offer some context on&amp;nbsp;it.&lt;/p&gt;
&lt;p&gt;Email Tabs is a browser add-on that makes it easier to compose an email message from your tabs/pages. The &lt;a href="https://testpilot.firefox.com/experiments/email-tabs"&gt;experiment page&lt;/a&gt; describes how it works, but to summarize it from a technical point of&amp;nbsp;view:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You choose some&amp;nbsp;tabs&lt;/li&gt;
&lt;li&gt;The add-on gets the best title and &lt;span class="caps"&gt;URL&lt;/span&gt; from the tab(s), makes a screenshot, and uses &lt;a href="https://blog.mozilla.org/firefox/reader-view/"&gt;reader view&lt;/a&gt; to get simplified content from the&amp;nbsp;tab&lt;/li&gt;
&lt;li&gt;It opens a email compose&amp;nbsp;page&lt;/li&gt;
&lt;li&gt;It asks you what you want your email to look like (links, entire articles,&amp;nbsp;screenshots)&lt;/li&gt;
&lt;li&gt;It injects the &lt;span class="caps"&gt;HTML&lt;/span&gt; (somewhat brutally) into the email composition&amp;nbsp;window&lt;/li&gt;
&lt;li&gt;When the email is sent, if offers to close the compose window or all the tabs you&amp;#8217;ve&amp;nbsp;sent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://testpilot.firefox.com/experiments/email-tabs"&gt;&lt;img style="float: right; width: 300px; height: auto" src="/media/email-tabs-1.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s not fancy engineering. It&amp;#8217;s just-make-it-work engineering. It does not propose a new standard for composing &lt;span class="caps"&gt;HTML&lt;/span&gt; emails. It doesn&amp;#8217;t pay attention to your existing mail settings. It does not push forward the state of the art. It has no mobile component. Notably, no one in Mozilla ever asked us to make this thing. And yet I really like this add-on, and so I feel a need to explain&amp;nbsp;why.&lt;/p&gt;
&lt;h3&gt;User Research&amp;nbsp;origins&lt;/h3&gt;
&lt;p&gt;A long time ago &lt;a href="https://blog.mozilla.org/ux/2015/02/save-share-revisit/"&gt;Mozilla did research into Save/Share/Revisit&lt;/a&gt;. The research was based on interviews, journals, and directly watching people do work on their&amp;nbsp;computers.&lt;/p&gt;
&lt;p&gt;The results should not be surprising, but it was important to actually have them documented and backed up by&amp;nbsp;research:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;People use simple&amp;nbsp;techniques&lt;/li&gt;
&lt;li&gt;Everyone claims to be happy with their current&amp;nbsp;processes&lt;/li&gt;
&lt;li&gt;Everyone used multiple tools that typically fed into each&amp;nbsp;other&lt;/li&gt;
&lt;li&gt;Those processes might seem complicated and inefficient to me, but didn&amp;#8217;t to&amp;nbsp;them&lt;/li&gt;
&lt;li&gt;People said they &lt;em&gt;might&lt;/em&gt; be open to improvements in specific&amp;nbsp;steps&lt;/li&gt;
&lt;li&gt;People were not interested in revamping their overall&amp;nbsp;processes&lt;/li&gt;
&lt;li&gt;Some techniques were particularly&amp;nbsp;popular:&lt;/li&gt;
&lt;li&gt;Screenshots&lt;/li&gt;
&lt;li&gt;URLs&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Texting&lt;/li&gt;
&lt;li&gt;Bookmarks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://testpilot.firefox.com/experiments/email-tabs"&gt;&lt;img style="float: right; width: 300px; height: auto" src="/media/email-tabs-2.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Not everyone used all of these, but they were all&amp;nbsp;popular.&lt;/p&gt;
&lt;p&gt;The research made me change a page-freezing/saving tool (Page Shot) into what is now &lt;a href="https://screenshots.firefox.com/"&gt;Firefox Screenshots&lt;/a&gt; (I didn&amp;#8217;t intend to lose the freezing functionality along the way, but things happen when you&amp;nbsp;ship).&lt;/p&gt;
&lt;p&gt;Even if the research was fairly clear, it wasn&amp;#8217;t prescriptive, and life moved on. But it sat in the back of my head, both email and the &lt;a href="http://www.ianbicking.org/blog/2018/02/web-small-composable-tools.html"&gt;general question of workflows&lt;/a&gt;. And once I was doing less work on Screenshots I felt compelled to come back to it. Email stuck out, both because of how ubiquitous it was, and how little anyone cared about it. It seemed easy to improve&amp;nbsp;on.&lt;/p&gt;
&lt;p&gt;Email is also multipurpose. People will apologetically talk about emailing themselves something in order to save it, even though everyone does it. It can be a note for the future, something to archive for later, a message, a question, an &lt;span class="caps"&gt;FYI&lt;/span&gt;. One of the features of Email Tabs that I&amp;#8217;m fond of is the ability to send a set of tabs, and then close those same tabs. Have a set of tabs that represent something you don&amp;#8217;t want to forget, but don&amp;#8217;t want to use right now? Send it to yourself. And unlike structured storage (like a bookmark folder), you can describe as much as you want about your next steps in the email&amp;nbsp;itself.&lt;/p&gt;
&lt;h3&gt;Choosing to integrate with&amp;nbsp;webmail&lt;/h3&gt;
&lt;p&gt;The obvious solution is to make something that emails out a page. A little web service perhaps, and you give it a &lt;span class="caps"&gt;URL&lt;/span&gt; and it fetches it, and then something that forwards the current &lt;span class="caps"&gt;URL&lt;/span&gt; to that&amp;nbsp;service&amp;#8230;&lt;/p&gt;
&lt;p&gt;What seems simple becomes hard pretty quickly. Of course you have to fetch the page, and render it, and worry about JavaScript, and so on. But even if you skip that, then what email address will it come from? Do you integrate with a contact list? Make your own? How do you let people add a little note? A note per tab? Do you save a&amp;nbsp;record?&lt;/p&gt;
&lt;p&gt;Prepopulating an email composition answers a ton of&amp;nbsp;questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All the mail&amp;nbsp;infrastructure&lt;/li&gt;
&lt;li&gt;From addresses, email verification, selecting your address,&amp;nbsp;etc&lt;/li&gt;
&lt;li&gt;To field, &lt;span class="caps"&gt;CC&lt;/span&gt;, address&amp;nbsp;book&lt;/li&gt;
&lt;li&gt;The editable body gives the user control and the ability to explain why they are sending&amp;nbsp;something&lt;/li&gt;
&lt;li&gt;It&amp;#8217;s very transparent to the user what they are sending, and they confirm it by hitting&amp;nbsp;Send&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Since then I&amp;#8217;ve come to appreciate the power of editable documents. Again it should be obvious, but there&amp;#8217;s this draw any programmer will feel towards structured data and read-only representations of that data. The open world of an email body is refreshingly&amp;nbsp;unconstrained.&lt;/p&gt;
&lt;h3&gt;Email providers &lt;span class="amp"&gt;&amp;amp;&lt;/span&gt; broken&amp;nbsp;browsers&lt;/h3&gt;
&lt;p&gt;One downside to this integration is that we are shipping with only Gmail support. That covers &lt;a href="https://www.statista.com/statistics/547531/e-mail-provider-ranking-consumer-usa-age/"&gt;most people&lt;/a&gt;, but it feels&amp;nbsp;wrong.&lt;/p&gt;
&lt;p&gt;This is an experiment, so keep it simple, right? And that was the plan until people from marketing kept asking over and over for us to support other clients and we thought: if they care so much maybe they are&amp;nbsp;right.&lt;/p&gt;
&lt;p&gt;We didn&amp;#8217;t get support for other providers ready for launch, but we did get a good start on it. Along the way I saw that &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=1494105"&gt;Yahoo Mail is broken&lt;/a&gt; and Outlook isn&amp;#8217;t supported at all in Firefox (and the &lt;a href="https://support.mozilla.org/en-US/kb/change-program-used-open-email-links"&gt;instructions&lt;/a&gt; point to a pretty unhelpful &lt;a href="https://addons.mozilla.org/en-US/firefox/search/?q=webmail"&gt;addons.mozilla.org search&lt;/a&gt;). That&amp;#8217;s millions of users who aren&amp;#8217;t getting a good&amp;nbsp;experience.&lt;/p&gt;
&lt;p&gt;Growing Firefox is a really hard problem. Of course Mozilla has also studied this quite a bit, and one of the strongest conclusions is that people change their browser when their browser breaks. People aren&amp;#8217;t out there looking for something better, everyone has better things to do than think about their web browser. But if things don&amp;#8217;t work people go&amp;nbsp;searching.&lt;/p&gt;
&lt;p&gt;But what does broken really mean? I suspect if we looked more closely we might be surprised. The simple answer: something is broken if it doesn&amp;#8217;t act the way it should. But what &amp;#8220;should&amp;#8221; something do? If you click a link and Mail.app opens up, and you don&amp;#8217;t use Mail.app, that&amp;#8217;s broken. To Mozilla developers, if Mail.app is your registered default mail provider, then it &amp;#8220;should&amp;#8221; open up. Who&amp;#8217;s&amp;nbsp;right?&lt;/p&gt;
&lt;p&gt;Email Tabs doesn&amp;#8217;t offer particular insight into this, but I do like that we&amp;#8217;ve created something with the purpose of enabling a &lt;em&gt;successful workflow&lt;/em&gt;. Nothing is built to a spec, or to a standard, it&amp;#8217;s only built to work. I think that process is itself&amp;nbsp;revealing.&lt;/p&gt;
&lt;h2&gt;Listening to the&amp;nbsp;research&lt;/h2&gt;
&lt;p&gt;Research requires interpretation. We asked questions about saving, sharing, and revisiting content, and we got back answers on those topics. Were those the right questions to ask? They seem pretty good, but there&amp;#8217;s other pretty good questions that will lead to very different answers. What makes you worried when you use the web? What do you want from a browser? What do you think about Firefox? What do you use a browser for? What are you doing when you switch from a phone to a desktop browser? We&amp;#8217;ve asked all these questions, and they point to different&amp;nbsp;answers.&lt;/p&gt;
&lt;p&gt;And somewhere in there you have to find an intersection between what you hear in the research and what you know how to do. There&amp;#8217;s no right answer. But there is something different when you &lt;strong&gt;start from&lt;/strong&gt; the user research, instead of &lt;strong&gt;using&lt;/strong&gt; the user research. There&amp;#8217;s a different sort of honesty to the conclusions, and I hope that comes through in the&amp;nbsp;product.&lt;/p&gt;
&lt;p&gt;I know what Email Tabs isn&amp;#8217;t: it&amp;#8217;s not part of any strategy. It&amp;#8217;s not part of any kind of play for anything. There&amp;#8217;s no ulterior motives. There&amp;#8217;s no income potential. This makes its future very hazy. And it won&amp;#8217;t be a blow-up success. It is merely useful. But I like it, and I hope we do&amp;nbsp;more.&lt;/p&gt;</content><category term="mozilla"></category></entry><entry><title>A Product Journal: Oops We Made A Scraper</title><link href="https://ianbicking.org/blog/2016/08/product-journal-oops-a-scraper.html" rel="alternate"></link><published>2016-08-15T00:00:00-05:00</published><updated>2016-08-15T00:00:00-05:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2016-08-15:/blog/2016/08/product-journal-oops-a-scraper.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A while back we got our &lt;a href="https://github.com/ben-en"&gt;first contributor&lt;/a&gt; to &lt;a href="https://github.com/mozilla-services/pageshot/"&gt;PageShot&lt;/a&gt;, who contributed a feature he wanted for &lt;a href="https://outernet.is/"&gt;Outernet&lt;/a&gt; – the ability to use PageShot to create readable and packaged versions …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A while back we got our &lt;a href="https://github.com/ben-en"&gt;first contributor&lt;/a&gt; to &lt;a href="https://github.com/mozilla-services/pageshot/"&gt;PageShot&lt;/a&gt;, who contributed a feature he wanted for &lt;a href="https://outernet.is/"&gt;Outernet&lt;/a&gt; – the ability to use PageShot to create readable and packaged versions of websites for distribution.  Outernet is a neat project: they are building satellite capacity to distribute content anywhere in the world.  But it&amp;#8217;s purely one-way, so any content you send has to be complete.  And PageShot tries pretty hard to identify and normalize all that&amp;nbsp;content.&lt;/p&gt;
&lt;p&gt;Lately I spent a week with the &lt;a href="https://wiki.mozilla.org/Firefox/Activity_Stream"&gt;Activity Stream&lt;/a&gt; team, and got to thinking about the development process around recommendations.  I&amp;#8217;d like to be able to take my entire history and actually get the content, and see what I can learn from&amp;nbsp;that.&lt;/p&gt;
&lt;p&gt;And there&amp;#8217;s this feature in PageShot to do just that!  You can install the add-on and enable the pref to make the browser into a&amp;nbsp;server:&lt;/p&gt;
&lt;figure style="background-color: rgba(240, 240, 240, 0.4); padding: 5px; width: 90%; border: 1px solid #aaa; border-radius: 3px;"&gt;&lt;a href="/media/pageshot-server-pref-screenshot.png"&gt;&lt;img style="width: 100%; height: auto" src="/media/pageshot-server-pref-screenshot.png" /&gt;&lt;/a&gt;&lt;figcaption style="font-size: 80%; line-height: 1em; text-align: center;"&gt;&lt;tt&gt;about:addons&lt;/tt&gt; prefs&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;After that you can get the shot data from a page with a simple&amp;nbsp;command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;$ &lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://mail.google.com
$ &lt;span class="nv"&gt;server&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:10082
$ curl &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;server&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/data/?url=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;amp;allowUnknownAttributes=true&amp;amp;delayAfterLoad=1000&amp;quot;&lt;/span&gt; &amp;gt; data.json
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;allowUnknownAttributes&lt;/code&gt; preserves attributes like &lt;code&gt;data-*&lt;/code&gt; attributes that you might find useful in your processing.  &lt;code&gt;delayAfterLoad&lt;/code&gt; gives the milliseconds to wait, usually for the page to&amp;nbsp;&amp;#8220;settle&amp;#8221;.&lt;/p&gt;
&lt;p&gt;A fun part of this is that because it&amp;#8217;s in a regular browser it will automatically pick up your profile and scrape the page &lt;em&gt;as&lt;/em&gt; you, and you&amp;#8217;ll literally see a new tab open for a second and then close.  Install an ad blocker or anything else and its changes will also be&amp;nbsp;applied.&lt;/p&gt;
&lt;p&gt;The thing you get back will be a big &lt;span class="caps"&gt;JSON&lt;/span&gt;&amp;nbsp;object:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;bodyAttrs&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;value&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;headAttrs&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;htmlAttrs&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;head&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;html string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;body&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;html string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s2"&gt;&amp;quot;resources&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s2"&gt;&amp;quot;uuid&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s2"&gt;&amp;quot;url&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;...&amp;quot;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;There&amp;#8217;s other stuff in there too (e.g., &lt;a href="http://ogp.me/"&gt;Open Graph properties&lt;/a&gt;), but this is what you need to reconstruct the page itself.  It has a few nice&amp;nbsp;features:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The head and body are well formed; they are actually serialized from the &lt;span class="caps"&gt;DOM&lt;/span&gt;, not related to the &lt;span class="caps"&gt;HTTP&lt;/span&gt;&amp;nbsp;response.&lt;/li&gt;
&lt;li&gt;All embedded resources (mostly images) are identified in the &lt;code&gt;resources&lt;/code&gt; mapping.  The URLs in the page itself are replaced with those UUIDs, so you can put them back with a simple string substitutions, or you can rewrite the links&amp;nbsp;easily.&lt;/li&gt;
&lt;li&gt;Actual links (&lt;code&gt;&amp;lt;a href&amp;gt;&lt;/code&gt;) should all be&amp;nbsp;absolute.&lt;/li&gt;
&lt;li&gt;It will &lt;em&gt;try&lt;/em&gt; to tell you if the page is private (though it&amp;#8217;s just a&amp;nbsp;heuristic).&lt;/li&gt;
&lt;li&gt;If you want, it&amp;#8217;ll include a screenshot of the full page as a &lt;code&gt;data:&lt;/code&gt; &lt;span class="caps"&gt;URL&lt;/span&gt; (use &lt;code&gt;&amp;amp;thumbnailWidth=px&lt;/code&gt; to choose how&amp;nbsp;wide).&lt;/li&gt;
&lt;li&gt;&lt;span class="caps"&gt;CSS&lt;/span&gt; will be inlined in a &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; tag, perhaps reducing the complexity of the page for&amp;nbsp;you.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Notably scripts and hidden elements will &lt;em&gt;not&lt;/em&gt; be included (because PageShot was written to share visible content and not to scrape&amp;nbsp;content).&lt;/p&gt;
&lt;p&gt;Anyway, fun to realize the tool can address some hidden and unintentional use&amp;nbsp;cases.&lt;/p&gt;</content><category term="mozilla"></category><category term="product-journal"></category></entry><entry><title>A Product Journal: Data Up and Data Down</title><link href="https://ianbicking.org/blog/2016/04/product-journal-data-up-and-data-down.html" rel="alternate"></link><published>2016-04-28T00:00:00-05:00</published><updated>2016-04-28T00:00:00-05:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2016-04-28:/blog/2016/04/product-journal-data-up-and-data-down.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We&amp;#8217;re in the process of reviewing the &lt;span class="caps"&gt;KPI&lt;/span&gt; (&lt;a href="https://en.wikipedia.org/wiki/Performance_indicator"&gt;Key Performance Indicators&lt;/a&gt;) for &lt;a href="https://www.mozilla.org/en-US/firefox/hello/"&gt;Firefox Hello&lt;/a&gt; (relatedly I joined the Firefox Hello team as engineering manager in October).  Mozilla is …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We&amp;#8217;re in the process of reviewing the &lt;span class="caps"&gt;KPI&lt;/span&gt; (&lt;a href="https://en.wikipedia.org/wiki/Performance_indicator"&gt;Key Performance Indicators&lt;/a&gt;) for &lt;a href="https://www.mozilla.org/en-US/firefox/hello/"&gt;Firefox Hello&lt;/a&gt; (relatedly I joined the Firefox Hello team as engineering manager in October).  Mozilla is trying (like everyone else) to make data-driven decisions.  Basing decisions on data has some potential to remove or at least reveal bias.  It provides a feedback mechanism that can provide continuity even as there are personnel changes.  It provides some accountability over time.  Data might also provide insight about product opportunities which we might otherwise&amp;nbsp;miss.&lt;/p&gt;
&lt;p&gt;Enter the &lt;span class="caps"&gt;KPI&lt;/span&gt;: for Hello (like most products) the key performance indicators are number of users, growth in users over time, user retention, and user sentiment (e.g., we use the &lt;a href="https://en.wikipedia.org/wiki/Net_Promoter"&gt;Net Promoter Score&lt;/a&gt;).  But like most projects those are not &lt;em&gt;actually&lt;/em&gt; our success criteria: product engagement is necessary but not sufficient for organizational goals.  Real goals might be revenue, social or political impact, or improvement in brand&amp;nbsp;sentiment.&lt;/p&gt;
&lt;p&gt;The value of &lt;span class="caps"&gt;KPI&lt;/span&gt; is often summarized as &amp;#8220;letting us know how we&amp;#8217;re doing&amp;#8221;.  I think the value &lt;span class="caps"&gt;KPI&lt;/span&gt; offers is more&amp;nbsp;select:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;When you &lt;em&gt;think&lt;/em&gt; a product is doing well, but it&amp;#8217;s not, &lt;span class="caps"&gt;KPI&lt;/span&gt; is&amp;nbsp;revealing.&lt;/li&gt;
&lt;li&gt;When you know a product isn&amp;#8217;t doing well, &lt;span class="caps"&gt;KPI&lt;/span&gt; let&amp;#8217;s you triage: is it hopeless? Do we need to make significant changes? Do we need to maintain our approach but try&amp;nbsp;harder?&lt;/li&gt;
&lt;li&gt;When a product is doing well the &lt;span class="caps"&gt;KPI&lt;/span&gt; gives you a sense of the potential.  You can also triage success: Should we invest heavily?  Stay the path?  Is there no potential to scale the success far&amp;nbsp;enough?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;#8217;m skeptical that &lt;span class="caps"&gt;KPI&lt;/span&gt; can provide the inverse of 1: when you think a product is doing poorly, can &lt;span class="caps"&gt;KPI&lt;/span&gt; reveal that it is doing well?  Because there&amp;#8217;s another set of criteria that defines &amp;#8220;success&amp;#8221;, &lt;span class="caps"&gt;KPI&lt;/span&gt; is necessary but not sufficient.  It requires a carefully objective executive to revise their negative opinion about the potential of a project based on &lt;span class="caps"&gt;KPI&lt;/span&gt;, and they may have reasonably lost faith that a project&amp;#8217;s &lt;span class="caps"&gt;KPI&lt;/span&gt;-defined success can translate into success given organizational&amp;nbsp;goals.&lt;/p&gt;
&lt;p&gt;The other theoretical value of &lt;span class="caps"&gt;KPI&lt;/span&gt; is that you could correlate &lt;span class="caps"&gt;KPI&lt;/span&gt; with changes to the product, testing whether each change improves your product&amp;#8217;s core value.  I&amp;#8217;m sure people manage to do this, with both very fine grained measurements and fine grained deployments of changes.  But it seems more likely to me that for most projects given a change in &lt;span class="caps"&gt;KPI&lt;/span&gt; you&amp;#8217;ll simply have to say &amp;#8220;yup&amp;#8221; and come up with unverified theories about that&amp;nbsp;change.  &lt;/p&gt;
&lt;p&gt;The metrics that actually &lt;em&gt;support&lt;/em&gt; the development of the product are not &amp;#8220;key&amp;#8221;, they are &amp;#8220;incidental&amp;#8221;.  These are metrics that find bugs in the product design, hint at unexplored opportunities, confirm the small wins.  These are metrics that are actionable by the people making the product: how do people interact with the tool?  What do they use it for?  Where do they get lost?  What paths lead to greater&amp;nbsp;engagement?&lt;/p&gt;
&lt;h2&gt;What is &lt;span class="caps"&gt;KPI&lt;/span&gt;&amp;nbsp;for?&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;m trying to think more consciously about the difference between &lt;a href="https://en.wikipedia.org/wiki/Managing_up_and_managing_down"&gt;managing up and managing down&lt;/a&gt;.  A softer way of phrasing this is &lt;em&gt;managing in and managing out&lt;/em&gt; – but in this case I think the power dynamics are worth&amp;nbsp;highlighting.&lt;/p&gt;
&lt;p&gt;&lt;span class="caps"&gt;KPI&lt;/span&gt; is data that goes &lt;em&gt;up&lt;/em&gt;.  It lets someone outside the project – and above the project – make choices: about investment, redirection, cancellation.  &lt;span class="caps"&gt;KPI&lt;/span&gt; data doesn&amp;#8217;t go &lt;em&gt;down&lt;/em&gt;, it does little to help the people doing the work.  Feeling joy or despair about your project based on &lt;span class="caps"&gt;KPI&lt;/span&gt; is not actionable for those people on the inside of a&amp;nbsp;project.&lt;/p&gt;
&lt;h2&gt;Incentive or&amp;nbsp;support&lt;/h2&gt;
&lt;p&gt;I would also distinguish two kinds of management here: one perspective on management is that the organization should set up the right incentives and consequences so that rewards are aligned with organizational goals.  The right incentives might make people adapt their behavior to get alignment; &lt;em&gt;how&lt;/em&gt; they adapt is undefined.  The right incentives might also exclude those who aren&amp;#8217;t in alignment, culling misalignment from the organization.  Another perspective is that the organization should work to support people, that misalignment of purpose between a person and the organization is more likely a bug than a misalignment of intention.  Are people black boxes that we can nudge via punishment and reward?  Are there less mechanical ways to influence&amp;nbsp;change?&lt;/p&gt;
&lt;p&gt;Student performance measurement are another kind of &lt;span class="caps"&gt;KPI&lt;/span&gt;.  It lets someone on the outside (of the classroom) know if things are going well or poorly for the students.  It says little about &lt;em&gt;why&lt;/em&gt;, and it doesn&amp;#8217;t support improvement.  School reform based on measurement presumes that teachers and schools are &lt;em&gt;able&lt;/em&gt; to achieve the desired outcomes, but simply not &lt;em&gt;willing&lt;/em&gt;.  A risk of top-down reform: the people on the top use a perspective from the top.  As an authority figure, how do &lt;strong&gt;I&lt;/strong&gt; make decisions? The resulting reform is disempowering, supporting decisions from above, as opposed to using data to support the empowerment of those making the many day-to-day decisions that might effect a positive&amp;nbsp;outcome.&lt;/p&gt;
&lt;p&gt;Of course, having data available to inform decisions at all levels – from the executive to the implementor – would be great.  But there&amp;#8217;s a better criteria for data: it should support decision making processes.  What are your most important&amp;nbsp;decisions?&lt;/p&gt;
&lt;p&gt;As an example from Mozilla, we have data about how much Firefox is used and its marketshare.  How much should we pay attention to this data?  We certainly don&amp;#8217;t have the granularity to connect changes in this &lt;span class="caps"&gt;KPI&lt;/span&gt; to individual changes we make in the project.  The only real way to do that is through controlled experiments (which we are trying).  We aren&amp;#8217;t really willing to triage the project; no one is asking &amp;#8220;should we just give up on Firefox?&amp;#8221;  The only real choice we can make is: are we investing enough in Firefox, or should we invest more?  That&amp;#8217;s a question worth asking, but we need to keep our attention on the question and not the data.  For instance, if we decide to increase investment in Firefox, the immediate questions are: what kind of investment?  Over what timescale?  Data can be helpful to answer those questions, but not just any&amp;nbsp;data.&lt;/p&gt;
&lt;h2&gt;Exploratory&amp;nbsp;data&lt;/h2&gt;
&lt;p&gt;Weeks after I wrote (but didn&amp;#8217;t publish) this post I encountered &lt;a href="https://www.youtube.com/watch?v=dXQPL9GooyI"&gt;Why Greatness Cannot Be Planned: The Myth of the Objective&lt;/a&gt;, a presentation by Kenneth&amp;nbsp;Stanley:&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/dXQPL9GooyI" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;Setting an objective can block its own achievement.  It can be an obstacle to creativity and innovation in general.  Without protection of individual autonomy collaboration can become dangerously&amp;nbsp;objective.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The example he uses is manually searching a space of  &lt;a href="https://en.wikipedia.org/wiki/Nonlinear_system"&gt;nonlinear&lt;/a&gt; image generation to find interesting images.  The positive &lt;a href="http://picbreeder.com/"&gt;example&lt;/a&gt; is one where people explore, branching from novel examples until something recognizable&amp;nbsp;emerges:&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;img src="/media/picbreeder-pics.png"&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;One negative example is one where an algorithm explores with a goal in&amp;nbsp;mind:&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;img src="/media/picbreeder-trained.png"&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Another negative example is selection by voting, instead of personal exploration; a product of &lt;em&gt;convergent consensus&lt;/em&gt; instead of &lt;em&gt;divergent treasure hunting&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;img src="/media/picbreeder-competitor.png"&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If you decide what you are looking for, you are unlikely to find it.&lt;/em&gt;  This generated image search space is &lt;em&gt;deliberately&lt;/em&gt; nonlinear, so it&amp;#8217;s difficult to understand how actions affect outcomes.  Though artificial, I think the example is still valid: in a competitive environment, the thing you are searching for is hard to find, because if it was not hard then someone would have found it.  And it&amp;#8217;s probably hard because actions affect outcomes in unexpected&amp;nbsp;ways.&lt;/p&gt;
&lt;p&gt;You could describe this observation as another way of describing &lt;a href="http://chris-said.io/2016/02/28/four-pitfalls-of-hill-climbing/"&gt;the pitfalls of hill climbing&lt;/a&gt;: getting stuck at local maximums.  Maybe an easy fix is to add a little randomness, to bounce around, to see what lies past the hill you&amp;#8217;ve found.  But the hills themselves can be distractions: each hill supposes a measurement.  The divergent search doesn&amp;#8217;t just reveal novel solutions, but it can reveal a novel rubric for&amp;nbsp;success.&lt;/p&gt;
&lt;p&gt;This is also a similar observation to that in &lt;a href="https://en.wikipedia.org/wiki/The_Innovator%27s_Dilemma"&gt;Innovator&amp;#8217;s Dilemma&lt;/a&gt;: specifically that in these cases good management consistently and deliberately keeps a company &lt;em&gt;away&lt;/em&gt; from novelty and onto the established track, and it does so by paying attention to the feedback that defines the company&amp;#8217;s (current) success.  The &lt;em&gt;disruptive innovation&lt;/em&gt;, a term somewhat synonymous with the book, is an innovation that requires a change in metrics, and that a large portion of the innovation is &lt;em&gt;finding&lt;/em&gt; the metric (and so finding the market), not implementing the maximizing&amp;nbsp;solution.&lt;/p&gt;
&lt;p&gt;But I digress from the topic of data.  If we&amp;#8217;re going to be data driven to entirely new directions, we may need data that doesn&amp;#8217;t answer a question, doesn&amp;#8217;t support a decision, but just tells us about things we don&amp;#8217;t know.  To support exploration, not based on a hypothesis which we confirm or reject based on the data, because we are still trying to discover our hypothesis.  We use the data to look for the hidden variable, the unsolved need, the desire that has not been&amp;nbsp;articulated.&lt;/p&gt;
&lt;p&gt;I think we look for this kind of data more often than we would admit.  Why else would we want complex visualizations?  The visualizations are our attempt at finding a pattern we don&amp;#8217;t expect to&amp;nbsp;find.&lt;/p&gt;
&lt;h2&gt;In&amp;nbsp;Conclusion&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;m lousy at conclusions.  All those words up there are like data, and I&amp;#8217;m curious what they mean, but I haven&amp;#8217;t figured it out&amp;nbsp;yet.&lt;/p&gt;</content><category term="mozilla"></category><category term="product-journal"></category></entry><entry><title>A Product Journal: CSS Object Model</title><link href="https://ianbicking.org/blog/2015/12/product-journal-css-object-model.html" rel="alternate"></link><published>2015-12-29T00:00:00-06:00</published><updated>2015-12-29T00:00:00-06:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2015-12-29:/blog/2015/12/product-journal-css-object-model.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And now for something entirely&amp;nbsp;technical!&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve had a contributor from &lt;a href="https://outernet.is/"&gt;Outernet&lt;/a&gt; exploring ways of using PageShot for capturing pages for distribution on their network.  Outernet satellite-based content …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And now for something entirely&amp;nbsp;technical!&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve had a contributor from &lt;a href="https://outernet.is/"&gt;Outernet&lt;/a&gt; exploring ways of using PageShot for capturing pages for distribution on their network.  Outernet satellite-based content distribution network.  It&amp;#8217;s a neat idea, but one challenge is that it&amp;#8217;s &lt;em&gt;very&lt;/em&gt; one-way – anyone (given the equipment) can listen in to what the satellites broadcast, but that&amp;#8217;s it (at least for the most interesting use cases).  Lots of modern websites aren&amp;#8217;t setup well for that, so acquiring content can be&amp;nbsp;tricky.&lt;/p&gt;
&lt;p&gt;Given that interest I started thinking more about inlining resources.  We&amp;#8217;ve been hotlinking to resources simply out of laziness.  Some things are easy to handle, but &lt;span class="caps"&gt;CSS&lt;/span&gt; is a bit more annoying because of the indirection of &lt;code&gt;@import&lt;/code&gt; and yet more relatively URLs.  Until I started poking around I had no idea that there is a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/CSS_Object_Model"&gt;&lt;span class="caps"&gt;CSS&lt;/span&gt; Object Model&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Given this there is now experimental support for inlining all &lt;span class="caps"&gt;CSS&lt;/span&gt; rules into the captured page in PageShot.  The support is still incomplete, and my understanding of everything you can do with &lt;span class="caps"&gt;CSS&lt;/span&gt; is still incomplete.  But the code isn&amp;#8217;t very hard.  One fun thing is that we can test each &lt;span class="caps"&gt;CSS&lt;/span&gt; rule against the page and see if it is needed.  Doing this typically allows 80% of rules to be&amp;nbsp;omitted.&lt;/p&gt;
&lt;p&gt;Some highlights of what I&amp;#8217;ve learned so&amp;nbsp;far:&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s two interesting objects: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/CSSStylesheet"&gt;CSSStylesheet&lt;/a&gt; (which inherits from &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Stylesheet"&gt;Stylesheet&lt;/a&gt;) and &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/CSSRule"&gt;CSSRule&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;&lt;code&gt;document.styleSheets&lt;/code&gt;: a list of all stylesheets, both remote (&lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt;), inline, and imported (&lt;code&gt;@import&lt;/code&gt;)&amp;nbsp;stylesheets.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;styleSheet.href&lt;/code&gt;: the &lt;span class="caps"&gt;URL&lt;/span&gt; of the stylesheet (&lt;code&gt;null&lt;/code&gt; if it was&amp;nbsp;inline).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;styleSheet.cssRules&lt;/code&gt;: a list of all the rules in the&amp;nbsp;stylesheet.  &lt;/p&gt;
&lt;p&gt;&lt;code&gt;cssRule.type&lt;/code&gt;: there&amp;#8217;s &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/CSSRule#Type_constants"&gt;several types of rules&lt;/a&gt;.  I&amp;#8217;ve chosen to ignore everything but &lt;code&gt;STYLE_RULE&lt;/code&gt; and &lt;code&gt;MEDIA_RULE&lt;/code&gt; out of&amp;nbsp;laziness.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cssRule.cssRules&lt;/code&gt;: &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media"&gt;media rules&lt;/a&gt; (like &lt;code&gt;@media (max-width: 600px) {.nav {display: none}}&lt;/code&gt;) contain sub-rules (&lt;code&gt;.nav {display: none}&lt;/code&gt; in this&amp;nbsp;case).&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cssRule.parentRule&lt;/code&gt;: points back to a media rule if there is&amp;nbsp;one.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cssRule.parentStyleSheet&lt;/code&gt;: points back to the parent stylesheet.  There are probably ways of nesting media rules and stylesheets (that can have &lt;code&gt;media&lt;/code&gt; attributes) in ways to create compound media rules that I haven&amp;#8217;t accounted&amp;nbsp;for.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;cssRule.cssText&lt;/code&gt;: the text of the rule.  This includes both selectors and style, or media queries and all the sub-rules.  I just split on &lt;code&gt;{&lt;/code&gt; to separate the selector or query.  I &lt;em&gt;assume&lt;/em&gt; these are representations of the parsed &lt;span class="caps"&gt;CSS&lt;/span&gt;, and so normalized, but I haven&amp;#8217;t explored that in&amp;nbsp;detail.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s all sorts of ways to create trees of media restrictions and other complexities that I know I haven&amp;#8217;t taken account of, but things Mostly Work&amp;nbsp;Anyway.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s an example that makes use of this to create a single inline stylesheet for a page containing only necessary rules (using &lt;span class="caps"&gt;ES6&lt;/span&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;allRules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="c1"&gt;// CSS rules, some of which may be media queries, form a kind of tree; this gets&lt;/span&gt;
&lt;span class="c1"&gt;// this puts all the style rules in a flat list&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;addRules&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;rule&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;sheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cssRules&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MEDIA_RULE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;addRules&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;STYLE_RULE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;allRules&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Then we traverse all the stylesheets and grab rules from each:&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;styleSheet&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;styleSheets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;styleSheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;styleSheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;*&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;styleSheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;media&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;screen&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// This is a stylesheet for some media besides screen&lt;/span&gt;
    &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;addRules&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;styleSheet&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Then we collect the rules up again, clustered by media queries (with&lt;/span&gt;
&lt;span class="c1"&gt;// rulesByMedia[&amp;quot;&amp;quot;] for no media query)&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;rulesByMedia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;rule&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;allRules&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;selector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;{&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Skip selectors that don&amp;#39;t match anything&lt;/span&gt;
    &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;mediaType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parentRule&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parentRule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MEDIA_RULE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;mediaType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;parentRule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cssText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;{&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;rulesByMedia&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mediaType&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;rulesByMedia&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mediaType&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nx"&gt;rulesByMedia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Now we can create a new clean stylesheet:&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;mediaType&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nx"&gt;rulesByMedia&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mediaType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mediaType&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; {&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;rule&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;rulesByMedia&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;mediaType&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;padding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mediaType&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;  &amp;quot;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;padding&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;rule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cssText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mediaType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;style&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;style&amp;gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\n&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;/style&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Obviously there could be rules that apply to &lt;span class="caps"&gt;DOM&lt;/span&gt; elements that aren&amp;#8217;t present &lt;em&gt;right now&lt;/em&gt; but could be created.  And I&amp;#8217;m sure it&amp;#8217;s omitting fonts and animations.  But it&amp;#8217;s fun to hack around&amp;nbsp;with.&lt;/p&gt;
&lt;p&gt;It might be fun to use this hooked up to &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver"&gt;mutation observers&lt;/a&gt; during your testing and find orphaned&amp;nbsp;rules.&lt;/p&gt;</content><category term="mozilla"></category><category term="product-journal"></category></entry><entry><title>Conway’s Corollary</title><link href="https://ianbicking.org/blog/2015/08/conways-corollary.html" rel="alternate"></link><published>2015-08-27T00:00:00-05:00</published><updated>2015-08-27T00:00:00-05:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2015-08-27:/blog/2015/08/conways-corollary.html</id><summary type="html">&lt;p&gt;&lt;a href="http://www.melconway.com/Home/Conways_Law.html"&gt;Conway&amp;#8217;s Law&lt;/a&gt;&amp;nbsp;states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;organizations which design systems are constrained to produce designs which are copies of the communication structures of these&amp;nbsp;organizations&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;#8217;ve always read this as an accusation: we are doomed to recreate the structure of our organizations in the structure of software projects.  And further: projects …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a href="http://www.melconway.com/Home/Conways_Law.html"&gt;Conway&amp;#8217;s Law&lt;/a&gt;&amp;nbsp;states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;organizations which design systems are constrained to produce designs which are copies of the communication structures of these&amp;nbsp;organizations&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;#8217;ve always read this as an accusation: we are doomed to recreate the structure of our organizations in the structure of software projects.  And further: projects cannot become their True Selves, cannot realize the most superior design, unless the organization is itself practically structureless.  That only without the constraints of structure can the engineer make the truly correct choices.  Michelangelo sculpted from marble, a smooth and uniform stone, not from an aggregate, where any hit with the chisel might reveal only the chaotic structure and fault lines of the rock and not his&amp;nbsp;vision.&lt;/p&gt;
&lt;p&gt;But most software is built, not revealed.  I&amp;#8217;m starting to believe that Conway&amp;#8217;s observation is a corollary, not so clearly cause-and-effect.  Maybe we should work with it, not struggle against it.  (With age I&amp;#8217;ve lost the passion for pointless struggle.)  It&amp;#8217;s not that developers can&amp;#8217;t imagine a design that goes contrary to the organizational structure, it&amp;#8217;s that they can&amp;#8217;t &lt;em&gt;ship&lt;/em&gt; those designs.  What we&amp;#8217;re seeing is natural selection.  And when through force of will such a design is shipped, that it survives and is maintained depends on whether that the organization changed in the process, whether a structure was created to support that&amp;nbsp;design.  &lt;/p&gt;
&lt;p&gt;A second skepticism: must a particular construction and modularity of code be paramount?  Code is malleable, and its modularity is for the purpose of humans.  Most of what we do disappears anyway when the machine takes over – functions are inlined, types erased, the pieces become linked, and the machine doesn&amp;#8217;t care one whit about everything we&amp;#8217;ve done to make the software comprehensible.  Modularity is to serve our purposes.  And sometimes organization structure serves a purpose; we change it to meet goals, and we shouldn&amp;#8217;t assume the people who change it are just busybodies.  But those changes are often aspirational, and so those changes are setting ourselves up for conflict as the new structure probably does not mirror the software&amp;nbsp;design.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If the parts of an organization (e.g. teams, departments, or subdivisions) do not closely reflect the essential parts of the product, or if the relationship between organizations do not reflect the relationships between product parts, then the project will be in trouble&amp;#8230; Therefore: Make sure the organization is compatible with the product architecture
– &lt;a href="https://en.wikipedia.org/wiki/Conway%27s_law#cite_note-5"&gt;Coplien and&amp;nbsp;Harrison&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So change the architecture!  There&amp;#8217;s more than one way to resolve these&amp;nbsp;tensions.&lt;/p&gt;
&lt;p&gt;A last speculation: as described in the &lt;a href="http://c2.com/cgi/wiki?SecondSystemEffect"&gt;Second System Effect&lt;/a&gt; we see teams rearchitect systems with excessive modularity and abstraction.  Maybe because they remember all these conflicts, they remember all the times organizational structure and product motivations didn&amp;#8217;t match architecture.  The team makes an incorrect response by creating an architecture that can simultaneously embody all imagined organizational structures, a granularity that embodies not just current organizational tensions but also organizational boundaries that have come and gone.  But the value is only in predicting future changes in structure, and only then if you are&amp;nbsp;lucky.&lt;/p&gt;
&lt;p&gt;Maybe we should look at Conway&amp;#8217;s Law as a prescription: projects &lt;em&gt;should only&lt;/em&gt; have hard boundaries where there are organizational boundaries.  Soft boundaries and definitions still exist everywhere: just like we give local variables meaningful names (even though outside the function no one can tell the difference), we might also create abstractions and modularity that serve immediate and concrete purposes.  But they should only be built for the moment and the task at hand.  Extra effort should be applied to being &lt;em&gt;ready&lt;/em&gt; to refactor in the future, not predicting and embodying those predictions in present modularity.  Perhaps this is another rephrasing of Agile and &lt;a href="http://martinfowler.com/bliki/Yagni.html"&gt;&lt;span class="caps"&gt;YAGNI&lt;/span&gt;&lt;/a&gt;.  Code is a liability, agency over that code is an&amp;nbsp;asset.&lt;/p&gt;</content><category term="mozilla"></category></entry><entry><title>A Product Journal: Objects</title><link href="https://ianbicking.org/blog/2015/07/product-journal-objects.html" rel="alternate"></link><published>2015-07-16T00:00:00-05:00</published><updated>2015-07-16T00:00:00-05:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2015-07-16:/blog/2015/07/product-journal-objects.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;#8217;ve been reading the &lt;a href="http://worrydream.com/EarlyHistoryOfSmalltalk/"&gt;Early History Of Smalltalk&lt;/a&gt;, notes by Alan Kay, and &lt;a href="http://worrydream.com/EarlyHistoryOfSmalltalk/#coda"&gt;this&lt;/a&gt; small note jumped out at&amp;nbsp;me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Another late-binding scheme that is already necessary is …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;#8217;ve been reading the &lt;a href="http://worrydream.com/EarlyHistoryOfSmalltalk/"&gt;Early History Of Smalltalk&lt;/a&gt;, notes by Alan Kay, and &lt;a href="http://worrydream.com/EarlyHistoryOfSmalltalk/#coda"&gt;this&lt;/a&gt; small note jumped out at&amp;nbsp;me:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Another late-binding scheme that is already necessary is to get away from direct protocol matching when a new object shows up in a system of objects. In other words, if someone sends you an object from halfway around the world it will be unusual if it conforms to your local protocols. At some point it will be easier to have it carry even more information about itself–enough so its specifications can be “understood” and its configuration into your mix done by the more subtle matching of&amp;nbsp;inference.&lt;/p&gt;
&lt;p&gt;[&amp;#8230;]&lt;/p&gt;
&lt;p&gt;This higher computational finesse will be needed as the next paradigm shift–that of pervasive networking–takes place over the next five years. Objects will gradually become active agents and will travel the networks in search of useful information and tools for their managers. Objects brought back into a computational environment from halfway around the world will not be able to configure themselves by direct protocol matching as do objects today. Instead, the objects will carry much more information about themselves in a form that permits inferential docking. Some of the ongoing work in specification can be turned to this&amp;nbsp;task.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;An object, sent over the network; it does not exactly have a common protocol, class, or &lt;span class="caps"&gt;API&lt;/span&gt;, but enough information so it can be understood, matched up with some function or purpose according to inference.  We could also assume given this is from Alan Kay that the vision here is that code, not just data, is part of the object and information (though to consider &lt;em&gt;code&lt;/em&gt; to be &lt;em&gt;information&lt;/em&gt;: that is quite a challenge to our modern&amp;nbsp;sensibilities).&lt;/p&gt;
&lt;p&gt;When I read this, it struck me that we have these objects all around us.  The web page: remote, transferable, transformable, embodying functionality and data, with rich information suitable for&amp;nbsp;inference.&lt;/p&gt;
&lt;p&gt;The web page has a kind of minimal protocol, though nothing is entirely forbidden in how it is interpreted.  For instance the page is named in its &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;.  But probably it has a better name in its &lt;code&gt;&amp;lt;meta name=og:title&amp;gt;&lt;/code&gt;, should one exist; nothing is truly formal except by how it will be conventionally interpreted.  The protocol is flexible.  It has internal but opaque state.  The object can initiate activity in a few ways, primarily XMLHttpRequest and a small number of &lt;a href="https://developer.mozilla.org/en-US/docs/WebAPI"&gt;APIs&lt;/a&gt; available to it.  The page receives copious input in the form of&amp;nbsp;events.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s an impoverished object in so many ways.  And it&amp;#8217;s hardly what you would call universal, it&amp;#8217;s always representing visual pages for the browser.  When programming if the browser isn&amp;#8217;t our intended audience then we choose something like &lt;span class="caps"&gt;JSON&lt;/span&gt; or &lt;span class="caps"&gt;REST&lt;/span&gt;: one dead data, one a possessed and untransferable object (I would assert that in &lt;span class="caps"&gt;REST&lt;/span&gt; the object is the server and not the&amp;nbsp;document).&lt;/p&gt;
&lt;p&gt;And yet the web page is an incredible object!  Web pages are sophisticated and well cared for. Our understanding of them is meticulously documented, &lt;em&gt;including&lt;/em&gt; the ambiguity.  The web stack is something that has not just been &amp;#8220;defined&amp;#8221; or &amp;#8220;fixed&amp;#8221;, but also discovered.  Web pages contain gateways into a tremendous number of systems, defined around a surprisingly small set of&amp;nbsp;operations.&lt;/p&gt;
&lt;p&gt;But we don&amp;#8217;t look at them as objects, we don&amp;#8217;t try to deduce or infer much about them.  They don&amp;#8217;t look like the objects we would define were we to design such a system.  But if we shift our gaze from design to discovery then the wealth becomes apparent: these might not be the objects we would ask for, but given the breadth and comprehensiveness of web pages they are the objects we should use.  And they actually &lt;em&gt;work&lt;/em&gt;, they do a ton of useful&amp;nbsp;things.&lt;/p&gt;
&lt;p&gt;Stepping back from the specific product of &lt;a href="https://github.com/mozilla-services/pageshot"&gt;PageShot&lt;/a&gt;, this is the broad direction that excites me: to understand and make use of these objects that are all around us.  (Objects to which Mozilla, with its user agent, has unique access.)  But we need to look more broadly at what we can do with these objects.  PageShot tries one fairly small thing: capture the visual state at one moment, &lt;a href="http://www.ianbicking.org/blog/2015/04/product-journal-building-block.html"&gt;maybe do something with that state&lt;/a&gt;.  If we just had a handful of these operations, exposed properly (not trapped in the depths of monolithic browsers) I think there are some incredible things to be done.  Maybe even a way to bridge from the ad hoc to something more formal; as crazy as the web page execution model seems, it has some nice features, and is the widest deployed sandboxing execution model we&amp;nbsp;have.&lt;/p&gt;
&lt;p&gt;In this sense &lt;a href="http://www.2ality.com/2015/06/web-assembly.html"&gt;Web Assembly&lt;/a&gt; and &lt;a href="http://asmjs.org/"&gt;&lt;span class="caps"&gt;ASM&lt;/span&gt;.js&lt;/a&gt; are interesting as effectively competitors to JavaScript, but not competitors to the web platform or web-page-as-object.  That makes them different from &lt;a href="https://en.wikipedia.org/wiki/Google_Native_Client"&gt;Google Native Client&lt;/a&gt;.  Yes, Web Assembly is essentially another language for the web platform.  But Native Client uses &lt;a href="https://en.wikipedia.org/wiki/Google_Native_Client#Pepper"&gt;Pepper&lt;/a&gt; which is &lt;em&gt;not&lt;/em&gt; the web platform, it&amp;#8217;s a parallel platform that attempts to mimic the web platform.  &lt;span class="caps"&gt;ASM&lt;/span&gt;.js and Web Assembler are a demonstrations that we can change significant parts of the code execution while retaining the outward &lt;span class="caps"&gt;API&lt;/span&gt; of these&amp;nbsp;pages.&lt;/p&gt;
&lt;p&gt;I find this all exciting, but I am somewhat half-hearted in my excitement.  Reading The Early History Of Smalltalk there&amp;#8217;s a certain spirit to their work that I love and often despair at recreating.  There is a visionary aspect, but I think more importantly they took a holistic approach.  There&amp;#8217;s something exciting about opening your mind to far off concepts (a vision) but then try to tie them together creatively, trying different approaches in an effort to maintain simplicity, avoid compromises.  The computing systems they worked on were like &lt;a href="http://edutechwiki.unige.ch/en/Microworld"&gt;Microworlds&lt;/a&gt; of their own creation, they could redefine problems, throw away state, reinvent any interface they chose.  And maybe that is also available to us: only when we hopelessly despair about problems we cannot fix are we trapped by our legacy.  That is, if you accept the web as it is there is a freedom, an agency in that, because you&amp;#8217;ve put aside the things you can&amp;#8217;t&amp;nbsp;change.&lt;/p&gt;
&lt;p&gt;I suspect Alan Kay would take a dim view of this whole notion.  He is not a fan of the web.  Another observation from that&amp;nbsp;history:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Four techniques used together—persistent state, polymorphism, instantiation, and methods-as-goals for the object—account for much of the power. None of these require an &amp;#8220;object-oriented language&amp;#8221; to be employed—&lt;span class="caps"&gt;ALGOL&lt;/span&gt; 68 can almost be turned to this style—an &lt;span class="caps"&gt;OOPL&lt;/span&gt; merely focuses the designer&amp;#8217;s mind in a particular fruitful direction. However, doing encapsulation right is a commitment not just to abstraction of state, but to eliminate state oriented metaphors from&amp;nbsp;programming.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I can&amp;#8217;t even begin to phrase web pages in these terms.  State is a mess: much hosted on remote servers, some in the &lt;span class="caps"&gt;URL&lt;/span&gt;, some in the process of the running page, some in cookies or localStorage, all of it constantly being copied and thrown away.  Is the &lt;span class="caps"&gt;URL&lt;/span&gt; the class and the &lt;span class="caps"&gt;HTML&lt;/span&gt; served over &lt;span class="caps"&gt;HTTP&lt;/span&gt; the instantiation?  These are just painful contortions to find analogs.  Methods-as-goals is the one that seems most interesting and challenging, because I cannot quite identify the goals behind this whole endeavour.  Automation?  Insight?  Detection?  Creation?  Is it different from what Google is doing with its spiders?  Is there something distinct about interpretation in the context of a user agent?  And when the objects are not willing – I am proposing we bend pages to our will, wrestling control from the expectations of site owners – can you do any delegation?  Is there an object waiting to be smithed that encapsulates the&amp;nbsp;page?  &lt;/p&gt;
&lt;p&gt;More tensions than resolutions.  Wish I had time to bathe in those tensions a bit&amp;nbsp;longer.&lt;/p&gt;</content><category term="mozilla"></category><category term="product-journal"></category></entry><entry><title>A Product Journal: Community Participation</title><link href="https://ianbicking.org/blog/2015/05/product-journal-community-participation.html" rel="alternate"></link><published>2015-05-13T00:00:00-05:00</published><updated>2015-05-13T00:00:00-05:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2015-05-13:/blog/2015/05/product-journal-community-participation.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Generally at Mozilla we want to engage and activate our community to further what we do.  Because all our work is open source, and we default to open on …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Generally at Mozilla we want to engage and activate our community to further what we do.  Because all our work is open source, and we default to open on our planning, we have a lot of potential to include people in our work.  But removing barriers to participation doesn&amp;#8217;t make participation&amp;nbsp;happen.&lt;/p&gt;
&lt;p&gt;A couple reasons it&amp;#8217;s particularly&amp;nbsp;challenging:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Volunteers and employees work at different paces.  Employees can devote more time, and can have pressures to meet deadlines so that sometimes the work just needs to get done.  So everything is going fast and a volunteer can have a hard time keeping up.  Until the project is cancelled and then &lt;em&gt;wham&lt;/em&gt;, the employees are all&amp;nbsp;gone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Employees become acclimated to whatever processes are asked of them, because whether they like it or not that&amp;#8217;s the expectation that comes with their paycheck.  Sometimes employees put up with stupid shit as a result.  And sometimes volunteers aren&amp;#8217;t willing to make investments to their process even when it&amp;#8217;s the smart thing to do, &amp;#8216;cause who knows how long you&amp;#8217;ll stick&amp;nbsp;around?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Employee work has to satisfy organizational goals.  The organization can try to keep these aligned with mission goals, and keep the mission aligned with the community, but when push comes to shove the organization&amp;#8217;s goals – including the goals that come from the executive team – are going to take priority for&amp;nbsp;employees.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Volunteers are unlikely to be devoted to Mozilla&amp;#8217;s success.  Instead they have their own goals that may intersect with Mozilla&amp;#8217;s.  This overlap may only occur on one project.  And while that&amp;#8217;s serendipitous, limited overlap means a limit on the relationships those volunteers can build, and it&amp;#8217;s the relationships that are most likely to retain and reward&amp;nbsp;participation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I have a theory that &lt;em&gt;agency&lt;/em&gt; is one of the most important attractors to open source participation.  Mozilla, because of its size and because it has a corporate structure, does not offer a lot of personal agency.  Though in return it does offer some potential of&amp;nbsp;leverage.&lt;/p&gt;
&lt;p&gt;I am not sure what to do with respect to participation in &lt;a href="https://github.com/mozilla-services/pageshot/"&gt;PageShot&lt;/a&gt;.  If I open things up more, will anyone care?  What would people care about?  Maybe people would care about building a product.  Maybe the &lt;a href="http://www.ianbicking.org/blog/2015/04/product-journal-building-block.html"&gt;building blocks&lt;/a&gt; would be more interesting.  We have an &lt;a href="https://github.com/mozilla-services/pageshot/#participation"&gt;&lt;span class="caps"&gt;IRC&lt;/span&gt; channel&lt;/a&gt;, but we also meet regularly over video, which I think has been important for us to assimilate the concept and goals of the project.  Are there other people who would care to show&amp;nbsp;up?&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m also somewhat conflicted about trying to bring people in.  Where will PageShot end up?  The project could be cancelled.  It&amp;#8217;s open source, sure, but is it &lt;em&gt;interesting&lt;/em&gt; as open source if it&amp;#8217;s a deadend addon with no backing site?  Our design is focused on making something broadly appealing such that it could be included in the browser – and if things go well, the addon will be part of the browser itself.  If that happens (and I hope it will!) even my own agency with respect to the project will be at threat.  That&amp;#8217;s what it means to get organizational&amp;nbsp;support.&lt;/p&gt;
&lt;p&gt;If the project was devolved into a set of libraries, it would be easier to contribute to, and easier for volunteers to find value in their participation.  Each piece could be improved on its own, and can live on even if the product that inspired the library does not continue.  People who use those libraries will maintain agency, because they can remix those libraries however they want, include them in whatever product of their own conception that they have.  The problem: I don&amp;#8217;t care about the libraries!  And I don&amp;#8217;t want this to be a &lt;a href="http://www.ianbicking.org/blog/2015/01/product-journal-tech-demo.html"&gt;technology demonstration&lt;/a&gt;, I want it to be a product demonstration, and libraries shift the focus to the wrong&amp;nbsp;part.&lt;/p&gt;
&lt;p&gt;Despite these challenges, I don&amp;#8217;t want to give up on the potential of participation.  I just doubt would look like normal open source participation.  I&amp;#8217;ve &lt;a href="https://github.com/mozilla-services/pageshot#participation"&gt;expanded our participation section&lt;/a&gt;, including an invitation to our standup meetings.  But mostly I need to know if anyone cares, and if you do: what do you care about and what do you want from your&amp;nbsp;participation?&lt;/p&gt;</content><category term="mozilla"></category><category term="product-journal"></category></entry><entry><title>A Product Journal: As We May Discuss</title><link href="https://ianbicking.org/blog/2015/05/product-journal-as-we-may-discuss.html" rel="alternate"></link><published>2015-05-08T00:00:00-05:00</published><updated>2015-05-08T00:00:00-05:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2015-05-08:/blog/2015/05/product-journal-as-we-may-discuss.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In a presentation &lt;a href="https://www.youtube.com/watch?v=2jTctBbX_kw"&gt;The Revolution Will Be Annotated&lt;/a&gt;, Dan Whaley begins with a very high-minded justification for annotation: that it is essential for our existence that we act wisely …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In a presentation &lt;a href="https://www.youtube.com/watch?v=2jTctBbX_kw"&gt;The Revolution Will Be Annotated&lt;/a&gt;, Dan Whaley begins with a very high-minded justification for annotation: that it is essential for our existence that we act wisely, and that we can achieve that through deliberation, and that annotation is a building block for open&amp;nbsp;deliberation.&lt;/p&gt;
&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/2jTctBbX_kw" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;

&lt;p&gt;In response, let me digress wildly, and talk about elementary&amp;nbsp;school.&lt;/p&gt;
&lt;p&gt;It is common to cite large class sizes as a problem, and small class sizes as an opportunity to improve education.  But there is debate about whether class size really matters; it certainly correlates with general privilege, but does it cause improvements?  At the same time I&amp;#8217;ve become much more familiar with the Montessori philosophy of education, and one of the surprising features is a relatively large ideal classroom size, in the 30s.  And why?  Dr. Montessori had positive theories about age mixture, community size, the culture of the classroom, and so forth – but I&amp;#8217;ll add what I think is a Montessori-style reason it&amp;#8217;s okay: it&amp;#8217;s okay to have less teachers because learning isn&amp;#8217;t caused by teachers.  Learning is ultimately an internal process, an assimilation and construction of knowledge.  Your environment can aid in that process, but the &lt;em&gt;cause&lt;/em&gt; is still&amp;nbsp;internal.&lt;/p&gt;
&lt;p&gt;I share Dan&amp;#8217;s enthusiasm about the importance of dialog to our collective wisdom.  But I see dialog as supportive of &lt;em&gt;personal growth&lt;/em&gt;, not of collective wisdom – our collective wisdom will increase as we individually&amp;nbsp;grow.&lt;/p&gt;
&lt;p&gt;Dan cites one problem with rationalism: we are good at constructing rational arguments to support what we already believed.  The annotation remedy is to suppose that what we conveniently leave out of our arguments can be applied later by a diverse set of participants.  Annotation makes it harder to make use of fallacies, harder to make use of limited narratives, because the annotator can add them back&amp;nbsp;in.&lt;/p&gt;
&lt;p&gt;I will cite another problem with rationalism: even a good rational argument is not good at convincing anyone of anything.  A good rational argument is like teaching arithmetic by telling someone that 39301+9402=48703.  Maybe even writing out the steps used to make that calculation.  You can lay that in front of someone, you can lay a hundred similar examples in front of someone, and they will not learn arithmetic.  If the person is disinterested they can just trust you – though then it hardly matters if you were right – but if they are interested I believe that the process of construction is necessary.  You have to solve your own math problems to learn&amp;nbsp;math.&lt;/p&gt;
&lt;p&gt;Annotation is interesting because it gives another avenue for people to publish their beliefs and enter into dialog.  But a global overlay of annotation is not a particularly appealing medium.  It&amp;#8217;s not a place to come to understanding, to practice the construction of ideas.  And I think our collective wisdom depends on an incredible &lt;em&gt;volume&lt;/em&gt; of discussion, not just on an increased quality, because you can&amp;#8217;t get large scale individual growth without large scale&amp;nbsp;discussion.&lt;/p&gt;
&lt;p&gt;I see two features in the typical annotation system: one feature is the ability to talk &lt;em&gt;about&lt;/em&gt; other things, with high fidelity.  URLs have been a great start to being able to talk about things on the web, but they have some limits.  The second feature is the ability to &lt;em&gt;view&lt;/em&gt; these annotations implicitly.  The second feature is the one I&amp;#8217;ve seldom found interesting as a reader, and disagree with as a goal.  Viewing annotations as a universal overlay of commentary asks too much of the annotations, provides too little to me as the reader, and I think is an attempt to pursue a kind of rational universal truth that I find little value in.  It&amp;#8217;s a sense that documents are there to teach us, and annotations make those documents even better&amp;nbsp;teachers.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/mozilla-services/pageshot/"&gt;PageShot&lt;/a&gt; takes a different approach: it gives anyone the ability to talk about anything on the web, but each time you do that you create a new resource, &lt;em&gt;your&lt;/em&gt; discussion lives at &lt;em&gt;your&lt;/em&gt; document.  You can write your commentary for a specific audience, and then give it to that audience, without having your intended audience confused with the original author&amp;#8217;s intended audience.  You can throw away what you have to say.  The person who clicks on your link did it to see what you said, they aren&amp;#8217;t some passerby.  You can say implicitly through highlighting, &lt;em&gt;here is what I thought was interesting&lt;/em&gt;.  But PageShot applies no universality to what you say, it is a tool only of dialog.  This makes PageShot more modest, but intentionally&amp;nbsp;so.&lt;/p&gt;</content><category term="mozilla"></category><category term="product-journal"></category></entry><entry><title>A Product Journal: As A Building Block</title><link href="https://ianbicking.org/blog/2015/04/product-journal-building-block.html" rel="alternate"></link><published>2015-04-23T00:00:00-05:00</published><updated>2015-04-23T00:00:00-05:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2015-04-23:/blog/2015/04/product-journal-building-block.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I teeter between thinking big about &lt;a href="http://www.ianbicking.org/blog/2015/04/product-journal-what-are-we-making.html"&gt;PageShot&lt;/a&gt; and thinking small.  The benefit of thinking small is: how can this tool provide value to people who wouldn&amp;#8217;t know if …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I teeter between thinking big about &lt;a href="http://www.ianbicking.org/blog/2015/04/product-journal-what-are-we-making.html"&gt;PageShot&lt;/a&gt; and thinking small.  The benefit of thinking small is: how can this tool provide value to people who wouldn&amp;#8217;t know if it would provide any value? And: how do we get it&amp;nbsp;done?&lt;/p&gt;
&lt;p&gt;Still I can&amp;#8217;t help but thinking big too.  The web gave us this incredible way to talk about how we experience the web: the &lt;span class="caps"&gt;URL&lt;/span&gt;.  An incredible amount of stuff has been built on that, search and sharing and archiving and ways to draw people into content and let people skim.  Indexes, summaries, APIs, and everyone gets to mint their own URLs and accept anyone else&amp;#8217;s URLs, pointing to&amp;nbsp;anything.&lt;/p&gt;
&lt;p&gt;But not everyone gets to mint URLs.  Developers and site owners get to do that.  If something doesn&amp;#8217;t have a &lt;span class="caps"&gt;URL&lt;/span&gt;, you can&amp;#8217;t point to it.  And every &lt;span class="caps"&gt;URL&lt;/span&gt; is a pointer, a kind of promise that the site owner has to deliver on, and sometimes doesn&amp;#8217;t choose to, or they lose&amp;nbsp;interest.&lt;/p&gt;
&lt;p&gt;I want PageShot to give a capability to users, the ability to address anything, because PageShot captures the state of any page at a moment, not an address so someone else can try to recreate that page.  The frozen page that PageShot saves is handy for things like capturing or highlighting parts of the page, which I think is the feature people will find attractive, but that&amp;#8217;s just a subset of what you might want to do with a snapshot of web content.  So I also hope it will be a building block.  When you put content into PageShot, you will know it is well formed, you will know it is static and available, you can point to exact locations and recover those locations later.  And all via a tool that is accessible to anyone, not just developers.  I think there are neat things to be built on that. (And if you do too, I&amp;#8217;d be interested in hearing about your&amp;nbsp;thoughts.)&lt;/p&gt;</content><category term="mozilla"></category><category term="product-journal"></category></entry><entry><title>A Product Journal: What Are We Making?</title><link href="https://ianbicking.org/blog/2015/04/product-journal-what-are-we-making.html" rel="alternate"></link><published>2015-04-21T00:00:00-05:00</published><updated>2015-04-21T00:00:00-05:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2015-04-21:/blog/2015/04/product-journal-what-are-we-making.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;#8217;ve managed to mostly avoid talking about what we&amp;#8217;re making here.  Perhaps shyness, we (the PageShot team) don&amp;#8217;t yet know where it&amp;#8217;s going, or if …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;#8217;ve managed to mostly avoid talking about what we&amp;#8217;re making here.  Perhaps shyness, we (the PageShot team) don&amp;#8217;t yet know where it&amp;#8217;s going, or if we&amp;#8217;ll manage to get this into&amp;nbsp;Firefox.&lt;/p&gt;
&lt;p&gt;We are making a tool for sharing on the web.  This tool creates a new kind of &lt;em&gt;thing&lt;/em&gt; to share, it&amp;#8217;s not a communication medium of any kind.  We&amp;#8217;re calling it &lt;strong&gt;PageShot&lt;/strong&gt;, similar to a screenshot but with all the power we can add to it since web pages are much more understandable than pixels.  (The things it makes we call a &lt;strong&gt;Shot&lt;/strong&gt;.)&lt;/p&gt;
&lt;p&gt;The tool emphasizes sharing clips or highlights from pages.  These can be screenshots (full or part of the screen) or text clippings.  Along with those clips we keep an archival copy of the entire web page, preserving the full context of the page you were looking at and the origin of each clip.  Generally we try to save as much information and context about the page as we can.  We are trying to avoid &lt;em&gt;choices&lt;/em&gt;, the burdensome effort to decide what you might want in the future.  The more effort you put into using this tool, the more information or specificity you can add to your Shot, but we do what we can to save &lt;em&gt;everything&lt;/em&gt; so you can sort it out later if you&amp;nbsp;want.&lt;/p&gt;
&lt;p&gt;I mentioned &lt;a href="http://www.ianbicking.org/blog/2015/01/product-journal-conception.html"&gt;earlier&lt;/a&gt; that I started this idea thinking about how to make use of frozen copies of the &lt;span class="caps"&gt;DOM&lt;/span&gt;.  What we&amp;#8217;re working on now looks much more like a screenshotting tool that happens to keep this copy of the page.  This changed happened in part because of &lt;a href="https://blog.mozilla.org/ux/2015/02/save-share-revisit/"&gt;user research done at Mozilla&lt;/a&gt; around saving and sharing, where I became aware of just how prevalent screenshots had become to many&amp;nbsp;people.&lt;/p&gt;
&lt;figure style="float: right; background-color: rgba(240, 240, 240, 0.4); padding: 5px; width: 50%; border: 1px solid #aaa; border-radius: 3px;"&gt;&lt;a href="/static/media/pageshot-early-screenshot.png"&gt;&lt;img style="width: 100%; height: auto" src="/static/media/pageshot-early-screenshot.png" /&gt;&lt;/a&gt;&lt;figcaption style="font-size: 80%; line-height: 1em; text-align: center;"&gt;The current (rough) state of the tool&lt;/figcaption&gt;&lt;/figure&gt;

&lt;p&gt;It&amp;#8217;s not hard to understand the popularity of screenshots, specifically on mobile devices.  iPhone users at least have mostly figured out screenshotting, functionality that remains somewhat obscure on desktop devices (and for the life of me I can&amp;#8217;t get my Android device to make a screenshot).  Also screenshots are the one thing that works across applications – even with an application that supports sharing, you don&amp;#8217;t really know what&amp;#8217;s going to be shared, but you know what the screenshot will contain.  You can also share screenshots with confidence: the recipient won&amp;#8217;t have to log in or sign up, they can read it on any device they want, once it has arrived they don&amp;#8217;t need a network connection.  Screenshots are a reliable tool.  A lesson I try to regularly remind myself of: availability beats&amp;nbsp;fidelity.&lt;/p&gt;
&lt;p&gt;In a similar vein we&amp;#8217;ve seen the rise of the animated gif over the video (though video resurging now that it&amp;#8217;s &lt;em&gt;just a file&lt;/em&gt; again), and the smuggling in of long texts to Twitter via&amp;nbsp;images.&lt;/p&gt;
&lt;p&gt;A lot of this material moves through communication mediums via links and metadata, but those links and metadata are generally under the control of site owners.  It&amp;#8217;s up to the site owner what someone sees when they click a link, it&amp;#8217;s up to them what the metadata will suggest go into the image previous and description.  PageShot gives that control to the person sharing, since each Shot is &lt;em&gt;your link&lt;/em&gt;, your copy and your&amp;nbsp;perspective.&lt;/p&gt;
&lt;p&gt;As of this moment (April 2015) our designs are still ahead of our implementation, so there&amp;#8217;s not a lot to try out at this moment, but this is what we&amp;#8217;re putting&amp;nbsp;together.&lt;/p&gt;
&lt;p&gt;If you want to follow along, check out the &lt;a href="https://github.com/mozilla-services/pageshot"&gt;repository&lt;/a&gt;.&lt;/p&gt;</content><category term="mozilla"></category><category term="product-journal"></category></entry><entry><title>A Product Journal: The Evolutionary Prototype</title><link href="https://ianbicking.org/blog/2015/03/product-journal-evolutionary-prototype.html" rel="alternate"></link><published>2015-03-20T00:00:00-05:00</published><updated>2015-03-20T00:00:00-05:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2015-03-20:/blog/2015/03/product-journal-evolutionary-prototype.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I came upon a new (for me) term recently: &lt;a href="https://en.wikipedia.org/wiki/Software_prototyping#Evolutionary_prototyping"&gt;evolutionary prototyping&lt;/a&gt;.  This is in contrast to the &lt;a href="https://en.wikipedia.org/wiki/Software_prototyping#Throwaway_prototyping"&gt;rapid or throwaway prototype&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another term for the rapid prototype: the &amp;#8220;close-ended …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m blogging about the development of a new product in Mozilla, &lt;a href="http://www.ianbicking.org/tag/product-journal.html"&gt;look here for my other posts in this&amp;nbsp;series&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I came upon a new (for me) term recently: &lt;a href="https://en.wikipedia.org/wiki/Software_prototyping#Evolutionary_prototyping"&gt;evolutionary prototyping&lt;/a&gt;.  This is in contrast to the &lt;a href="https://en.wikipedia.org/wiki/Software_prototyping#Throwaway_prototyping"&gt;rapid or throwaway prototype&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another term for the rapid prototype: the &amp;#8220;close-ended prototype.&amp;#8221;  The prototype with a sunset, unlike the evolutionary prototype which is expected to become the final product, even if every individual piece of work will only end up as disposable scaffolding for the final&amp;nbsp;product.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The main goal when using Evolutionary Prototyping is to build a very robust prototype in a structured manner and constantly refine&amp;nbsp;it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The first version of the product, written primarily late at night, was definitely a throwaway prototype.  All imperative jQuery &lt;span class="caps"&gt;UI&lt;/span&gt; and lots of copy-and-paste code.  It served its purpose.  I was able to extend that code reasonably well – and I played with many ideas during that initial stage – but it was unreasonable to ask anyone else to touch it, and even I hated the code when I had stepped away from it for a couple weeks.  So most of the code is being rewritten for the next&amp;nbsp;phase.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To minimize risk, the developer does not implement poorly understood features. The partial system is sent to customer sites. As users work with the system, they detect opportunities for new features and give requests for these features to developers. Developers then take these enhancement requests along with their own and use sound configuration-management practices to change the software-requirements specification, update the design, recode and&amp;nbsp;retest.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Thinking about this, it&amp;#8217;s a lot like the &lt;a href="https://en.wikipedia.org/wiki/Minimum_viable_product"&gt;Minimal Viable Product&lt;/a&gt; approach.  Of which &lt;a href="http://www.ianbicking.org/blog/2015/01/product-journal-mvp.html"&gt;I am skeptical&lt;/a&gt;.  And maybe I&amp;#8217;m skeptical because I see &lt;span class="caps"&gt;MVP&lt;/span&gt; as reductive, encouraging the aggressive stripping down of a product, and in the process encouraging design based on conventional wisdom instead of critical engagement.  When people push me in that direction I get cagey and defensive (not a great response on my part, just acknowledging it).  The framing of the evolutionary prototype feels more humble to me.  I don&amp;#8217;t want to focus on the question &amp;#8220;how can we most quickly get this into users hands?&amp;#8221; but instead &amp;#8220;what do we know we should build, so we can &lt;a href="http://kiriakakis.net/comics/mused/a-day-at-the-park"&gt;collect&lt;/a&gt; a fuller list of questions we want to&amp;nbsp;answer?&amp;#8221;&lt;/p&gt;</content><category term="mozilla"></category><category term="product-journal"></category></entry><entry><title>A Product Journal: As A Working Manager</title><link href="https://ianbicking.org/blog/2015/03/product-journal-as-a-working-manager.html" rel="alternate"></link><published>2015-03-10T00:00:00-05:00</published><updated>2015-03-10T00:00:00-05:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2015-03-10:/blog/2015/03/product-journal-as-a-working-manager.html</id><summary type="html">&lt;p&gt;One of the bigger changes going from engineer to manager was to redefine what I meant by the question: &lt;em&gt;how are we going to do this?&lt;/em&gt;  As an engineer I would deconstruct that question to ask what is the software we need to build, and the technical barriers we need …&lt;/p&gt;</summary><content type="html">&lt;p&gt;One of the bigger changes going from engineer to manager was to redefine what I meant by the question: &lt;em&gt;how are we going to do this?&lt;/em&gt;  As an engineer I would deconstruct that question to ask what is the software we need to build, and the technical barriers we need to remove, to achieve our goals.  As a manager I would deconstruct that question to ask what is the process by which we achieve our&amp;nbsp;goals.&lt;/p&gt;
&lt;p&gt;When I wear my manager hat and ask &amp;#8220;how are we going to do this?&amp;#8221; I get a little frustrated when I get the answer &amp;#8220;I don&amp;#8217;t know.&amp;#8221;  But that&amp;#8217;s unfair – there are always problems to which we do not know the answer.  What makes me frustrated is when the answer comes too quick, when someone says &amp;#8220;I don&amp;#8217;t know&amp;#8221; because they are missing something they feel they need to come up with an answer.  &lt;em&gt;I don&amp;#8217;t know&lt;/em&gt; because we have to write more code before we know if the idea is feasible.  &lt;em&gt;I don&amp;#8217;t know&lt;/em&gt; because the decision is someone else&amp;#8217;s, and so&amp;nbsp;on.&lt;/p&gt;
&lt;p&gt;You know!  If the decision is someone else&amp;#8217;s, then the answer to the question is: we are going to do this by asking that other person what they want and how they are going to make that decision.  If we don&amp;#8217;t know if the idea is feasible, then the answer to the question is: we are going to do this by exploring the feasibility of this technique, and doing another iteration of planning once we know more.  &amp;#8220;I don&amp;#8217;t know because&amp;#8230;&amp;#8221; is fine because it is an answer of sorts, it lets the team make an answer in the form of a process.  &amp;#8220;I don&amp;#8217;t know.&amp;#8221; – ended with a period – is even okay for a moment, if you treat it as meaning &amp;#8220;I don&amp;#8217;t know so we are going to do this by learning.&amp;#8221;  It&amp;#8217;s the &amp;#8220;I don&amp;#8217;t know, let&amp;#8217;s move on&amp;#8221; that I don&amp;#8217;t&amp;nbsp;like.&lt;/p&gt;
&lt;p&gt;But I&amp;#8217;m being a little unfair.  It&amp;#8217;s my job as a manager to answer at the process level.  While I try very hard not to pigeonhole people, maybe I should also work harder at accepting when people establish bounds to their role.  When you are trying to &lt;em&gt;produce&lt;/em&gt; it can make sense to stay focused, to resist going meta.  When you are working in a team, you should rely on the diverse skills of your teammates to let go of certain parts of the project.  It can be okay to go heads-down.  (Sometimes; and sometimes everyone on the team must lift their heads and respond to&amp;nbsp;circumstance.)&lt;/p&gt;
&lt;p&gt;This is a long-winded way of saying that I appreciate more of the difference in perspective of an engineer and a manager.  It&amp;#8217;s hard to hold both perspectives at once, and harder still to act on&amp;nbsp;both.&lt;/p&gt;
&lt;p&gt;In my new project I am returning to development, and entering into the role of &lt;em&gt;working manager&lt;/em&gt;, an odd way to say that I am performing the same tasks that I am also managing.  I &lt;a href="http://www.ianbicking.org/blog/2014/09/professional-transitions.html"&gt;cut myself off from programming&lt;/a&gt; when I started management so that I would not let myself be distracted from a new role and the considerable learning I had to do.  Returning to programming, I can tell I was right to do&amp;nbsp;so.&lt;/p&gt;
&lt;p&gt;Moving between these two mindsets, and two very different ways of working, is challenging.  In both I want to be proactive, but as a manager towards people, and as an engineer towards code.  With people I&amp;#8217;m investing my time in small chunks, trying to keep a good velocity of communication, watching for dropped balls, and the payoffs are largely indirect and deferred.  With code it takes time to navigate my next task, I want to focus, I&amp;#8217;m constantly trying to narrow that focus.  And the payoff is direct and immediate: working code.  This narrowed focus is a way to push forward much more reliably, so long as I know which way is&amp;nbsp;forward.&lt;/p&gt;
&lt;p&gt;But I&amp;#8217;m a working manager.  Is now the right time to investigate that odd log message I&amp;#8217;m seeing, or to think about who I should talk to about product opportunities?  There&amp;#8217;s no metric to compare the priority of two tasks that are so far&amp;nbsp;apart.&lt;/p&gt;
&lt;p&gt;If I am going to find time to do development I am a bit worried I have two&amp;nbsp;options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Keep doing programming after&amp;nbsp;hours&lt;/li&gt;
&lt;li&gt;Start dropping some balls as a&amp;nbsp;manager&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I&amp;#8217;ve been doing a little of both.  To mitigate the effect of dropping balls I&amp;#8217;ve tried my best to be transparent about this.  It may have been effective: I am not doing my best work on X, because I&amp;#8217;m trying to do my best work on Y.  But I won&amp;#8217;t really know if this has worked until later, turnaround on relationship feedback takes a&amp;nbsp;while.&lt;/p&gt;
&lt;p&gt;An aside: I&amp;#8217;ve been learning a bit about &lt;a href="http://www.gv.com/lib/how-google-sets-goals-objectives-and-key-results-okrs"&gt;Objectives and Key Results&lt;/a&gt;, a kind of quarterly performance analysis structure, and I particularly appreciate how it asks people to attempt to achieve 70% of their identified goals, not 100%.  If you commit to 100% then you&amp;#8217;ve committed yourself to a plan you made at the beginning of the quarter.  You&amp;#8217;ve erased your agency to&amp;nbsp;prioritize.  &lt;/p&gt;
&lt;p&gt;Anyway, onward and upward, and wish me luck in letting the right balls&amp;nbsp;drop.&lt;/p&gt;</content><category term="mozilla"></category><category term="product-journal"></category></entry><entry><title>A Product Journal: Building for a Demo</title><link href="https://ianbicking.org/blog/2015/02/product-journal-building-a-demo.html" rel="alternate"></link><published>2015-02-18T00:00:00-06:00</published><updated>2015-02-18T00:00:00-06:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2015-02-18:/blog/2015/02/product-journal-building-a-demo.html</id><summary type="html">&lt;p&gt;I&amp;#8217;ve been trying to work through a post on technology choices, as I had it in my mind that we should rewrite substantial portions of the product.  We&amp;#8217;ve just upped the team size to two, adding &lt;a href="http://donovanpreston.blogspot.com/"&gt;Donovan Preston&lt;/a&gt;, and it&amp;#8217;s an opportunity to share in some of …&lt;/p&gt;</summary><content type="html">&lt;p&gt;I&amp;#8217;ve been trying to work through a post on technology choices, as I had it in my mind that we should rewrite substantial portions of the product.  We&amp;#8217;ve just upped the team size to two, adding &lt;a href="http://donovanpreston.blogspot.com/"&gt;Donovan Preston&lt;/a&gt;, and it&amp;#8217;s an opportunity to share in some of these decisions. And get rid of code that was desperately expedient.  The server is only &lt;a href="https://github.com/mozilla-services/pageshot/blob/f3df30ccaf64b75426e87325addc6fac373ba220/appengine/pageshotpages/main.py"&gt;400ish lines&lt;/a&gt;, with some significant copy-and-paste, so we&amp;#8217;re not losing any big&amp;nbsp;investment.&lt;/p&gt;
&lt;p&gt;Now I wonder if part of the &lt;a href="http://www.joelonsoftware.com/articles/fog0000000069.html"&gt;danger of a rewrite&lt;/a&gt; isn&amp;#8217;t the effort, but that it&amp;#8217;s an excuse to go heads-down and starve your situational&amp;nbsp;awareness.&lt;/p&gt;
&lt;p&gt;In other news there has been a &lt;a href="http://blog.johnath.com/2015/02/17/home-for-a-rest/"&gt;major resignation&lt;/a&gt; at Mozilla.  I&amp;#8217;d read into it largely what Johnathan implies in his post: things seem to be on a good track, so he&amp;#8217;s comfortable leaving. But the &lt;span class="caps"&gt;VP&lt;/span&gt; of Firefox can&amp;#8217;t leave without some significant organizational impact.  Now is an important time for me to be situationally aware, and for the product itself to show situational awareness.  The technical underpinnings aren&amp;#8217;t that relevant at this&amp;nbsp;moment.&lt;/p&gt;
&lt;p&gt;So instead, if only for a few days, I want to move back into expedient demoable product mode.  Now is the time to explain the product to other people in&amp;nbsp;Mozilla.&lt;/p&gt;
&lt;p&gt;The choices this implies feel weird at times.  What is most important? Security bugs?  Hardly!  It needs to demonstrate some things to different&amp;nbsp;stakeholders:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;There are some technical parts that require demonstration.  Can we freeze the &lt;span class="caps"&gt;DOM&lt;/span&gt; and produce something usable?  Only an existence proof is really convincing.  Can we do a login system?  Of course!  So I build out the &lt;span class="caps"&gt;DOM&lt;/span&gt; freezing and fix bugs in it, but I&amp;#8217;m preparing to build a login system where you type in your email address.  I&amp;#8217;m sure you wouldn&amp;#8217;t lie so we&amp;#8217;ll just believe you are who you say you&amp;nbsp;are.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But I want to get to the interesting questions.  Do we require a login for this system?  If not, what can an anonymous user do?  I don&amp;#8217;t have an answer, but I want to engage people in the question.  I think one of the best outcomes of a demo is having people think about these questions, offer up solutions and criticisms.  If the demo makes everyone really impressed with how smart I am that is very self-gratifying, but it does not engage people with the product, and I want to build engagement.  To ask a good question I do need to build enough of the context to clarify the question.  I at least need fake&amp;nbsp;logins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;#8217;ve been getting design/user experience help from &lt;a href="http://www.brampitoyo.com/"&gt;Bram Pitoyo&lt;/a&gt; too, and now we have a number of interesting mockups.  More than we can implemented in short order.  I&amp;#8217;m trying to figure out how to integrate these mockups into the demo itself &amp;#8212; as simple as &amp;#8220;also look at this idea we have&amp;#8221;.  We should maintain a similar style (colors, basic layout), so that someone can look at a mockup and use all the context that I&amp;#8217;ve introduced from the live&amp;nbsp;demo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So far I&amp;#8217;ve put no effort into onboarding.  A person who picks up the tool may have no idea how it is supposed to be used.  Or maybe they would figure it out: I haven&amp;#8217;t even thought it through.  Since &lt;em&gt;I&lt;/em&gt; know how it works, and I&amp;#8217;m doing the demo, that&amp;#8217;s okay.  My in-person narration is the onboarding experience.  But even if I&amp;#8217;m trying to explain the product internally, I should recognize I&amp;#8217;m cutting myself off from an organic growth of&amp;nbsp;interest.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are other stakeholders I keep forgetting about.  I need to speak to the &lt;a href="https://www.mozilla.org/en-US/about/manifesto/"&gt;Mozilla Mission&lt;/a&gt;. I think I have a good story to tell there, but it&amp;#8217;s not the conventional wisdom of what it means to embody the mission.  I see this as a tool of direct outward-facing individual empowerment, not the mediated power of federation, not the opting-out power of privacy, not the committee-mediated and developer driven power of&amp;nbsp;standards.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Another stakeholder: people who care about the Firefox brand and marketing our products.  Right now the tool lacks any branding, and it would be inappropriate to deploy this as a branded product right now. But I can &lt;em&gt;demo&lt;/em&gt; a branded product.  There may also be room to experiment with a &lt;a href="https://en.wikipedia.org/wiki/Call_to_action_(marketing)"&gt;call to action&lt;/a&gt;, and to start a discussion about what that would mean.  I shouldn&amp;#8217;t be afraid to do it really badly, because that starts the conversation, and I&amp;#8217;d rather attract the people who think deeply about these things than try to solve them&amp;nbsp;myself.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So I&amp;#8217;m off now on another iteration of really scrappy coding, along with some strategic&amp;nbsp;fakery.&lt;/p&gt;</content><category term="mozilla"></category><category term="product-journal"></category></entry><entry><title>A Product Journal: To MVP Or Not To MVP</title><link href="https://ianbicking.org/blog/2015/01/product-journal-mvp.html" rel="alternate"></link><published>2015-01-27T00:00:00-06:00</published><updated>2015-01-27T00:00:00-06:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2015-01-27:/blog/2015/01/product-journal-mvp.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m going to try to journal the process of a new product that I&amp;#8217;m developing in &lt;a href="https://blog.mozilla.org/services/"&gt;Mozilla Cloud Services&lt;/a&gt;.  My previous post was &lt;a href="http://www.ianbicking.org/blog/2015/01/product-journal-tech-demo.html"&gt;&lt;em&gt;The Tech Demo&lt;/em&gt;&lt;/a&gt;, and the first in the series is &lt;a href="http://www.ianbicking.org/blog/2015/01/product-journal-conception.html"&gt;&lt;em&gt;Conception&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;The Minimal Viable&amp;nbsp;Product&lt;/h2&gt;
&lt;p&gt;The Minimal Viable Product is a popular product development approach …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;I&amp;#8217;m going to try to journal the process of a new product that I&amp;#8217;m developing in &lt;a href="https://blog.mozilla.org/services/"&gt;Mozilla Cloud Services&lt;/a&gt;.  My previous post was &lt;a href="http://www.ianbicking.org/blog/2015/01/product-journal-tech-demo.html"&gt;&lt;em&gt;The Tech Demo&lt;/em&gt;&lt;/a&gt;, and the first in the series is &lt;a href="http://www.ianbicking.org/blog/2015/01/product-journal-conception.html"&gt;&lt;em&gt;Conception&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;The Minimal Viable&amp;nbsp;Product&lt;/h2&gt;
&lt;p&gt;The Minimal Viable Product is a popular product development approach at Mozilla, and judging from Hacker News it is popular everywhere (but that is a wildly inaccurate way to judge common&amp;nbsp;practice).&lt;/p&gt;
&lt;p&gt;The idea is that you build the smallest thing that could be useful, and you ship it.  The idea isn&amp;#8217;t to make a great product, but to make &lt;em&gt;something&lt;/em&gt; so you can learn in the field.  A couple&amp;nbsp;definitions:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Minimum Viable Product (&lt;span class="caps"&gt;MVP&lt;/span&gt;) is a key lean startup concept popularized by Eric Ries. The basic idea is to &lt;strong&gt;maximize validated learning for the least amount of effort&lt;/strong&gt;. After all, why waste effort building out a product without first testing if it’s worth&amp;nbsp;it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&amp;#8221;&amp;#8220;– from &lt;a href="http://practicetrumpstheory.com/how-i-built-my-minimum-viable-product/"&gt;How I built my Minimum Viable Product&lt;/a&gt; (emphasis in&amp;nbsp;original)&amp;#8221;&amp;#8220;&amp;#8221;&lt;/p&gt;
&lt;p&gt;I like this phrase &amp;#8220;validated learning.&amp;#8221;  Another&amp;nbsp;definition:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A core component of Lean Startup methodology is the build-measure-learn feedback loop. The first step is figuring out the problem that needs to be solved and then developing a minimum viable product (&lt;span class="caps"&gt;MVP&lt;/span&gt;) to begin the process of learning as quickly as possible. &lt;strong&gt;Once the &lt;span class="caps"&gt;MVP&lt;/span&gt; is established, a startup can work on tuning the engine.&lt;/strong&gt; This will involve measurement and learning and must include actionable metrics that can demonstrate cause and effect&amp;nbsp;question.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&amp;#8221;&amp;#8220;– &lt;a href="http://theleanstartup.com/principles"&gt;Lean Startup Methodology&lt;/a&gt; (emphasis&amp;nbsp;added)&amp;#8221;&amp;#8220;&amp;#8221;&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t like this model at all: &amp;#8220;once the &lt;span class="caps"&gt;MVP&lt;/span&gt; is established, a startup can work on &lt;strong&gt;tuning the engine&lt;/strong&gt;.&amp;#8221;  You &lt;em&gt;tune&lt;/em&gt; something that works the way you want it to, but isn&amp;#8217;t powerful or efficient or fast enough.  You&amp;#8217;ve established almost nothing when you&amp;#8217;ve created an &lt;span class="caps"&gt;MVP&lt;/span&gt;, no aspect of the product is validated, it would be premature to tune. But I see this antipattern happen frequently: get an &lt;span class="caps"&gt;MVP&lt;/span&gt; out quickly, often shutting down critically engaged deliberation in order to Just Get It Shipped, then use that product as the model for further incremental improvements.  Just Get It Shipped is okay, incrementally improving products is okay, but together they are boring and&amp;nbsp;uncreative.&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s another broad discussion to be had another time about how to enable positive and constructive critical engagement around a project. It&amp;#8217;s not easy, but that&amp;#8217;s where learning happens, and the &lt;strong&gt;purpose of the &lt;span class="caps"&gt;MVP&lt;/span&gt; is to learn, not to produce&lt;/strong&gt;.  In contrast I find myself impressed by the shear willfulness of the &lt;a href="http://www.gamasutra.com/view/feature/131815/the_cabal_valves_design_process_.php"&gt;Halflife development process&lt;/a&gt; which apparently involved months of six hour design meetings, four days a week, producing large and detailed design documents.  Maybe I&amp;#8217;m impressed because it sounds &lt;em&gt;so exhausting&lt;/em&gt;, a feat of endurance.  And perhaps it implies that waterfall can work if you invest in it&amp;nbsp;properly.&lt;/p&gt;
&lt;h2&gt;Plan plan&amp;nbsp;plan&lt;/h2&gt;
&lt;p&gt;I have a certain respect for this development pattern that Dijkstra&amp;nbsp;describes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Q:&lt;/strong&gt; In practice it often appears that pressures of production reward clever programming over good programming: how are we progressing in making the case that good programming is also cost&amp;nbsp;effective?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Well, it has been said over and over again that the tremendous cost of programming is caused by the fact that it is done by cheap labor, which makes it very expensive, and secondly that people rush into coding. One of the things people learn in colleges nowadays is to think first; that makes the development more cost effective. I know of at least one software house in France, and there may be more because this story is already a number of years old, where it is a firm rule of the house, that for whatever software they are committed to deliver, coding is not allowed to start before seventy percent of the scheduled time has elapsed. So if after nine months a project team reports to their boss that they want to start coding, he will ask: &amp;#8220;Are you sure there is nothing else to do?&amp;#8221; If they say yes, they will be told that the product will ship in three months. That company is highly&amp;nbsp;successful.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&amp;#8221;&amp;#8220;– from &lt;a href="https://www.cs.utexas.edu/users/EWD/misc/vanVlissingenInterview.html"&gt;Interview Prof. Dr. Edsger W. Dijkstra, Austin, 04–03–1985&lt;/a&gt;&amp;#8220;&amp;#8221;&amp;#8220;&lt;/p&gt;
&lt;p&gt;Or, a warning &lt;a href="http://www.linfo.org/q_programming.html"&gt;from a page full of these kind of quotes&lt;/a&gt;: &amp;#8220;Weeks of programming can save you hours of planning.&amp;#8221;  The planning process Dijkstra describes is intriguing, it says something like: if you spend two weeks making a plan for how you&amp;#8217;ll complete a project in two weeks then it is an appropriate investment to spend another week of planning to save half a week of programming.  Or, if you spend a month planning for a month of programming, then you haven&amp;#8217;t invested enough in planning to justify that programming work – to ensure the quality, to plan the order of approach, to understand the pieces that fit together, to ensure the foundation is correct, ensure the staffing is appropriate, and so&amp;nbsp;on.&lt;/p&gt;
&lt;p&gt;I believe &amp;#8220;Waterfall Design&amp;#8221; gets much of its negative connotation from a lack of good design.  A Waterfall process requires the design to be &lt;em&gt;very very good&lt;/em&gt;.  With Waterfall the design is too important to leave it to the experts, to let the architect arrange technical components, the program manager to arrange schedules, the database architect to design the storage, and so on.  It&amp;#8217;s anti-collaborative, disengaged.  It relies on intuition and common sense, and those are not powerful enough.  I&amp;#8217;ll quote Dijkstra&amp;nbsp;again:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The usual way in which we plan today for tomorrow is in yesterday&amp;#8217;s vocabulary. We do so, because we try to get away with the concepts we are familiar with and that have acquired their meanings in our past experience. Of course, the words and the concepts don&amp;#8217;t quite fit because our future differs from our past, but then we stretch them a little bit. Linguists are quite familiar with the phenomenon that the meanings of words evolve over time, but also know that this is a slow and gradual&amp;nbsp;process.&lt;/p&gt;
&lt;p&gt;It is the most common way of trying to cope with novelty: by means of metaphors and analogies we try to link the new to the old, the novel to the familiar. Under sufficiently slow and gradual change, it works reasonably well; in the case of a sharp discontinuity, however, the method breaks down: though we may glorify it with the name &amp;#8220;common sense&amp;#8221;, our past experience is no longer relevant, the analogies become too shallow, and the metaphors become more misleading than illuminating. This is the situation that is characteristic for the &amp;#8220;radical&amp;#8221;&amp;nbsp;novelty.&lt;/p&gt;
&lt;p&gt;Coping with radical novelty requires an orthogonal method. One must consider one&amp;#8217;s own past, the experiences collected, and the habits formed in it as an unfortunate accident of history, and one has to approach the radical novelty with a blank mind, consciously refusing to try to link it with what is already familiar, because the familiar is hopelessly inadequate. One has, with initially a kind of split personality, to come to grips with a radical novelty as a dissociated topic in its own right. Coming to grips with a radical novelty amounts to creating and learning a new foreign language that can not be translated into one&amp;#8217;s mother tongue. (Any one who has learned quantum mechanics knows what I am talking about.) Needless to say, adjusting to radical novelties is not a very popular activity, for it requires hard work. For the same reason, the radical novelties themselves are&amp;nbsp;unwelcome.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span class="dquo"&gt;&amp;#8220;&lt;/span&gt;&amp;#8221;&amp;#8220;– from &lt;a href="https://www.cs.utexas.edu/~EWD/transcriptions/EWD10xx/EWD1036.html"&gt;&lt;span class="caps"&gt;EWD&lt;/span&gt; 1036, On the cruelty of really teaching computing science&lt;/a&gt;&amp;#8220;&amp;#8221;&amp;#8220;&lt;/p&gt;
&lt;h1&gt;Research&lt;/h1&gt;
&lt;p&gt;All this praise of planning implies you know what you are trying to make.&amp;nbsp;Unlikely!&lt;/p&gt;
&lt;p&gt;Coding can be a form of planning.  You can&amp;#8217;t research how interactions feel without having an actual interaction to look at.  You can&amp;#8217;t figure out how feasible some techniques are without trying them. Planning without collaborative creativity is dull, planning without research is just documenting someone&amp;#8217;s&amp;nbsp;intuition.&lt;/p&gt;
&lt;p&gt;The danger is that when you are planning with code, it &lt;em&gt;feels&lt;/em&gt; like execution.  You can &lt;a href="http://c2.com/cgi/wiki?PlanToThrowOneAway"&gt;plan to throw one away&lt;/a&gt; to put yourself in the right state of mind, but I think it is better to simply be clear and transparent about &lt;em&gt;why&lt;/em&gt; you are writing the code you are writing.  Transparent because the danger isn&amp;#8217;t just that &lt;em&gt;you&lt;/em&gt; confuse your coding with execution, but that anyone else is likely to confuse the two as&amp;nbsp;well.&lt;/p&gt;
&lt;p&gt;So code up a storm to learn, code up something usable so people will use it and then you can learn from that&amp;nbsp;too.&lt;/p&gt;
&lt;h1&gt;My own&amp;nbsp;conclusion&amp;#8230;&lt;/h1&gt;
&lt;p&gt;I&amp;#8217;m not making an &lt;span class="caps"&gt;MVP&lt;/span&gt;.  I&amp;#8217;m not going to make a maximum viable product either – rather, the next step in the project is not to make a viable product.  The next stage is research and learning.  Code is going to be part of that.  Dogfooding will be part of it too, because I believe that&amp;#8217;s important for learning.  I fear thinking in terms of &amp;#8220;&lt;span class="caps"&gt;MVP&lt;/span&gt;&amp;#8221; would let us lose sight of the &lt;em&gt;why&lt;/em&gt; behind this iteration – it is a dangerous abstraction during a period of product&amp;nbsp;definition.&lt;/p&gt;
&lt;p&gt;Also, if you&amp;#8217;ve gotten this far, you&amp;#8217;ll see I&amp;#8217;m not creating minimal viable blog posts.  Sorry about&amp;nbsp;that.&lt;/p&gt;</content><category term="mozilla"></category><category term="product-journal"></category></entry><entry><title>A Product Journal: The Technology Demo</title><link href="https://ianbicking.org/blog/2015/01/product-journal-tech-demo.html" rel="alternate"></link><published>2015-01-22T00:00:00-06:00</published><updated>2015-01-22T00:00:00-06:00</updated><author><name>Ian Bicking</name></author><id>tag:ianbicking.org,2015-01-22:/blog/2015/01/product-journal-tech-demo.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;I’m going to try to journal the process of a new product that I’m developing in &lt;a href="https://blog.mozilla.org/services/"&gt;Mozilla Cloud Services&lt;/a&gt;.  My previous and first post was &lt;a href="http://www.ianbicking.org/blog/2015/01/product-journal-conception.html"&gt;&lt;em&gt;Conception&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As I &lt;a href="http://www.ianbicking.org/blog/2015/01/product-journal-conception.html"&gt;finished my last post&lt;/a&gt; I had a product idea built around a strategy (growth through social tools and sharing) and …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;I’m going to try to journal the process of a new product that I’m developing in &lt;a href="https://blog.mozilla.org/services/"&gt;Mozilla Cloud Services&lt;/a&gt;.  My previous and first post was &lt;a href="http://www.ianbicking.org/blog/2015/01/product-journal-conception.html"&gt;&lt;em&gt;Conception&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As I &lt;a href="http://www.ianbicking.org/blog/2015/01/product-journal-conception.html"&gt;finished my last post&lt;/a&gt; I had a product idea built around a strategy (growth through social tools and sharing) and a technology (freezing or copying the &lt;a href="https://en.wikipedia.org/wiki/Document_Object_Model"&gt;markup&lt;/a&gt;).  But that&amp;#8217;s not a concise product definition centered around user value. It&amp;#8217;s not even &lt;em&gt;trying&lt;/em&gt;.  The result is a technology demo, not a&amp;nbsp;product.&lt;/p&gt;
&lt;p&gt;In my defense I&amp;#8217;m searching for some product, I don&amp;#8217;t know what it is, and I don&amp;#8217;t know if it exists.  I have to push this past a technology demo, but if I have to start with a technology demo then so it&amp;nbsp;goes.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve found a couple specific experiences that help me adapt the&amp;nbsp;product:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I demo the product and I sense an excitement for something I didn&amp;#8217;t expect.  For example, a view that I thought was just a logical necessity might be what most appeals to someone else.  To do this I have to show the tool to people, and it has to include things that &lt;em&gt;I&lt;/em&gt; think are somewhat superfluous.  And I have to be actively reading the person viewing the demo to sense their&amp;nbsp;excitement.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remind myself continuously of the strategy.  It also helps when I remind other people, even if they don&amp;#8217;t need reminding – it centers the discussion and my thinking around the goal.  In this case there&amp;#8217;s a lot of personal productivity use cases for the technology, and it&amp;#8217;s easy to drift in that direction.  It&amp;#8217;s easy because &lt;em&gt;the technology&lt;/em&gt; facilitates those use cases.  And while it&amp;#8217;s cool to make something widely useful, that won&amp;#8217;t make this tool work the way I want as a product, or work for Mozilla.  (And because I plan to build this on Mozilla&amp;#8217;s dime it better work for Mozilla!  But that&amp;#8217;s a discussion for another&amp;nbsp;post.)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;#8217;ll poorly paraphrase something I&amp;#8217;m sure someone can source in the comments: &lt;em&gt;a product that people love is one that makes those people feel great about themselves&lt;/em&gt;.  In this case, makes them feel like a journalist and not just a crank, or makes them feel like they are successfully posing as a professional, or makes them feel like what they are doing is appreciated by other people, or makes them feel like an efficient organizer.  In the product design you can exult the product, try to impress people, try to attract compliments on your own prowess, but love comes when a person is impressed with themselves when they use your product.  This advice helps keep me from valuing&amp;nbsp;cleverness.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A common way to pull people out of technology-focused thinking is to ask &amp;#8220;what problem does this solve?&amp;#8221;  While I appreciate this question more than I used to, it still makes me bristle.  Why must everything be focused on &lt;em&gt;problems&lt;/em&gt;?  Why not opportunities!  Why?  An answer: problems are cases where a person has already articulated a tension and an openness to resolution.  You have a customer in waiting.  But must we confine ourselves to the partially formed conventional wisdom that makes something a &amp;#8220;problem&amp;#8221;?  (One fair answer to this question is: yes.  I remain open to other answers.)  Maybe a more positive alternative to &amp;#8220;what problem does this solve?&amp;#8221; is &amp;#8220;what does this let people do that they couldn&amp;#8217;t do&amp;nbsp;before?&amp;#8221;&lt;/p&gt;
&lt;p&gt;What I&amp;#8217;m certain of is that you should constantly remember the people using your tool will care most about &lt;em&gt;their&lt;/em&gt; interests, goals, and perspective; and will not care much about the interests, goals, or perspective of the tool&amp;nbsp;maker.&lt;/p&gt;
&lt;p&gt;So what should this tool do?  If not technology, what defines it?  A pithy byline might be &lt;em&gt;share better&lt;/em&gt;.  I don&amp;#8217;t like pithy, but maybe a whole bag of&amp;nbsp;pithy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Improving on the &lt;span class="caps"&gt;URL&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Own what you&amp;nbsp;share&lt;/li&gt;
&lt;li&gt;Share content, not&amp;nbsp;pointers&lt;/li&gt;
&lt;li&gt;Share what you see, anything you&amp;nbsp;see&lt;/li&gt;
&lt;li&gt;Every share is a message, make it your message&lt;br&gt; Dammit, why do I feel compelled to noun&amp;nbsp;&amp;#8220;share&amp;#8221;?&lt;/li&gt;
&lt;li&gt;Share the context, the journey, not just the web&amp;nbsp;destination&lt;/li&gt;
&lt;li&gt;Own your perspective, don&amp;#8217;t give it over to site&amp;nbsp;owners&lt;/li&gt;
&lt;li&gt;Know how and when people see what you&amp;nbsp;share&lt;/li&gt;
&lt;li&gt;Build better content, even if the publisher&amp;nbsp;doesn&amp;#8217;t&lt;/li&gt;
&lt;li&gt;Trade in content, not promises for&amp;nbsp;content&lt;/li&gt;
&lt;li&gt;Copy/enhance/share&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No&amp;#8230; quantity doesn&amp;#8217;t equal quantity I suppose.  Another&amp;nbsp;attempt:&lt;/p&gt;
&lt;p&gt;When you share, you are a publisher.  Your medium is the &lt;span class="caps"&gt;IM&lt;/span&gt; text input, or the Facebook status update, or the email composition window. It seems casual, it seems pithy, but that individual publishing is what the web is built on.  I respect everyone as a publisher, every medium as worthy of improvement, and this project will respect your efforts. We will try to make a tool that can make every instance just a little bit better, simple when all you need is simple, polished if you want.  We will defer your decisions because you should decide in context, not make decisions in the order that makes our work easier; we will be transparent to you, your audience, and your source; respect for the reader is part of our brand promise, and that adds to the quality of your shares; we believe content is a message, a relationship between you and your audience, and there is no universally appropriate representation; we believe there is order and structure in information, but only when that information is put to use; we believe our beliefs are always provisional and tomorrow it is our prerogative to rebelieve whatever we want&amp;nbsp;most.&lt;/p&gt;
&lt;p&gt;Who is &lt;em&gt;we&lt;/em&gt;?  Just me.  A pretentiously royal &lt;em&gt;we&lt;/em&gt;.  It can&amp;#8217;t stay that way for long though.  More on that&amp;nbsp;soon&amp;#8230;&lt;/p&gt;
&lt;p&gt;[The next post in this series is &lt;a href="http://www.ianbicking.org/blog/2015/01/product-journal-mvp.html"&gt;To &lt;span class="caps"&gt;MVP&lt;/span&gt; Or Not To &lt;span class="caps"&gt;MVP&lt;/span&gt;&lt;/a&gt;]&lt;/p&gt;</content><category term="mozilla"></category><category term="product-journal"></category></entry></feed>