A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 63KB

5 lat temu
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang=fr>
  4. <!-- Has to be within the first 1024 bytes, hence before the <title>
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset=utf-8>
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name=viewport content="width=device-width,minimum-scale=1,initial-scale=1,shrink-to-fit=no">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>The Firefox Experiments I Would Have Liked To Try (archive) — David Larlet</title>
  13. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  14. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons/apple-touch-icon.png">
  15. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons/favicon-32x32.png">
  16. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons/favicon-16x16.png">
  17. <link rel="manifest" href="/manifest.json">
  18. <link rel="mask-icon" href="/static/david/icons/safari-pinned-tab.svg" color="#5bbad5">
  19. <link rel="shortcut icon" href="/static/david/icons/favicon.ico">
  20. <meta name="apple-mobile-web-app-title" content="David Larlet">
  21. <meta name="application-name" content="David Larlet">
  22. <meta name="msapplication-TileColor" content="#da532c">
  23. <meta name="msapplication-config" content="/static/david/icons/browserconfig.xml">
  24. <meta name="theme-color" content="#f0f0ea">
  25. <!-- That good ol' feed, subscribe :p. -->
  26. <link rel=alternate type="application/atom+xml" title=Feed href="/david/log/">
  27. <meta name="robots" content="noindex, nofollow">
  28. <meta content="origin-when-cross-origin" name="referrer">
  29. <!-- Canonical URL for SEO purposes -->
  30. <link rel="canonical" href="http://www.ianbicking.org/blog/2019/03/firefox-experiments-i-would-have-liked.html">
  31. <style>
  32. /* http://meyerweb.com/eric/tools/css/reset/ */
  33. html, body, div, span,
  34. h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  35. a, abbr, address, big, cite, code,
  36. del, dfn, em, img, ins,
  37. small, strike, strong, tt, var,
  38. dl, dt, dd, ol, ul, li,
  39. fieldset, form, label, legend,
  40. table, caption, tbody, tfoot, thead, tr, th, td,
  41. article, aside, canvas, details, embed,
  42. figure, figcaption, footer, header, hgroup,
  43. menu, nav, output, ruby, section, summary,
  44. time, mark, audio, video {
  45. margin: 0;
  46. padding: 0;
  47. border: 0;
  48. font-size: 100%;
  49. font: inherit;
  50. vertical-align: baseline;
  51. }
  52. /* HTML5 display-role reset for older browsers */
  53. article, aside, details, figcaption, figure,
  54. footer, header, hgroup, menu, nav, section { display: block; }
  55. body { line-height: 1; }
  56. blockquote, q { quotes: none; }
  57. blockquote:before, blockquote:after,
  58. q:before, q:after {
  59. content: '';
  60. content: none;
  61. }
  62. table {
  63. border-collapse: collapse;
  64. border-spacing: 0;
  65. }
  66. /* http://practicaltypography.com/equity.html */
  67. /* https://calendar.perfplanet.com/2016/no-font-face-bulletproof-syntax/ */
  68. /* https://www.filamentgroup.com/lab/js-web-fonts.html */
  69. @font-face {
  70. font-family: 'EquityTextB';
  71. src: url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff2') format('woff2'),
  72. url('/static/david/css/fonts/Equity-Text-B-Regular-webfont.woff') format('woff');
  73. font-weight: 300;
  74. font-style: normal;
  75. font-display: swap;
  76. }
  77. @font-face {
  78. font-family: 'EquityTextB';
  79. src: url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff2') format('woff2'),
  80. url('/static/david/css/fonts/Equity-Text-B-Italic-webfont.woff') format('woff');
  81. font-weight: 300;
  82. font-style: italic;
  83. font-display: swap;
  84. }
  85. @font-face {
  86. font-family: 'EquityTextB';
  87. src: url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff2') format('woff2'),
  88. url('/static/david/css/fonts/Equity-Text-B-Bold-webfont.woff') format('woff');
  89. font-weight: 700;
  90. font-style: normal;
  91. font-display: swap;
  92. }
  93. @font-face {
  94. font-family: 'ConcourseT3';
  95. src: url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff2') format('woff2'),
  96. url('/static/david/css/fonts/concourse_t3_regular-webfont-20190806.woff') format('woff');
  97. font-weight: 300;
  98. font-style: normal;
  99. font-display: swap;
  100. }
  101. /* http://practice.typekit.com/lesson/caring-about-opentype-features/ */
  102. body {
  103. /* http://www.cssfontstack.com/ Palatino 99% Win 86% Mac */
  104. font-family: "EquityTextB", Palatino, serif;
  105. background-color: #f0f0ea;
  106. color: #07486c;
  107. font-kerning: normal;
  108. -moz-osx-font-smoothing: grayscale;
  109. -webkit-font-smoothing: subpixel-antialiased;
  110. text-rendering: optimizeLegibility;
  111. font-variant-ligatures: common-ligatures contextual;
  112. font-feature-settings: "kern", "liga", "clig", "calt";
  113. }
  114. pre, code, kbd, samp, var, tt {
  115. font-family: 'TriplicateT4c', monospace;
  116. }
  117. em {
  118. font-style: italic;
  119. color: #323a45;
  120. }
  121. strong {
  122. font-weight: bold;
  123. color: black;
  124. }
  125. nav {
  126. background-color: #323a45;
  127. color: #f0f0ea;
  128. display: flex;
  129. justify-content: space-around;
  130. padding: 1rem .5rem;
  131. }
  132. nav:last-child {
  133. border-bottom: 1vh solid #2d7474;
  134. }
  135. nav a {
  136. color: #f0f0ea;
  137. }
  138. nav abbr {
  139. border-bottom: 1px dotted white;
  140. }
  141. h1 {
  142. border-top: 1vh solid #2d7474;
  143. border-bottom: .2vh dotted #2d7474;
  144. background-color: #e3e1e1;
  145. color: #323a45;
  146. text-align: center;
  147. padding: 5rem 0 4rem 0;
  148. width: 100%;
  149. font-family: 'ConcourseT3';
  150. display: flex;
  151. flex-direction: column;
  152. }
  153. h1.single {
  154. padding-bottom: 10rem;
  155. }
  156. h1 span {
  157. position: absolute;
  158. top: 1vh;
  159. left: 20%;
  160. line-height: 0;
  161. }
  162. h1 span a {
  163. line-height: 1.7;
  164. padding: 1rem 1.2rem .6rem 1.2rem;
  165. border-radius: 0 0 6% 6%;
  166. background: #2d7474;
  167. font-size: 1.3rem;
  168. color: white;
  169. text-decoration: none;
  170. }
  171. h2 {
  172. margin: 4rem 0 1rem;
  173. border-top: .2vh solid #2d7474;
  174. padding-top: 1vh;
  175. }
  176. h3 {
  177. text-align: center;
  178. margin: 3rem 0 .75em;
  179. }
  180. hr {
  181. height: .4rem;
  182. width: .4rem;
  183. border-radius: .4rem;
  184. background: #07486c;
  185. margin: 2.5rem auto;
  186. }
  187. time {
  188. display: bloc;
  189. margin-left: 0 !important;
  190. }
  191. ul, ol {
  192. margin: 2rem;
  193. }
  194. ul {
  195. list-style-type: square;
  196. }
  197. a {
  198. text-decoration-skip-ink: auto;
  199. text-decoration-thickness: 0.05em;
  200. text-underline-offset: 0.09em;
  201. }
  202. article {
  203. max-width: 50rem;
  204. display: flex;
  205. flex-direction: column;
  206. margin: 2rem auto;
  207. }
  208. article.single {
  209. border-top: .2vh dotted #2d7474;
  210. margin: -6rem auto 1rem auto;
  211. background: #f0f0ea;
  212. padding: 2rem;
  213. }
  214. article p:last-child {
  215. margin-bottom: 1rem;
  216. }
  217. p {
  218. padding: 0 .5rem;
  219. margin-left: 3rem;
  220. }
  221. p + p,
  222. figure + p {
  223. margin-top: 2rem;
  224. }
  225. blockquote {
  226. background-color: #e3e1e1;
  227. border-left: .5vw solid #2d7474;
  228. display: flex;
  229. flex-direction: column;
  230. align-items: center;
  231. padding: 1rem;
  232. margin: 1.5rem;
  233. }
  234. blockquote cite {
  235. font-style: italic;
  236. }
  237. blockquote p {
  238. margin-left: 0;
  239. }
  240. figure {
  241. border-top: .2vh solid #2d7474;
  242. background-color: #e3e1e1;
  243. text-align: center;
  244. padding: 1.5rem 0;
  245. margin: 1rem 0 0;
  246. font-size: 1.5rem;
  247. width: 100%;
  248. }
  249. figure img {
  250. max-width: 250px;
  251. max-height: 250px;
  252. border: .5vw solid #323a45;
  253. padding: 1px;
  254. }
  255. figcaption {
  256. padding: 1rem;
  257. line-height: 1.4;
  258. }
  259. aside {
  260. display: flex;
  261. flex-direction: column;
  262. background-color: #e3e1e1;
  263. padding: 1rem 0;
  264. border-bottom: .2vh solid #07486c;
  265. }
  266. aside p {
  267. max-width: 50rem;
  268. margin: 0 auto;
  269. }
  270. /* https://fvsch.com/code/css-locks/ */
  271. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  272. font-size: 1rem;
  273. line-height: calc( 1.5em + 0.2 * 1rem );
  274. }
  275. h1 {
  276. font-size: 1.9rem;
  277. line-height: calc( 1.2em + 0.2 * 1rem );
  278. }
  279. h2 {
  280. font-size: 1.6rem;
  281. line-height: calc( 1.3em + 0.2 * 1rem );
  282. }
  283. h3 {
  284. font-size: 1.35rem;
  285. line-height: calc( 1.4em + 0.2 * 1rem );
  286. }
  287. @media (min-width: 20em) {
  288. /* The (100vw - 20rem) / (50 - 20) part
  289. resolves to 0-1rem, depending on the
  290. viewport width (between 20em and 50em). */
  291. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  292. font-size: calc( 1rem + .6 * (100vw - 20rem) / (50 - 20) );
  293. line-height: calc( 1.5em + 0.2 * (100vw - 50rem) / (20 - 50) );
  294. margin-left: 0;
  295. }
  296. h1 {
  297. font-size: calc( 1.9rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  298. line-height: calc( 1.2em + 0.2 * (100vw - 50rem) / (20 - 50) );
  299. }
  300. h2 {
  301. font-size: calc( 1.5rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  302. line-height: calc( 1.3em + 0.2 * (100vw - 50rem) / (20 - 50) );
  303. }
  304. h3 {
  305. font-size: calc( 1.35rem + 1.5 * (100vw - 20rem) / (50 - 20) );
  306. line-height: calc( 1.4em + 0.2 * (100vw - 50rem) / (20 - 50) );
  307. }
  308. }
  309. @media (min-width: 50em) {
  310. /* The right part of the addition *must* be a
  311. rem value. In this example we *could* change
  312. the whole declaration to font-size:2.5rem,
  313. but if our baseline value was not expressed
  314. in rem we would have to use calc. */
  315. p, li, pre, code, kbd, samp, var, tt, time, details, figcaption {
  316. font-size: calc( 1rem + .6 * 1rem );
  317. line-height: 1.5em;
  318. }
  319. p, li, pre, details {
  320. margin-left: 3rem;
  321. }
  322. h1 {
  323. font-size: calc( 1.9rem + 1.5 * 1rem );
  324. line-height: 1.2em;
  325. }
  326. h2 {
  327. font-size: calc( 1.5rem + 1.5 * 1rem );
  328. line-height: 1.3em;
  329. }
  330. h3 {
  331. font-size: calc( 1.35rem + 1.5 * 1rem );
  332. line-height: 1.4em;
  333. }
  334. figure img {
  335. max-width: 500px;
  336. max-height: 500px;
  337. }
  338. }
  339. figure.unsquared {
  340. margin-bottom: 1.5rem;
  341. }
  342. figure.unsquared img {
  343. height: inherit;
  344. }
  345. @media print {
  346. body { font-size: 100%; }
  347. a:after { content: " (" attr(href) ")"; }
  348. a, a:link, a:visited, a:after {
  349. text-decoration: underline;
  350. text-shadow: none !important;
  351. background-image: none !important;
  352. background: white;
  353. color: black;
  354. }
  355. abbr[title] { border-bottom: 0; }
  356. abbr[title]:after { content: " (" attr(title) ")"; }
  357. img { page-break-inside: avoid; }
  358. @page { margin: 2cm .5cm; }
  359. h1, h2, h3 { page-break-after: avoid; }
  360. p3 { orphans: 3; widows: 3; }
  361. img {
  362. max-width: 250px !important;
  363. max-height: 250px !important;
  364. }
  365. nav, aside { display: none; }
  366. }
  367. ul.with_columns {
  368. column-count: 1;
  369. }
  370. @media (min-width: 20em) {
  371. ul.with_columns {
  372. column-count: 2;
  373. }
  374. }
  375. @media (min-width: 50em) {
  376. ul.with_columns {
  377. column-count: 3;
  378. }
  379. }
  380. ul.with_two_columns {
  381. column-count: 1;
  382. }
  383. @media (min-width: 20em) {
  384. ul.with_two_columns {
  385. column-count: 1;
  386. }
  387. }
  388. @media (min-width: 50em) {
  389. ul.with_two_columns {
  390. column-count: 2;
  391. }
  392. }
  393. .gallery {
  394. display: flex;
  395. flex-wrap: wrap;
  396. justify-content: space-around;
  397. }
  398. .gallery figure img {
  399. margin-left: 1rem;
  400. margin-right: 1rem;
  401. }
  402. .gallery figure figcaption {
  403. font-family: 'ConcourseT3'
  404. }
  405. footer {
  406. font-family: 'ConcourseT3';
  407. display: flex;
  408. flex-direction: column;
  409. border-top: 3px solid white;
  410. padding: 4rem 0;
  411. background-color: #07486c;
  412. color: white;
  413. }
  414. footer > * {
  415. max-width: 50rem;
  416. margin: 0 auto;
  417. }
  418. footer a {
  419. color: #f1c40f;
  420. }
  421. footer .avatar {
  422. width: 200px;
  423. height: 200px;
  424. border-radius: 50%;
  425. float: left;
  426. -webkit-shape-outside: circle();
  427. shape-outside: circle();
  428. margin-right: 2rem;
  429. padding: 2px 5px 5px 2px;
  430. background: white;
  431. border-left: 1px solid #f1c40f;
  432. border-top: 1px solid #f1c40f;
  433. border-right: 5px solid #f1c40f;
  434. border-bottom: 5px solid #f1c40f;
  435. }
  436. </style>
  437. <h1>
  438. <span><a id="jumper" href="#jumpto" title="Un peu perdu ?">?</a></span>
  439. The Firefox Experiments I Would Have Liked To Try (archive)
  440. <time>Pour la pérennité des contenus liés. Non-indexé, retrait sur simple email.</time>
  441. </h1>
  442. <section>
  443. <article>
  444. <h3><a href="http://www.ianbicking.org/blog/2019/03/firefox-experiments-i-would-have-liked.html">Source originale du contenu</a></h3>
  445. <p>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’t personally want to build, but I thought they were interesting ideas. I didn’t get very far through this list at all, and now that <a href="https://medium.com/firefox-test-pilot/adios-amigo-51bec2a00072">Test Pilot is being retired</a> I am unlikely to get to them in the future.</p>
  446. <p>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 product.</p>
  447. <p>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 mind.</p>
  448. <p>Test Pilot’s purpose was to find things worth shipping in the browser, which means some of these experiments aren’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 benefit.</p>
  449. <hr/>
  450. <p><img alt="mockup of Sticky Reader Mode" src="/media/mockups/sticky-readable-start.gif"/></p>
  451. <p>Give <a href="https://support.mozilla.org/en-US/kb/firefox-reader-view-clutter-free-web-pages">Reader Mode</a> 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’ll automatically convert to reader mode. (The nytimes.com homepage would not be a candidate for that mode.)</p>
  452. <p>I made an experiment in <a href="https://github.com/ianb/sticky-reader-mode"><code>sticky-reader-mode</code></a>, and I think it works really nicely. It changes the browsing experience significantly, and most importantly it doesn’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’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 required.</p>
  453. <p>There are a <a href="https://github.com/ianb/sticky-reader-mode/issues/5">bunch of similar add-ons</a>. 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. <strong>But</strong> it does this by using APIs that are not public to normal WebExtensions. As a result it can’t be shipped outside Test Pilot, and can’t go in addons.mozilla.org. So… just trust me, it’s great.</p>
  454. <p>Recently I’ve come upon <a href="https://brave.com/blog/speed-reader/">Brave Speed Reader</a> which is similar, but without per-site opt-in, and using machine learning to identify articles.</p>
  455. <p><img alt="mockup of a Cloud Browser" src="/media/mockups/cloud-browser-start.gif"/></p>
  456. <p>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 content.</p>
  457. <p>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 page.</p>
  458. <p>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 issues.</p>
  459. <p>Prior art: Opera Mini does some of this. Puffin is specifically cloud rendering for mobile. Light Point does the same for security reasons.</p>
  460. <p>I later encountered <a href="https://www.brow.sh">brow.sh</a> which is another interesting take on this (specifically with <a href="https://html.brow.sh">html.brow.sh</a>).</p>
  461. <p>This is a very big task, but I still believe there’s tremendous potential in it. Most of my concepts are not mobile-based, in part because I don’t like mobile, I don’t like myself when using a mobile device, and it’s not something I want to put my energy into. But I still like this idea.</p>
  462. <p><img alt="mockup of Modal Page Actions" src="/media/mockups/modal-page-actions-start.gif"/></p>
  463. <p>This was tangentially inspired by <a href="https://help.vivaldi.com/article/image-properties/">Vivaldi’s Image Properties</a>, not because of the interface, but thinking about how to fit high-information inspection tools into the browser.</p>
  464. <p>The idea: instead of context menus, <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/user_interface/Page_actions">page actions</a>, or other interaction points that are part of the “chrome”, 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 Info).</p>
  465. <p>The interface would be an overlay onto the page, similar to what happens when you start Screenshots:</p>
  466. <p><img alt="Screenshots interface" src="/media/mockups/screenshot-interface-example-small.png"/></p>
  467. <p>Everything that is now in the Page Action menu (the <code>...</code> in the <span class="caps">URL</span> 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 <span class="caps">UI</span> for managing the resulting bookmark, and so on.</p>
  468. <p>There was some pushback because of the <a href="https://textslashplain.com/2017/01/14/the-line-of-death/">line of death</a> – 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’s something users <em>could</em> use to form trust, but I don’t believe they <em>do</em> use it (further user research required).</p>
  469. <p>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’s not unreasonable to expect someone to finish what they start.</p>
  470. <p><img alt="mockup of Find + 1" src="/media/mockups/find-plus-1-start.gif"/></p>
  471. <p>We have find-in-page but what about find-in-anything-linked-from-this-page?</p>
  472. <p>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 found.</p>
  473. <p>I started experimenting in <a href="https://github.com/ianb/find-plus-one"><code>find-plus-one</code></a> and encountered some challenges: hidden tabs aren’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’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’ve used <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP"><span class="caps">CSP</span></a> injection). The Copy Keeper concept did come about while I experimented with this.</p>
  474. <p>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 results.</p>
  475. <p><img alt="mockup of Your Front Page" src="/media/mockups/your-front-page-start.gif"/></p>
  476. <p>Create a front page of news from the sites you already visit. Like an <span class="caps">RSS</span> reader, but prepopulated with your history. This creates an immediate well-populated experience.</p>
  477. <p>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 providers.</p>
  478. <p>I got the feedback: why not just use <span class="caps">RSS</span>? Good question: I thought <span class="caps">RSS</span> was kind of passé, but I hadn’t looked for myself. I went on to do some analysis of <span class="caps">RSS</span>, and found it available for almost all news sites. The <a href="https://developer.mozilla.org/en-US/docs/Archive/RSS/Getting_Started/Syndicating#Adding_the_.3Clink.3E">autodetection</a> (<code>&lt;link rel=alternate&gt;</code>) is <em>not</em> as widely available, and it requires manual searching to find many feeds. Still <span class="caps">RSS</span> is a good way to get an up-to-date list of articles and their titles. Article content isn’t well represented and other article metadata is inaccurate or malformed (e.g., there are no useful tags). So using <span class="caps">RSS</span> would be very reasonable discovery mechanism, but an “<span class="caps">RSS</span> reader” doesn’t seem like a good direction on the current web.</p>
  479. <p>This is bringing back old functionality from Page Shot, a project of mine which morphed into <a href="https://screenshots.firefox.com">Firefox Screenshots</a>: save full <span class="caps">DOM</span> copies of pages. What used to be fairly novel is now well represented by several projects (e.g., <a href="https://blog.webmemex.org/">WebMemex</a> or <a href="https://worldbrain.io/">World Brain Memex</a>).</p>
  480. <p>Unfortunately I have never been able to really make this kind of tool part of <em>my own</em> day-to-day behavior, and I’ve become skeptical it can work for a general populace. But maybe there’s a way to package up this functionality that is more accessible, or happens more implicitly. I <a href="https://github.com/ianb/pagearchive">forked a version of Page Shot as pagearchive</a> a while ago, with this in mind, but I haven’t (and likely won’t) come back to it.</p>
  481. <p>This isn’t really a product idea, but instead an approach to developing products.</p>
  482. <p>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’s not so creepy.</p>
  483. <p>But it’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 tabs.</p>
  484. <p>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’s going to find interesting things.</p>
  485. <p>I spent quite a bit of effort on this, and produced <a href="https://github.com/ianb/personal-history-archive">`personal-history-archive</a>. It’s something I still want to come back to. It’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 database.</p>
  486. <p>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’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’m not the only one who has done this.</p>
  487. <p><img alt="mockup of Navigational Breadcrumbs" src="/media/mockups/navigational-breadcrumbs-start.gif"/></p>
  488. <p>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 link?</p>
  489. <p>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’m not sure.</p>
  490. <p>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’t match the document title), and a link to comments on the page. If I follow a link from Twitter, I’ll be able to see the Tweet I came from.</p>
  491. <p>This could be interesting paired with link preview (like a tentative forward). Maybe the mobile browser <a href="https://linkbubble.com/">Linkbubbles</a> (now integrated into Brave) has some ideas to offer.</p>
  492. <p>Technically this will use some of the techniques from Personal History Archive, which tracks link sources.</p>
  493. <p>This is based on the train of thought I wrote down <a href="https://news.ycombinator.com/item?id=17702206">in an <span class="caps">HN</span> comment</a> – itself a response to <a href="https://www.reinterpretcast.com/open-hypermedia">Freeing the Web from the Browser</a>.</p>
  494. <p>I want to try this still, and have started a repo <a href="https://github.com/ianb/crossnav"><code>crossnav</code></a> but haven’t put anything there yet. I think even some naive approaches could work, just trying to detect the <em>category</em> of link and the <em>related</em> links (e.g., on Reddit the category is other submissions, and the related links are things like comments).</p>
  495. <p><img alt="mockup of Copy Keeper" src="/media/mockups/copy-keeper-start.gif"/></p>
  496. <p>A notebook/logbook that is filled in every time you copy from a web page. When you copy it records (locally):</p>
  497. <ul>
  498. <li>Text of selection</li>
  499. <li><span class="caps">HTML</span> of selection</li>
  500. <li>Screenshot of the block element around the selection</li>
  501. <li>Text around selection</li>
  502. <li>Page <span class="caps">URL</span> and nearest anchor/id</li>
  503. <li>Page title</li>
  504. <li>Datetime</li>
  505. </ul>
  506. <p>This overloads “copy” to mean “remember”.</p>
  507. <p>Clips would be searchable, and could be moved back to the clipboard in different forms (text, <span class="caps">HTML</span>, image, bibliographical reference, source <span class="caps">URL</span>). 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 (Library-style).</p>
  508. <p>I created a prototype in <a href="https://github.com/ianb/copy-keeper"><code>copy-keeper</code></a>. I thought it was interesting and usable, though whether it would actually get any use in practice I don’t know. It’s one of those tools that seems handy but requires effort, and as a result doesn’t get used.</p>
  509. <p><img alt="mockup of Change Scout" src="/media/mockups/change-scout-start.gif"/></p>
  510. <p>(Wherein I both steal a <a href="https://www.businessinsider.com/mozilla-scout-voice-controlled-browser-2018-6">name from another team</a>, and turn it into a category…)</p>
  511. <p>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 when.</p>
  512. <p>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 algorithms).</p>
  513. <h2/>
  514. <p><img alt="Tab Switcher mockup" src="/media/mockups/tab-switcher-start.gif"/></p>
  515. <p>We take the exact <span class="caps">UI</span> of the <a href="https://github.com/mozilla/side-view">Side View</a> popup, but make it a tab switcher. “Recent Tabs” are the most recently focused tabs (weighted somewhat by how long you were on the tab), and then there’s the complete scrollable list. Clicking on an item simply focuses that tab. You can close tabs without focusing them.</p>
  516. <p>I made a prototype in <a href="https://github.com/ianb/tab-switchr"><code>tab-switchr</code></a>. 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’s work in Firefox to improve this, unrelated to anything I’ve done. It reminds me a bit of various <a href="https://addons.mozilla.org/en-US/firefox/addon/tree-style-tab/">Tree-Style Tabs</a>, 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 benefits.</p>
  517. <p>I should probably clean this up a little and publish it.</p>
  518. <p>Create your own <span class="caps">RSS</span> feed.</p>
  519. <ul>
  520. <li>When you are on a page with some audio source, you can add the audio to your personal feed</li>
  521. <li>When on an article, you can generate an audio version that will be added to the feed</li>
  522. <li>You get an <span class="caps">RSS</span> feed with a random token to make it private (I don’t think podcast apps handle authentication well, but this requires research)</li>
  523. <li>Maybe you can just send/text the link to add it to your preferred podcast app</li>
  524. <li>If apps don’t accept <span class="caps">RSS</span> links very well, maybe something more complicated would be required. An app that just installs an <span class="caps">RSS</span> feed? We want to avoid the feed accidentally ending up in podcast directories.</li>
  525. </ul>
  526. <p>There’s a lot of low-rated bookmark managers in addons.mozilla.org and the Chrome Extension store. Let’s make our own low-rated bookmark manager!</p>
  527. <p>But seriously, this would anticipate updates to the Library and built-in bookmark manager, which are deficient.</p>
  528. <p>Some resources/ideas:
  529. <em> <a href="https://news.ycombinator.com/item?id=17072803">Comment with a few gripes</a>
  530. </em> <a href="https://chrome.google.com/webstore/detail/bookmark-manager/gmlllbghnfkpflemihljekbapjopfjik?hl=en">Google’s bookmark manager</a>
  531. <em> <a href="https://addons.mozilla.org/en-US/firefox/addon/bookmarks-manager-and-viewer/?src=search">Bookmark section on addons.mozilla.org</a>
  532. </em> <a href="https://addons.mozilla.org/en-US/firefox/addon/bookmarks-organizer/?src=search">Bookmark organizers on addons.mozilla.org</a>
  533. * <a href="https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/bookmarks">Relevant WebExtension APIs</a></p>
  534. <p><img alt="mockup of the Extended Library" src="/media/mockups/extended-library-start.gif"/></p>
  535. <p>The “Library” in Firefox is the combination history and bookmark browser you get if you use “Show all bookmarks” or “Show all history”.</p>
  536. <p>In this idea we present the user with a record of their <strong>assets</strong>, wherever they are.</p>
  537. <p>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’ve edited, screenshots you’ve taken, tickets you’ve opened, etc. We’d be trying hard to find long-lived documents in your history, instead of transitional navigation, articles, things you’ve gotten to from public indexes, etc.</p>
  538. <p>Automatically determining what should be tagged as a “library item” 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’s easy to forget what service hosts the thing you are thinking about.</p>
  539. <p><img alt="mockup of Text Mobile Screenshot" src="/media/mockups/text-mobile-screenshot-start.gif"/></p>
  540. <p>This tool will render the tab in a mobile factor (using the devtools <a href="https://developer.mozilla.org/en-US/docs/Tools/Responsive_Design_Mode">responsive design mode</a>), take a full-page screenshot, and text the image and <span class="caps">URL</span> to a given number. Probably it would only support texting to yourself.</p>
  541. <p>I’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 <span class="caps">UI</span> flows and operational support.</p>
  542. <p>Emails the Reader Mode version of a site to yourself. In our research, people love to store things in Email, so why not?</p>
  543. <p>Though it lacks the simplicity of this concept, <a href="https://github.com/mozilla/email-tabs">Email Tabs</a> contains this basic functionality. <a href="https://www.emailthis.me/">Email This</a> does almost exactly this.</p>
  544. <p>An extension that finds and syncs your history between browsers (particularly between Chrome and Firefox).</p>
  545. <p>This would use the <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/history">history WebExtension APIs</a>. Maybe we could create a <a href="https://en.wikipedia.org/wiki/Firefox_Sync">Firefox Sync</a> 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 easier.</p>
  546. <p>Obviously there’s lots of work to synchronize this data between Firefox properties, and knowing the work involved this isn’t easy and often involves close work with the underlying platform. Without full access to the platform (like on Chrome) we’ll have to find ways to simplify the problem in order to make it feasible.</p>
  547. <p>Everyone (with an <a href="https://www.mozilla.org/en-US/firefox/accounts/">FxA account</a>) gets there own homepage on the web. It’s like Geocities! Or maybe closer to github.io.</p>
  548. <p>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’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 web.</p>
  549. <p><a href="http://www.ianbicking.org/blog/2019/01/we-need-open-hosting-platforms.html">Here’s a general argument</a> why I think this would be a useful thing for us to do. <a href="https://blog.lmorchard.com/2014/10/09/separating-publishing-from-hosting-on-the-web/">And another from Les Orchard</a>.</p>
  550. <p>This is a proposal for user research:</p>
  551. <p>Electron apps are being shipped for many services, including services that don’t require any special system integration. E.g., Slack doesn’t require anything that a web browser can’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 app.</p>
  552. <p>The user research would focus on cases where the Electron app doesn’t have any/many special permissions. What gives the app value over the web page?</p>
  553. <p>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 app.</p>
  554. <p>Per my previous item: why do I have an <a href="https://www.irccloud.com/">IRCCloud</a> app? Why do people use Slack apps? Maybe it’s just because they want to be able to switch into and out of those apps quickly.</p>
  555. <p>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 it).</p>
  556. <p>To make it a little more fancy, I thought we might also be able to do a second related “preview” shortcut. This would let you peek into the window. I’m not sure what “peeking” means. Maybe we just show a popup with a screenshot of that other window.</p>
  557. <p>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 <em>to</em> the first tab with ⌘1, but you can’t switch back.</p>
  558. <p>This is one suggested solution to <em>Whatever Electron does for people</em>.</p>
  559. <p>I started some work in <a href="https://github.com/ianb/quick-switch-extension"><code>quick-switch-extension</code></a>, but keyboard shortcuts were a bit wonky, and I couldn’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 here).</p>
  560. <p>Just Save saves a page. It’s like a bookmark. Or a remembering. Or an archive. Or all of those all at once.</p>
  561. <p>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 page.</p>
  562. <p>We save:
  563. 1. Link
  564. 2. Title
  565. 3. Standard metadata
  566. 4. Screenshot
  567. 5. Frozen version of page
  568. 6. Scroll position
  569. 7. The tab history
  570. 8. Remember the other open tabs, so if some of them are saved we offer later relations between them
  571. 9. Time the page was saved
  572. 10. Query terms that led to the page</p>
  573. <p>It’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 choices.</p>
  574. <p>And of course there’s a way to find and manage your saved pages. This idea needs more exploration of <em>why</em> you would return to a page or piece of information, and thus what we’d want to expose and surface from your history. We’ve <a href="https://blog.mozilla.org/ux/2015/02/save-share-revisit/">done research</a>, but it’s really just a start.</p>
  575. <p>We have several <a href="https://dxr.mozilla.org/mozilla-central/source/browser/components/search/searchplugins">open search providers</a>. How many exist out there? How many could we find in history?</p>
  576. <p>In theory <a href="https://developer.mozilla.org/en-US/docs/Web/OpenSearch">Open Search is an <span class="caps">API</span></a> where a user could do personalized search across many properties, though I’m not sure if any sufficient number of sites has enabled it.</p>
  577. <p>It’s <a href="https://addons.mozilla.org/en-US/firefox/addon/notes-by-firefox/">Notes</a>, but with <a href="https://api.slack.com/slash-commands">slash commands</a>.</p>
  578. <p>I other words it’s a document, but if you complete a line that begins with a <code>/</code> then it will try to execute that command, appending or overwriting from that point.</p>
  579. <p>So for instance <code>/timestamp</code> just replaces itself with a timestamp.</p>
  580. <p>Maybe <code>/page</code> inserts the currently active tab. <code>/search foo</code> puts search results into the document, but as editable (and followable) links. <code>/page save</code> freezes the page as one big data link, and inserts that link into the note.</p>
  581. <p>It’s a little like Slack, but in document form, and with the browser as the context instead of a messaging platform. It’s a little like a notebook programming interface, but less structured and more document-like.</p>
  582. <p>The ability to edit the <em>output</em> of commands is particularly interesting to me, and represents the kind of ad hoc information organizing that we all do regularly.</p>
  583. <p>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’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’s worth doing it from scratch (with <a href="http://prosemirror.net/">ProseMirror</a> or <a href="https://github.com/ianstormtaylor/slate">Slate</a>?)</p>
  584. <p>After I tried to mock this up, I realized that the underlying model is much too unclear in my mind. What’s this for? <em>When</em> is it for? What would a list of commands look like?</p>
  585. <p>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’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’s a lot of pieces to fit together here, both common nouns and verbs, all of which interact with the browser session itself.</p>
  586. <p>Automation and scripting for your browser: make demonstrations for your browser, give it a name, and you have a repeatable script.</p>
  587. <p>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 user.</p>
  588. <p>Scripts could be as simple as “open a new tab pointing to this page every weekday at 9am”, or could involve clipping information, or just doing a navigational pattern before presenting the page to a user.</p>
  589. <p>There’s a huge amount of previous work in this area. I think the challenge here is to create something that <em>doesn’t</em> look like a programming language displayed in a table.</p>
  590. <p>Sidekick is a sidebar interface to anything, or everything, contextually. Some things it might display:</p>
  591. <ul>
  592. <li>Show you the state of your clipboard</li>
  593. <li>Show you how you got to the current tab (similar to <a href="#navigational-breadcrumbs">Navigational Breadcrumbs</a>)</li>
  594. <li>Show you other items from the search query that kicked off the current tab</li>
  595. <li>Give quick navigation to nearby pages, given the referring page (e.g., the next link, or next set of links)</li>
  596. <li>Show you buttons to activate other tabs you are likely to switch to from the current tab</li>
  597. <li>Show shopping recommendations or other content-aware widgets</li>
  598. <li>Let you save little tidbits (text, links, etc), like an extended clipboard or notepad</li>
  599. <li>Show notifications you’ve recently received</li>
  600. <li>Peek into other tabs, or load them inline somewhat like <a href="https://addons.mozilla.org/en-US/firefox/addon/side-view/">Side View</a></li>
  601. <li>Checklists and todos</li>
  602. <li>Copy a bunch of links into the sidebar, then treat them like a todo/queue</li>
  603. </ul>
  604. <p>Possibly it could be treated like an extensible widget holder.</p>
  605. <p>From another perspective: this is like a continuous contextual feature recommender. I.e., it would try to answer the question: what’s the feature you could use right now?</p>
  606. <p>Generally in order to commit something to long-term memory you must revisit information later, ideally long enough that it’s a struggle.</p>
  607. <p>Is anything we see in a browser worth committing to long-term memory? Sometimes it feels like nothing is worth remembering, but that’s a kind of nihilism based on the shitty aspects of typical web browsing behavior.</p>
  608. <p>The interface would require some positive assertion: I want to know this. Probably you’d want to highlight the thing you’d “know”. Then, later, we’d want to come up with some challenge. We don’t need a “real” 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 not).</p>
  609. <p>Reader mode is a bit spartan. Maybe it could be a bit nicer:</p>
  610. <ul>
  611. <li>Pick up some styles or backgrounds from the hosting site</li>
  612. <li>Display images or other media differently or more prominently</li>
  613. <li>Add back some markup or layout that Readability erases</li>
  614. <li>Apply to some other kinds of sites that aren’t articles (e.g., a video site)</li>
  615. <li>A multicolumn version like <a href="https://anoved.github.io/mcreadability/">McReadability</a></li>
  616. </ul>
  617. <p>Inspired by <a href="http://www.fullhn.com/">Full Hacker News</a> (<a href="https://news.ycombinator.com/item?id=18132281">comments</a>): take a bunch of links (typically articles) and concatenate their content into one page.</p>
  618. <p>Implicitly this requires Reader Mode parsing of the pages, though that is relatively cheap for “normal” articles. Acquiring a list of pages is somewhat less clear. Getting a list of pages is a kind of news/<span class="caps">RSS</span> question. Taking a page <em>like</em> Hacker News and figuring out what the “real” links are is another approach that may be interesting. Lists of related links are everywhere, yet hard to formally define.</p>
  619. <p>This would work very nicely with complementary text summarization.</p>
  620. <p>Open question: is this actually an interesting or useful way to consume information?</p>
  621. <p>There’s an underlying concept here worth explaining:</p>
  622. <p>Feature develop receives a lot of skepticism. And it’s reasonable: there’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’t interested in our theories, and really not that many people are interested in browsers. Familiar functionality – the back button, bookmarks, the <span class="caps">URL</span> bar, etc. – are what they expect, what they came for, and what they will gravitate to. Everything I’ve written so far in this list are things <em>people won’t actually use</em>.</p>
  623. <p>A browser is particularly problematic because it’s so universal. It’s for sites and apps and articles. It’s for the young and the elderly, the experienced and not. It’s used for serious things, it’s used for concentration, and it’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 <em>them</em>, not some other person? People are right to be skeptical of the new!</p>
  624. <p>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 videos.</p>
  625. <p><em>Which</em> 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 set.</p>
  626. <p>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 <a href="https://www.mozilla.org/en-US/firefox/developer/">Developer Edition</a> and it’s been reasonably successful.</p>
  627. <p>This offers an opportunity for both Mozilla and Firefox users to agree on <strong>purpose</strong>. What is Firefox for? Everything! Is this feature meant for <em>you</em>? Unlikely! In a purpose-built browser both sides can agree what it’s trying to accomplish.</p>
  628. <p>This idea often gets poo-pooed for how much work it is, but I think it’s simpler than it seems. Here’s what a “new browser” means:</p>
  629. <ul>
  630. <li>Something you can find and download from its own page or site</li>
  631. <li>It’s Firefox, but uses its own <a href="https://support.mozilla.org/en-US/kb/profiles-where-firefox-stores-user-data">profile</a>, keeping history/etc separate from other browser instances (including Firefox)</li>
  632. <li>It has its own name and icon, and probably a theme to make it obvious what browser you are in</li>
  633. <li>It comes with some browser extensions and prefs changed, making it more appropriate for the proposed use case</li>
  634. </ul>
  635. <p>The approach is heavy on marketing and build tools, and light on actual browser engineering.</p>
  636. <p>I also have gotten frequent feedback that <a href="https://addons.mozilla.org/en-US/firefox/addon/multi-account-containers/">Multi-Account Containers</a> 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 bug.</p>
  637. <p>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 browser.</p>
  638. <p>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 ideas:</p>
  639. <p>For students, studying.</p>
  640. <ul>
  641. <li>Integrate note-taking tools</li>
  642. <li>Create project and class-based organizational tools, helping to organize tabs, bookmarks, and notes</li>
  643. <li>Tools to document and organize deadlines</li>
  644. <li>Citation generators</li>
  645. </ul>
  646. <p>I don’t know <em>what</em> to do with online lectures and video, but it feels like there’s some meaningful improvements to be done in that space. Video-position-aware notetaking tools?</p>
  647. <p>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’t built around multitasking, and using an iPad means stepping away from regular computing.</p>
  648. <p>To watch videos. This requires very few features, but benefits from just being a separate profile, history, and icon.</p>
  649. <p>There’s a small number of features that might be useful:</p>
  650. <ul>
  651. <li>Cross-service search (like <a href="http://www.canistream.it/">Can I Stream.it</a> or <a href="https://www.justwatch.com/">JustWatch</a>)</li>
  652. <li>Search defaults to video search</li>
  653. <li>Cross-service queue</li>
  654. <li>Quick service-based navigation</li>
  655. </ul>
  656. <p>I realize it’s a lot like Roku in an app.</p>
  657. <p>This is really just about security.</p>
  658. <p>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 <em>anything at all breaking</em>. This is very frustrating for us.</p>
  659. <p>At the same time, I kind of get it. I’m dorking around on the web and I click through to some dumb site, and I get a big ol’ warning or a blank page or some other weirdness. I didn’t even care about the page or its security, and here my browser is trying to make me care.</p>
  660. <p>That’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 care.</p>
  661. <p>There’s a second kind of security implied here as well: security from snooping eyes and on shared computers. <a href="https://support.mozilla.org/en-US/kb/use-master-password-protect-stored-logins">Firefox Master Password</a> is a useful feature here. Generally there’s an opportunity for secure data at rest.</p>
  662. <p>This is also a vehicle for education in computer security, with an audience that we know is interested.</p>
  663. <p>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 compact.</p>
  664. <ul>
  665. <li>Cache content that isn’t really supposed to be cached</li>
  666. <li>Don’t load some kinds of content</li>
  667. <li>Block fonts and other seemingly-unimportant content</li>
  668. <li>Monitoring tools to see where bandwidth usage is going</li>
  669. </ul>
  670. <p>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’t have to do anything if kids just happen to use your tool.</p>
  671. <p>There is an industry of tools in this area that I don’t fully understand, and I’d want to research before thinking about a feature list. But it seems like it comes down to three things:</p>
  672. <ul>
  673. <li>Blocking problematic content</li>
  674. <li>Encouraging positive content</li>
  675. <li>Monitoring tools for parents</li>
  676. </ul>
  677. <p>There’s something very uninspiring about that list, it feels like it’s long on negativity and short on positive engagement. Coming up with an answer to that is not a simple task.</p>
  678. <p>Inspired by a bunch of things:</p>
  679. <p>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 pitches:</p>
  680. <ul>
  681. <li>Read without distraction: Read articles like they are articles, not interactive (and manipulative) experiences.</li>
  682. <li>Stay focused on one thing at a time: Instead of a giant list of tabs and alerts telling you what we aren’t doing, automatically focus on the one thing you are doing right now.</li>
  683. <li>Control your notifications: Instead of letting any site poke at you for any reason, notifications are kept to a minimum and batched.</li>
  684. <li>Focused writing: When you need to focus on what you are saying, not what people are saying to you, enter focused writing mode.</li>
  685. <li>Get updates without falling down a news hole: Avoid clickbait, don’t reload pages, just see updates from the sites you trust (relates to <a href="#your-front-page">Your Front Page</a>)</li>
  686. <li>Pomodoro: let yourself get distracted… but only a little bit. The Pomodoro technique helps you switch between periods of focused work and letting yourself relax</li>
  687. <li>Don’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’ll stop even asking.</li>
  688. <li>Suggestion-free browsing: Every page you look at isn’t an invitation to tell you what you should look at next. Remove suggested content, and do what <span class="caps">YOU</span> want to do next. (<a href="https://addons.mozilla.org/en-US/firefox/addon/remove-youtube-s-suggestions/">YouTube example</a>)</li>
  689. </ul>
  690. <p>Not just the conclusion of this list, the conclusion of my work in this area…</p>
  691. <p>Some challenges in the design process:</p>
  692. <ol>
  693. <li>Asking someone to <em>do</em> something new is hard, and unlikely to happen. My previous post (<a href="http://www.ianbicking.org/blog/2019/01/overengaged-knowledge-worker.html">The Over-engaged Knowledge Worker</a>) relates to this tension.</li>
  694. <li>… and yet a “problem” isn’t enough to get someone to do something either.</li>
  695. <li>If someone is consciously <em>and specifically</em> doing some task, then there’s an opportunity.</li>
  696. <li>Creating wholistic solutions is unwelcome, unintuitively each thing that adds to the size of a solution <em>diminishes</em> from the breadth of problems the solution can solve.</li>
  697. <li>… and yet, abstract solutions without any clear suggestion of what they solve aren’t great either!</li>
  698. <li>Figuring out how to package functionality is a big deal.</li>
  699. <li>Approaches that increase the density of information or choices are themselves somewhat burdensome.</li>
  700. <li>… and yet context-sensitive approaches are unpredictable and distracting compared to consistent (if dense) functionality.</li>
  701. <li>I still believe there’s a wealth of material in the <em>content</em> of the pages people encounter. But it’s irregular and hard to understand, it takes concerted and long-term effort to do something here.</li>
  702. <li>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 <span class="caps">UI</span>… but I think there’s still room for novel improvements to old ideas.</li>
  703. <li>User research is a really great place to start, but it’s not very prescriptive. It’s mostly problem-finding, not solution-finding.</li>
  704. <li>There’s some kinds of user research I wish I had access to, specifically really low level analysis of behavior. What’s in someone’s mind when they open a new tab, or reuse one? In what order do they scan the <span class="caps">UI</span>? What are mental models of a <span class="caps">URL</span>, of pages and how they change, in what order to people compose (mentally and physically) things they want to share… 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 important.</li>
  705. <li>There’s so many variables in an experiment, that it’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 fail.</li>
  706. </ol>
  707. <p>As Test Pilot comes to an end, I do find myself asking: is there room for qualitative improvements in desktop browser <span class="caps">UI</span>? 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 <em>does</em> break things.</p>
  708. <p>So, is there room for improvement? Of course there is! The millions of hours spent every day in Firefox alone… <em>this is actually important</em>. Yes, a lot of things are at a local maximum, and we can A/B test little tweaks to get some suboptimal parts to <em>their</em> 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 <span class="caps">VR</span>, and a user agent can do unique things beyond any site or app.</p>
  709. <p>And yet…</p>
  710. </article>
  711. </section>
  712. <nav id="jumpto">
  713. <p>
  714. <a href="/david/blog/">Accueil du blog</a> |
  715. <a href="http://www.ianbicking.org/blog/2019/03/firefox-experiments-i-would-have-liked.html">Source originale</a> |
  716. <a href="/david/stream/2019/">Accueil du flux</a>
  717. </p>
  718. </nav>
  719. <footer>
  720. <div>
  721. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  722. <p>
  723. Bonjour/Hi!
  724. Je suis <a href="/david/" title="Profil public">David&nbsp;Larlet</a>, je vis actuellement à Montréal et j’alimente cet espace depuis 15 ans. <br>
  725. Si tu as apprécié cette lecture, n’hésite pas à poursuivre ton exploration. Par exemple via les <a href="/david/blog/" title="Expériences bienveillantes">réflexions bimestrielles</a>, la <a href="/david/stream/2019/" title="Pensées (dés)articulées">veille hebdomadaire</a> ou en t’abonnant au <a href="/david/log/" title="S’abonner aux publications via RSS">flux RSS</a> (<a href="/david/blog/2019/flux-rss/" title="Tiens c’est quoi un flux RSS ?">so 2005</a>).
  726. </p>
  727. <p>
  728. Je m’intéresse à la place que je peux avoir dans ce monde. En tant qu’humain, en tant que membre d’une famille et en tant qu’associé d’une coopérative. De temps en temps, je fais aussi des <a href="https://github.com/davidbgk" title="Principalement sur Github mais aussi ailleurs">trucs techniques</a>. Et encore plus rarement, <a href="/david/talks/" title="En ce moment je laisse plutôt la place aux autres">j’en parle</a>.
  729. </p>
  730. <p>
  731. Voici quelques articles choisis :
  732. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  733. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  734. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  735. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  736. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  737. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  738. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  739. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  740. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  741. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  742. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  743. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  744. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  745. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  746. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  747. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  748. </p>
  749. <p>
  750. On peut <a href="mailto:david%40larlet.fr" title="Envoyer un courriel">échanger par courriel</a>. Si éventuellement tu souhaites que l’on travaille ensemble, tu devrais commencer par consulter le <a href="http://larlet.com">profil dédié à mon activité professionnelle</a> et/ou contacter directement <a href="http://scopyleft.fr/">scopyleft</a>, la <abbr title="Société coopérative et participative">SCOP</abbr> dont je fais partie depuis six ans. Je recommande au préalable de lire <a href="/david/blog/2018/cout-site/" title="Attention ce qui va suivre peut vous choquer">combien coûte un site</a> et pourquoi je suis plutôt favorable à une <a href="/david/pro/devis/" title="Discutons-en !">non-demande de devis</a>.
  751. </p>
  752. <p>
  753. Je ne traque pas ta navigation mais mon
  754. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  755. conserve des logs d’accès.
  756. </p>
  757. </div>
  758. </footer>
  759. <script type="text/javascript">
  760. ;(_ => {
  761. const jumper = document.getElementById('jumper')
  762. jumper.addEventListener('click', e => {
  763. e.preventDefault()
  764. const anchor = e.target.getAttribute('href')
  765. const targetEl = document.getElementById(anchor.substring(1))
  766. targetEl.scrollIntoView({behavior: 'smooth'})
  767. })
  768. })()
  769. </script>