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 53KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  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>Paradigm shifts for the decentralized Web (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="https://ruben.verborgh.org/blog/2017/12/20/paradigm-shifts-for-the-decentralized-web/">
  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. Paradigm shifts for the decentralized Web (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="https://ruben.verborgh.org/blog/2017/12/20/paradigm-shifts-for-the-decentralized-web/">Source originale du contenu</a></h3>
  445. <p>Most Web applications today follow the adage “your data for my services”. They motivate this deal from both <span class="nobr">a technical</span> perspective <em>(how could we provide services without your data?)</em> and <span class="nobr">a business</span> perspective <em>(how could we earn money without your data?)</em>. Decentralizing the Web means that people gain the ability <span class="nobr">to store</span> their data wherever they want, while still getting the services they need. <span class="nobr">This requires</span> major changes in the way we develop applications, as we migrate from <span class="nobr">a closed</span> back-end database to the open Web as our data source. In this post, <span class="nobr">I discuss</span> three paradigm shifts <span class="nobr">a decentralized</span> Web brings, demonstrating that decentralization is about much more than just controlling our own data. <span class="nobr">It is</span> <span class="nobr">a fundamental</span> rethinking of the relation between data and applications, <span class="nobr">which—if done</span> right—will accelerate creativity and innovation for the years <span class="nobr">to come</span>.</p> <p id="date"><time property="schema:datePublished" datetime="2017-12-20T12:00:00+01:00">20 December 2017</time></p> <p id="top-p-1"><a class="id" href="#top-p-1"/>The movement to <a href="https://www.wired.com/2017/04/tim-berners-lee-inventor-web-plots-radical-overhaul-creation/" target="_blank">(re-)decentralize the Web</a> is sometimes dismissively regarded as <span class="nobr">a modern-day</span> hippie reaction to the ever increasing power of technology giants such as Facebook and Google. And while the <em>David versus Goliath</em> way of thinking is definitely present among decentralists, there are many more advantages to <span class="nobr">a world</span> in which people and organisations regain the ability to store their data wherever they want—without missing out on the enormous potential and diversity the Web has <span class="nobr">to offer</span>.</p> <p id="top-p-2"><a class="id" href="#top-p-2"/>Ultimately, <strong>decentralization is about choice</strong>: we will choose where we <em>store</em> our data, who we give <em>access</em> to which parts of that data, which <em>services</em> we want on top <span class="nobr">of it,</span> <span class="nobr">and how</span> we <em>pay</em> for those. Nowadays, we are instead forced to accept <em>package deals</em> <span class="nobr">we cannot</span> customize. For example, Facebook shows us <span class="nobr">their social</span> feed featuring our friends, <span class="nobr">paid for</span> by advertising—but only if we store our personal data on Facebook. <span class="nobr">We cannot</span> see Twitter posts from others (unless they opt to copy their data to Facebook <span class="nobr">as well).</span> These deals are common, as virtually all Web applications we interact with behave in such <span class="nobr">a way.</span> Instead of arguing the <a href="/blog/2016/12/23/truth-takes-time/">appropriateness or ethics of this situation</a>, I’ll sketch the <strong>far-reaching effects of <span class="nobr">a decentralized</span> approach to Web development</strong>.</p> <figure id="top-figure-1"><a class="id" href="#top-figure-1"/> <img src="/images/blog/market.jpg" alt="[the Jemaa el-Fnaa market place at night]"/> <figcaption> Decentralization is not solely about data ownership: it fosters innovation and competition through separate markets for data and applications, requiring <span class="nobr">a new</span> development mindset. <span class="copyright">©<a href="https://www.flickr.com/photos/mierhhhlich/30550838731/" target="_blank">Damian Hedinger</a></span> </figcaption> </figure> <p id="top-p-3"><a class="id" href="#top-p-3"/>In this blog post, <span class="nobr">I will</span> discuss <strong>three paradigm shifts</strong> we need to prepare for if we want to build Web applications with a <span class="nobr">decentralized mindset</span>:</p> <ol> <li> <p id="top-p-4"><a class="id" href="#top-p-4"/><a href="#users-become-owners"><strong>End users become data owners</strong></a>. This is the most well-known decentralization aspect: we store our data in places of our choice, which improves privacy <span class="nobr">and control</span>.</p> </li> <li> <p id="top-p-5"><a class="id" href="#top-p-5"/><a href="#apps-become-views"><strong>Apps become views</strong></a>. As apps become decoupled from data, they start acting as interchangeable views rather than the single gateway to <span class="nobr">that data</span>.</p> </li> <li> <p id="top-p-6"><a class="id" href="#top-p-6"/><a href="#interfaces-become-queries"><strong>Interfaces become queries</strong></a>. Data will be distributed across highly diverse interfaces, so sustainable apps need declarative contracts instead of custom <span class="nobr">data requests.</span></p> </li> </ol> <p id="top-p-7"><a class="id" href="#top-p-7"/>These paradigm shifts are explained in depth below. I’ll use social networking sites as examples to simplify the narrative, but the principles generalize to all <span class="nobr">Web applications.</span></p> <h2 id="users-become-owners"><a class="id" href="#users-become-owners"/><em>Paradigm shift 1:</em> End users become data owners</h2> <p id="users-become-owners-p-1"><a class="id" href="#users-become-owners-p-1"/>The basis of decentralization is that <strong>people choose where they store their data</strong>. <span class="nobr">Instead of</span> having to pick between <span class="nobr">a handful</span> of providers such Google or Facebook, <span class="nobr">in a decentralized</span> world, there will be many options to pick from—and we are free to create our own. This idea brings us back to the <a href="https://www.theguardian.com/technology/2017/nov/15/tim-berners-lee-world-wide-web-net-neutrality" target="_blank">original vision for the Web</a>, where anyone has their own website or blog and publishes their thoughts on there, rather than in <a href="https://medium.com/matter/the-web-we-have-to-save-2eb1fe15a426" target="_blank"><em><span class="nobr">a single</span> stream</em></a> owned by <span class="nobr">one company</span>.</p> <p id="users-become-owners-p-2"><a class="id" href="#users-become-owners-p-2"/>To <span class="nobr">a certain</span> extent, we already have that choice: since its inception, the Web’s decentralized architecture has allowed anyone to have their own space. However, <span class="nobr">we want</span> the <strong>convenience of the single stream</strong> without the central control that currently comes <span class="nobr">with that.</span> We want to continue enjoying <strong>the same types of services</strong> that nowadays are only available on centralized platforms. So the important question is: can applications on top of decentralized data <strong>behave the same way as centralized apps</strong>? For example, can we still generate <span class="nobr">a friend</span> list and news feed like Facebook does—even if our friends’ data is stored on <span class="nobr">different servers</span>?</p> <p id="users-become-owners-p-3"><a class="id" href="#users-become-owners-p-3"/>The answer to these questions varies with <strong>different degrees of decentralization</strong>:</p> <figure id="axis"><a class="id" href="#axis"/> <img src="/images/blog/decentralization-axis.svg" class="white" alt="[an axis showing different degrees of decentralization]"/> </figure> <p id="users-become-owners-p-4"><a class="id" href="#users-become-owners-p-4"/>On the one end of the spectrum, <em>centralized solutions</em> store all personal data they use themselves: Twitter and Facebook are single data hubs for respectively millions and billions of users. In contrast, the <em>decentralized microblogging network</em> <a href="https://joinmastodon.org/" target="_blank"><strong>Mastodon</strong></a> lets anyone set up their own Twitter clone, counting <a href="http://www.ethanzuckerman.com/blog/2017/08/18/mastodon-is-big-in-japan-the-reason-why-is-uncomfortable/" target="_blank">around <span class="nobr">1.5 million</span> users spread across <span class="nobr">2,400 servers</span></a>. <span class="nobr">A couple</span> of thousand people share <span class="nobr">a server,</span> and the application can read content from people on other servers as well. The <a href="https://solid.mit.edu/" target="_blank"><strong>Solid</strong></a> platform takes this further, introducing the concept of <strong><em>one</em> <span class="nobr">data pod</span> per person</strong>. Such a <em><span class="nobr">data pod</span></em> is <span class="nobr">a simple</span> data storage location on <span class="nobr">a server,</span> equipped with <strong>highly granular access control</strong>, so anyone can decide exactly which people and apps can access what parts of their data. Applications become <em>clients</em> of these servers, sourcing data from multiple <span class="nobr">data pods.</span> Solid eventually envisages <span class="nobr">a world</span> of <strong><em>multiple</em> <span class="nobr">data pods</span> per person</strong>: one at home for personal data, one at the office for sensitive work files, one at school to track study material, etc. In this post, <span class="nobr">I assume</span> such <span class="nobr">a high</span> degree of decentralization. <span class="nobr">Note that</span> the names in the above axis are <em>envisaged</em> uses: it is theoretically possible to use Mastodon or Solid in different ways, and other <span class="nobr">platforms exist</span>.</p> <p id="users-become-owners-p-5"><a class="id" href="#users-become-owners-p-5"/>In <span class="nobr">a fully</span> decentralized social network, <strong>every single part of an interaction</strong>—which <span class="nobr">would now</span> be stored in its entirety on Facebook—<strong>could reside in <em>different</em> <span class="nobr">data pods</span></strong>. Consider this social media post, where an author states his professional opinion on <span class="nobr">an online news</span> article. Literally each single piece of data can be in another <span class="nobr">data pod:</span></p> <figure id="decentralized-facebook"><a class="id" href="#decentralized-facebook"/> <img src="/images/blog/decentralized-facebook.svg" class="white" alt="[a social media post, with different parts stored in different data pods]"/> </figure> <p id="users-become-owners-p-6"><a class="id" href="#users-become-owners-p-6"/>In the fully decentralized way of thinking, <strong>everything <em>you</em> post is stored on your own website or server</strong>. An app collects all posts from people <span class="nobr">I am</span> following from different servers, and displays them in <span class="nobr">a feed</span> for me. When <span class="nobr">I like</span> your post, <strong>this “like” is stored on <em>my</em> server</strong>. This action triggers my server to send a <a href="https://www.w3.org/TR/ldn/" target="_blank">notification</a> to yours, so you can decide whether to display this like or not—for instance, by storing <span class="nobr">a copy</span> of it. Every comment or like on any item is stored at <span class="nobr">a location</span> chosen by the poster, together with its associated permissions to read, write, or <span class="nobr">delete it</span>.</p> <p id="users-become-owners-p-7"><a class="id" href="#users-become-owners-p-7"/>This paradigm of <strong>storing everything in <span class="nobr">a place</span> we control</strong> is fundamentally different from the centralized one, and has several beneficial consequences for users. It improves <strong>privacy</strong>, since you can say whatever you want about anything, without having to disclose this to Facebook or anyone else. This positively impacts freedom of speech and goes against <a href="https://www.wsj.com/articles/norway-accuses-facebook-of-censorship-over-deleted-photo-of-napalm-girl-1473428032" target="_blank">censorship</a> <em>(with all of the associated <a href="http://www.ethanzuckerman.com/blog/2017/08/18/mastodon-is-big-in-japan-the-reason-why-is-uncomfortable/" target="_blank">consequences and debates</a>)</em>. <span class="nobr">The flexible</span> access control can be used in any way imaginable: even individual likes or comments could only <span class="nobr">be visible</span> to certain people, groups, or applications—and you can change those permissions at any time. All this is what it means to truly be a <strong>data owner</strong>.</p> <p id="users-become-owners-p-8"><a class="id" href="#users-become-owners-p-8"/>Other than with centralized platforms, <strong>trust</strong> is not derived from <span class="nobr">a single</span> party. For instance, if <span class="nobr">I claim</span> my post has <span class="nobr">124 likes,</span> then we believe this because Facebook says so (and frankly, we have no objective reason to doubt that). In <span class="nobr">a decentralized</span> scenario, <span class="nobr">I could</span> prove that by linking to the individual likes that are stored on other servers, which form a <strong>provenance trail</strong>. And if those links break for any reason (for instance, if people retract their like), <span class="nobr">I can</span> still prove they once liked it, if my <span class="nobr">app made</span> <span class="nobr">a copy</span> of their digitally signed like on my post. This mechanism can replace networks that are largely based on authority, such as LinkedIn, where people build <span class="nobr">a reputation</span> from the people they are connected to. We can essentially replace LinkedIn by an address book, where somebody is <span class="nobr">a connection</span> if they also have you in <em>their</em> <span class="nobr">contact list</span>.</p> <p id="users-become-owners-p-9"><a class="id" href="#users-become-owners-p-9"/>The main challenge with full decentralization of data is <strong>scalability</strong>. In the Mastodon scenario, there are still relatively few servers for many users. In the Solid scenario, there might even be more <span class="nobr">data pods</span> than users. In the end, decentralization will go hand in hand with <strong>dynamic data replication</strong>, which will need to be balanced carefully with fine-grained access control possibilities in order to guarantee <span class="nobr">data privacy</span>.</p> <h2 id="apps-become-views"><a class="id" href="#apps-become-views"/><em>Paradigm shift 2:</em> Apps become views</h2> <p id="apps-become-views-p-1"><a class="id" href="#apps-become-views-p-1"/>By <strong>breaking the tight coupling between data and applications</strong>, decentralization questions and alters the very nature of an application. While the second paradigm shift comes as <span class="nobr">a direct</span> consequence of the <a href="#users-become-owners">first paradigm shift</a> we discussed above, it is equally crucial in its <span class="nobr">own way</span>.</p> <p id="apps-become-views-p-2"><a class="id" href="#apps-become-views-p-2"/>Basically, the competitive advantage of many of today’s popular centralized platforms is their <a href="https://www.theguardian.com/technology/2010/nov/22/tim-berners-lee-facebook" target="_blank"><em><span class="nobr">data silo</span></em></a>, and the fact that <strong>their service depends entirely on access to that data</strong>. Conceptually speaking, the <em>service</em> offered by Facebook, Twitter, and LinkedIn is fairly simple and could be replicated easily by others. Yet <span class="nobr">a major</span> reason why people appreciate the services of these platforms is because of their data: Facebook is engaging because our friends’ data is there, Twitter has all of the world’s tweets and direct messages, and LinkedIn showcases our broad networks. In fact, these platforms have become <strong>inseparable from their data</strong>: we use “Facebook” to refer to both the application and the data that drives that application. The result is that nearly every Web app today tries to ask you for more and more data again and again, leading to dangling data on <a href="/articles/queryable-research-data/#introduction">duplicate and inconsistent profiles</a> we can no longer manage. <span class="nobr">And of course,</span> this comes with significant <span class="nobr">privacy concerns</span>.</p> <p id="apps-become-views-p-3"><a class="id" href="#apps-become-views-p-3"/>In contrast, decentralized Web applications decouple data and applications: <strong>you enter data <span class="nobr">only once</span></strong>—in your own <span class="nobr">data pod.</span> Instead of maintaining credentials with each app, you log in through your <span class="nobr">data pod</span> and <strong>give apps permission</strong> to read or write specific parts of your data. The Web’s ecosystem thereby evolves from bundled data+service packages into <strong><span class="nobr">applications as</span> interchangeable views</strong>, wherein each <span class="nobr">Web app</span> provides <em>consistent</em> visualizations, interactions, and processing over your personal <span class="nobr">data pod.</span> Furthermore, those apps let you interact with any other <span class="nobr">data pods</span> you have access to, such as those of your friends. <strong>Applications <em>ask</em> rather than <em>own</em></strong>, <span class="nobr">and they</span> are able to reuse data create by other apps, avoiding vendor lock-in.</p> <figure id="apps-as-views"><a class="id" href="#apps-as-views"/> <img src="/images/blog/apps-as-views.svg" class="white" alt="[decentralized Web applications share data from a personal data pod]"/> </figure> <p id="apps-become-views-p-4"><a class="id" href="#apps-become-views-p-4"/>In this ecosystem, Facebook’s friend feeds becomes a <strong>view over <em>your</em> contact list</strong> in <em>your</em> <span class="nobr">data pod,</span> combined with the latest messages your contacts have posted in <em>their</em> <span class="nobr">data pods.</span> Decentralized LinkedIn and Doodle could be <strong>granted access</strong> to your address book, so your list of colleagues would always be <span class="nobr">in sync</span> for meeting requests (because there would actually only be one list instead of multiple). Decentralized Doodle and Facebook could both be granted access to your calendar, where Doodle can only see when you are available, and Facebook can only add events. <strong>Any change in one view is directly reflected in another</strong> because they share the <span class="nobr">same storage</span>.</p> <p id="apps-become-views-p-5"><a class="id" href="#apps-become-views-p-5"/>Importantly, this disentanglement of data and services creates <strong>separate markets for data and applications</strong>. Each of those to markets comes with its own competitive forces that stimulate creativity and innovation at <span class="nobr">a higher</span> rate, since the ability to provide <span class="nobr">a service</span> no longer depends on ownership <span class="nobr">of data</span>.</p> <figure id="two-markets"><a class="id" href="#two-markets"/> <img src="/images/blog/data-and-app-markets.svg" class="white" alt="[competition on separate data and app markets facilitates innovation]"/> </figure> <p id="apps-become-views-p-6"><a class="id" href="#apps-become-views-p-6"/>On the <strong>application market</strong>, whoever can make <span class="nobr">a more</span> user-friendly social feed than Facebook, or show <span class="nobr">a better</span> network overview than LinkedIn, is able to attract people solely based on its quality of the service. Moreover, people can choose the application that serves them best, and can <strong>switch between applications at any time</strong>, since all apps are views over your personal <span class="nobr">data pod.</span> Instead of entering your name and e-mail address over and over again, you instead log in with your <span class="nobr">data pod</span> to give access to these pieces of data—and you can revoke this permission at any moment. Moreover, integration becomes simple: if an existing application lacks specific functionality, <span class="nobr">you can</span> easily write <span class="nobr">a small</span> app that provides <span class="nobr">a new</span> view on the <span class="nobr">same data</span>.</p> <p id="apps-become-views-p-7"><a class="id" href="#apps-become-views-p-7"/>On the <strong>data market</strong>, different options emerge as well. Depending on your requirements, you might prefer different storage providers. The most technologically advanced of us could decide to host their own server, possibly based on existing software packages. For <strong>personal purposes</strong>, people might select providers similar to Dropbox—the difference being that their choice only depends on storage aspects and not on application functionality. More expensive plans could for instance provide additional backup or security options. For <strong>professional purposes</strong>, an even wider range of solutions could exist, ranging from on-site storage to cloud-hosted packages. Universities could provide their students with storage for anything related to their education, and governments could do the same for citizens’ official documents. Specialized software solutions could emerge for law offices or hospitals, where sensitive data is treated appropriately according to data retention policies. Currently, such use cases require people to accept whatever application comes with their desired <span class="nobr">storage option</span>.</p> <p id="apps-become-views-p-8"><a class="id" href="#apps-become-views-p-8"/>The key to <span class="nobr">a healthy</span> ecosystem is the <strong>independence of these two markets</strong>, realized through <span class="nobr">a noncommittal</span> relationship between apps and data. Since there currently exists no such separation, new innovative application platforms have trouble emerging because they don’t have the data—and existing platforms lack incentives to innovate adequately because they already possess data data anyway. This competition argument is highly similar to the <strong>Net Neutrality</strong> debate, which strives to maintain the separation of the <a href="https://medium.com/@timberners_lee/act-now-to-save-the-internet-as-we-know-it-ccf47ce8b39f" target="_blank"><em>content</em> and <em>connectivity</em> markets</a>. Indeed, we can regard <span class="nobr">a fully</span> decentralized approach as <span class="nobr">a way</span> to realize <strong>platform neutrality</strong>, where applications and storage solutions become interchangeable, just like websites and <span class="nobr">Internet providers</span>.</p> <h2 id="interfaces-become-queries"><a class="id" href="#interfaces-become-queries"/><em>Paradigm shift 3:</em> Interfaces become queries</h2> <p id="interfaces-become-queries-p-1"><a class="id" href="#interfaces-become-queries-p-1"/>The third and final paradigm shift <span class="nobr">I will</span> discuss pertains to the <strong>communication between apps and <span class="nobr">data pods</span></strong>. It represents my own conclusion that I’ve drawn from the <a href="#users-become-owners">first</a> and <a href=":#apps-become-views">second</a> <span class="nobr">paradigm shifts</span>.</p> <p id="interfaces-become-queries-p-2"><a class="id" href="#interfaces-become-queries-p-2"/>The current generation of Web applications communicates with servers through a <strong>highly specific sequence of steps</strong> that are hard-coded into the application logic. These steps contain specific requests to <span class="nobr">a Web <abbr class="caps">API</abbr>,</span> <span class="nobr">a (typically</span> custom) interface exposed by the server. If applications become views over many different kinds of <span class="nobr">data pods,</span> <span class="nobr">an important</span> question is what interface these <span class="nobr">data pods</span> need <span class="nobr">to expose</span>.</p> <p id="interfaces-become-queries-p-3"><a class="id" href="#interfaces-become-queries-p-3"/>It seems unrealistic to hope that all of these <span class="nobr">data pods</span> would have the same <span class="nobr">Web <abbr class="caps">API</abbr></span> <span class="nobr">(be it</span> <a href="https://www.w3.org/TR/ldp/" target="_blank">Linked Data Platform</a>, <a href="https://www.w3.org/TR/sparql11-protocol/" target="_blank"><abbr class="caps">SPARQL</abbr></a>, or <a href="http://graphql.org/learn/serving-over-http/" target="_blank">GraphQL</a>). Not only would this require <span class="nobr">a standardization</span> effort without precedent, such <span class="nobr">a standard</span> could never cover all cases. Given that we aim for competition on the data market as well, different kinds of <span class="nobr">data pods</span> are <strong><em>expected</em> to provide different kinds of interfaces</strong> with varying expressivity. <span class="nobr">On top of this,</span> on <span class="nobr">a decentralized</span> Web, the data needed by applications will be <strong>scattered across <em>multiple</em> <span class="nobr">data pods</span></strong>. So even if all pods had the same interface, <span class="nobr">apps would</span> still need to route requests to the right pods and combine <span class="nobr">their data</span>.</p> <p id="interfaces-become-queries-p-4"><a class="id" href="#interfaces-become-queries-p-4"/>This indicates that <strong>decentralized apps shouldn’t bind directly to concrete <span class="nobr">Web <abbr class="caps">API</abbr>s</span></strong>, because this would limit them to specific <span class="nobr">data pods</span> at <span class="nobr">a specific</span> point in time. If their interfaces evolve, or if we want to access different <span class="nobr">data pods,</span> apps would need to be reprogrammed. Clearly, such <span class="nobr">a fragile</span> contract between the app and data markets would form <span class="nobr">a major</span> bottleneck to sustainable growth and scalability. Instead of hard-coding <span class="nobr">a specific</span> sequence of requests, the application logic should formulate in <span class="nobr">a higher-level</span> language what operation it wants to perform <span class="nobr">with data</span>.</p> <p id="interfaces-become-queries-p-5"><a class="id" href="#interfaces-become-queries-p-5"/>Therefore, <span class="nobr">I believe</span> that decentralized Web applications should exclusively use <strong><span class="nobr">declarative queries</span></strong> to view and update data on our pods, so their expression of the intended data operation remains constant—even if interfaces are different. Rather than directly interacting with pod interfaces, <strong>queries are processed by <span class="nobr">a client-side</span> library</strong>, which translates these queries into concrete <span class="nobr"><abbr class="caps">HTTP</abbr> requests</span> against one or multiple <span class="nobr">data pods.</span> This means that, rather than <span class="nobr">a horizontal</span> interface orientation or <span class="nobr">a vertical</span> interface that <em>directly</em> accesses the <span class="nobr">Web <abbr class="caps">API</abbr>,</span> decentralized Web applications need a <a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.215.7100&amp;rep=rep1&amp;type=pdf#page=5" target="_blank"><strong>vertical interface orientation with an internal horizontal separation</strong></a>.</p> <figure id="query-based-interaction"><a class="id" href="#query-based-interaction"/> <img src="/images/blog/query-based-interaction.svg" class="white" alt="[the application-specific logic of a decentralized Web application interacts with a resuable query engine library]"/> </figure> <p id="interfaces-become-queries-p-6"><a class="id" href="#interfaces-become-queries-p-6"/>By abstracting all of an application’s operations as declarative queries, we enable an <strong>independent evolution</strong> of apps and server-side interfaces. At design time, apps only bind to slowly changing high-level queries instead of rapidly moving and changing low-level interfaces, so they don’t need to commit to <span class="nobr">a specific</span> <span class="nobr">data pod.</span> At runtime, the client-side query engine library—which can be shared across many applications—is responsible for interfacing with the concrete <span class="nobr">Web <abbr class="caps">API</abbr>s</span> of the relevant <span class="nobr">data pods</span> for <span class="nobr">a given</span> user. This also enables transparent data replication and aggregation, which will be necessary to speed up data collection across <span class="nobr">many pods</span>.</p> <p id="interfaces-become-queries-p-7"><a class="id" href="#interfaces-become-queries-p-7"/>While reducing the dependency of applications to queries facilitates their development and improves their sustainability, it implies a <strong>complex, cross-<abbr class="caps">API</abbr> query engine</strong>. <span class="nobr">I envision</span> that multiple implementations of such <span class="nobr">a query</span> library would compete, and eventually replace the <abbr class="caps">API</abbr>-specific client-side libraries that are symptomatic of tight coupling between clients, services, and their underlying data. <span class="nobr">A possible</span> direction to realize this in <span class="nobr">a scalable</span> way is to <strong><a href="https://arxiv.org/pdf/1609.07108v2.pdf" target="_blank">split monolithic <span class="nobr">Web <abbr class="caps">API</abbr>s</span> into <em><abbr class="caps">API</abbr> features</em></a></strong>, which can be reused across <span class="nobr">data pods.</span> These pods could then opt to provide different kinds of capabilities—such as <a href="https://www.w3.org/TR/ldp/" target="_blank">Linked Data Platform</a>, (subsets of) <a href="https://www.w3.org/TR/sparql11-protocol/" target="_blank"><abbr class="caps">SPARQL</abbr></a> and <a href="http://graphql.org/learn/serving-over-http/" target="_blank">GraphQL</a>, or <a href="https://www.hydra-cg.com/spec/latest/triple-pattern-fragments/" target="_blank">Triple Pattern Fragments</a>—depending on the service level chosen by their users. In the ideal case, <span class="nobr">a data pod</span> supports all queries required by the application, so the library can send them straight through; in other cases, it splits queries into <span class="nobr">multiple requests</span>.</p> <p id="interfaces-become-queries-p-8"><a class="id" href="#interfaces-become-queries-p-8"/>The combination of decentralization and query execution also confronts us with a <strong>temporally different way of interacting with data</strong>. In traditional <span class="nobr">Web applications,</span> the procedure is typically <em>“send query—wait for execution to complete—act on all results”</em>. <span class="nobr">In a decentralized</span> setting, we know that data collection <em>will</em> take time, so applications should be prepared to do more useful things instead of just waiting. The procedure becomes <em>“send query—act on each incoming result”</em>, processing every piece of incoming data a <strong>streaming</strong> way. In general, completeness should never be assumed, given that the Web is an open world. This is an additional indication of how radically the relation between data and applications <span class="nobr">will change</span>.</p> <h2 id="decentralization-as-the-way-forward"><a class="id" href="#decentralization-as-the-way-forward"/>Decentralization as the way forward</h2> <p id="decentralization-as-the-way-forward-p-1"><a class="id" href="#decentralization-as-the-way-forward-p-1"/>Each of the above paradigm shifts show that decentralizing the Web is about <strong>reorganizing power</strong>. First, people gain the power to control their own data and privacy. Second, new applications and data solutions gain competitive power through the resulting decoupling of apps and data. Third, the expressive power of applications improves by depending on transferable queries instead of low-<span class="nobr">level interfaces</span>.</p> <p id="decentralization-as-the-way-forward-p-2"><a class="id" href="#decentralization-as-the-way-forward-p-2"/>What <span class="nobr">I describe</span> in this blog post is <strong>slowly but steadily happening</strong>, and was in fact inspired by prototypes that currently exist. The decentralized editor <a href="https://dokie.li/" target="_blank"><strong>dokieli</strong></a> and its annotation functionalities convincingly demonstrate that every atomic piece of data can be stored in <span class="nobr">a different</span> place. Spending the summer at <abbr class="caps">MIT</abbr>’s <a href="http://dig.csail.mit.edu/" target="_blank">Decentralized Information Group</a> revealed the possibilities of simple server-side data stores such as <a href="https://solid.mit.edu/" target="_blank"><strong>Solid</strong></a> for advanced client-side applications. It’s there that <span class="nobr">I saw</span> for the first time how <em>data</em> can drive everything seamlessly—while apps become simple views. <a href="https://github.com/linkeddata/mashlib" target="_blank"><strong>Mashlib</strong></a> proves how everyday needs can be addressed with small applications, since these can tap into existing data instead of needing to duplicate input functionality to ask for basic details over and over. Finally, our work on <a href="http://linkeddatafragments.org/" target="_blank"><strong>Linked Data Fragments</strong></a>—and its <a href="https://github.com/solid/solid-tpf" target="_blank">Solid plugin</a>—aims to grow decentralized querying to <span class="nobr">a Web scale.</span></p> <p id="decentralization-as-the-way-forward-p-3"><a class="id" href="#decentralization-as-the-way-forward-p-3"/><span class="nobr">A question</span> many people have is whether <strong>decentralization is realistic</strong> in real-world scenarios. On the one hand, I’m inclined to answer that, in any case, the Web cannot possibly become more centralized than it already is today. Facebook has already become <span class="nobr">a main</span> gateway for such an immense number of people, that <strong>the only logical direction forward is less centralized</strong>. My conviction is based more than just gut feeling, since <span class="nobr">I see</span> several parties come to similar conclusions. On the other hand, <span class="nobr">I have</span> experienced the enormous potential of many aspects of the decentralized vision. The idea doesn’t need to start solely with enthusiastic technophiles, but can <strong>grow from concrete industry needs</strong>. The notion of <span class="nobr">a private,</span> on-premise <span class="nobr">data pod</span> appeals to sectors such as <em>finance</em>, <em>law</em>, and <em>healthcare</em>, which have <span class="nobr">a promising</span> market for high-security <span class="nobr">data pods</span> and transparent information access through apps <span class="nobr">as views.</span> From <span class="nobr">a digital</span> society perspective, personal <span class="nobr">data pods</span> address the problems we are facing with <strong>an increasing number of parties asking consistent access to specific parts of our personal data</strong>. <span class="nobr">I also</span> liked <a href="http://www.cs.rpi.edu/~hendler/" target="_blank"><span class="nobr">Jim Hendler</span></a> quoting <a href="https://web.media.mit.edu/~minsky/" target="_blank">Marvin Minsky</a> that we’ll know computers are truly becoming intelligent when they won’t ask for the same info twice <span class="nobr">ever again.</span> Approaching decentralization the right way will enable <span class="nobr">exactly that</span>.</p> <p id="decentralization-as-the-way-forward-p-4"><a class="id" href="#decentralization-as-the-way-forward-p-4"/>The final question is <strong>who will pay for all of this</strong>. The good news is that we’ll have <span class="nobr">a choice</span> there too. Bundled package deals such as Facebook and Twitter only offer the ad-based payment option with its <a href="https://webfoundation.org/2017/03/web-turns-28-letter/" target="_blank">infamous consequences</a>. In <span class="nobr">a decentralized</span> world, we can choose our data and app providers independently, and decide for each how we are willing to pay. The bad news is that this means <strong>not everything is going to be “free”</strong>, as <span class="nobr">it seemingly</span> appears now. However, increased competition—on two separate markets—should lead to fair prices. And if we really want free options, we could even imagine paying with our personal data, giving selected parts away in exchange for ads. That’s <span class="nobr">of course</span> how social media are implicitly supported now, but the main difference will be that <em>we</em> decide which data can be used for advertising purposes and which cannot. <span class="nobr">This proves</span> once more that, at its core, decentralization starts with us taking back control of our data, as <span class="nobr">a source</span> for <span class="nobr">a new</span> generation of innovative <span class="nobr">Web applications.</span></p></p>
  446. </article>
  447. </section>
  448. <nav id="jumpto">
  449. <p>
  450. <a href="/david/blog/">Accueil du blog</a> |
  451. <a href="https://ruben.verborgh.org/blog/2017/12/20/paradigm-shifts-for-the-decentralized-web/">Source originale</a> |
  452. <a href="/david/stream/2019/">Accueil du flux</a>
  453. </p>
  454. </nav>
  455. <footer>
  456. <div>
  457. <img src="/static/david/david-larlet-avatar.jpg" loading="lazy" class="avatar" width="200" height="200">
  458. <p>
  459. Bonjour/Hi!
  460. 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>
  461. 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>).
  462. </p>
  463. <p>
  464. 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>.
  465. </p>
  466. <p>
  467. Voici quelques articles choisis :
  468. <a href="/david/blog/2019/faire-equipe/" title="Accéder à l’article complet">Faire équipe</a>,
  469. <a href="/david/blog/2018/bivouac-automnal/" title="Accéder à l’article complet">Bivouac automnal</a>,
  470. <a href="/david/blog/2018/commodite-effondrement/" title="Accéder à l’article complet">Commodité et effondrement</a>,
  471. <a href="/david/blog/2017/donnees-communs/" title="Accéder à l’article complet">Des données aux communs</a>,
  472. <a href="/david/blog/2016/accompagner-enfant/" title="Accéder à l’article complet">Accompagner un enfant</a>,
  473. <a href="/david/blog/2016/senior-developer/" title="Accéder à l’article complet">Senior developer</a>,
  474. <a href="/david/blog/2016/illusion-sociale/" title="Accéder à l’article complet">L’illusion sociale</a>,
  475. <a href="/david/blog/2016/instantane-scopyleft/" title="Accéder à l’article complet">Instantané Scopyleft</a>,
  476. <a href="/david/blog/2016/enseigner-web/" title="Accéder à l’article complet">Enseigner le Web</a>,
  477. <a href="/david/blog/2016/simplicite-defaut/" title="Accéder à l’article complet">Simplicité par défaut</a>,
  478. <a href="/david/blog/2016/minimalisme-esthetique/" title="Accéder à l’article complet">Minimalisme et esthétique</a>,
  479. <a href="/david/blog/2014/un-web-omni-present/" title="Accéder à l’article complet">Un web omni-présent</a>,
  480. <a href="/david/blog/2014/manifeste-developpeur/" title="Accéder à l’article complet">Manifeste de développeur</a>,
  481. <a href="/david/blog/2013/confort-convivialite/" title="Accéder à l’article complet">Confort et convivialité</a>,
  482. <a href="/david/blog/2013/testament-numerique/" title="Accéder à l’article complet">Testament numérique</a>,
  483. et <a href="/david/blog/" title="Accéder aux archives">bien d’autres…</a>
  484. </p>
  485. <p>
  486. 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>.
  487. </p>
  488. <p>
  489. Je ne traque pas ta navigation mais mon
  490. <abbr title="Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33.184162340">hébergeur</abbr>
  491. conserve des logs d’accès.
  492. </p>
  493. </div>
  494. </footer>
  495. <script type="text/javascript">
  496. ;(_ => {
  497. const jumper = document.getElementById('jumper')
  498. jumper.addEventListener('click', e => {
  499. e.preventDefault()
  500. const anchor = e.target.getAttribute('href')
  501. const targetEl = document.getElementById(anchor.substring(1))
  502. targetEl.scrollIntoView({behavior: 'smooth'})
  503. })
  504. })()
  505. </script>