summaryrefslogtreecommitdiff
path: root/src/content/en
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/content/en/about.adoc28
-rw-r--r--src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc5
-rw-r--r--src/content/en/blog/2020/11/14/local-first-review.adoc2
-rw-r--r--src/content/en/index.adoc4
-rw-r--r--src/content/en/music.adoc33
-rw-r--r--src/content/en/pastebin/2021/06/22/curl-wget.adoc2
-rw-r--r--src/content/en/screencast/2021/02/07/autoqemu.adoc1
-rw-r--r--src/content/en/slide/2020/10/19/feature-flags.adoc234
-rw-r--r--src/content/en/slide/2020/10/19/feature-flags.eslaides230
-rw-r--r--src/content/en/slide/2020/11/14/local-first-hype.adoc208
-rw-r--r--src/content/en/slide/2020/11/14/local-first-hype.eslaides204
-rw-r--r--src/content/en/slide/categories.adoc2
-rw-r--r--src/content/en/slide/index.adoc4
13 files changed, 520 insertions, 437 deletions
diff --git a/src/content/en/about.adoc b/src/content/en/about.adoc
index 14d5e22..5e8b699 100644
--- a/src/content/en/about.adoc
+++ b/src/content/en/about.adoc
@@ -2,10 +2,36 @@
:mailto: mailto:~euandreh/public-inbox@lists.sr.ht
:archive: https://lists.sr.ht/~euandreh/public-inbox
+:cargo2nix: ../en/blog/2020/10/05/cargo2nix.html
+:swift2nix: ../en/blog/2020/10/05/swift2nix.html
+:database: ../en/blog/2020/08/31/database-i-wish-i-had.html
+:fallible: ../en/blog/2021/02/17/fallible.html
+:flags: ../en/blog/2020/10/19/feature-flags.html
+:interviewing: ../en/blog/2020/10/20/wrong-interviewing.html
+:stateless: ../en/blog/2019/06/02/nixos-stateless-workstation.html
+:bugtracker: ../en/blog/2020/11/07/diy-bugs.html
-Hi, I'm EuAndreh. I write software and, occasionally, music. You can find my
+Hi, I'm EuAndreh -- André Miranda Moreira. I write software and, occasionally, music. You can find my
contact information in the footer of this page, or mail my {mailto}[public
inbox] ({archive}[archive]).
This is my personal website where I write articles, publish software and more
related work.
+
+I write about robust software: the kind that still works after the network
+drops, after the vendor leaves, and after you stop paying attention.
+
+That shows up in a few places. I care about reproducible systems, so I run a
+link:{stateless}[stateless NixOS workstation] and have written bridges like
+link:{cargo2nix}[cargo2nix] and link:{swift2nix}[swift2nix] to make Rust and
+Swift first-class citizens inside Nix builds. I care about durable data, which
+is why I keep returning to local-first software, persistent data structures,
+and link:{database}[the database I wish existed]: embedded, immutable, and
+syncable. And I care about tools that don't need a company behind them, so I
+reach for Git, email and plain text before I reach for a service --
+far enough that link:{bugtracker}[my bug tracker is a directory].
+
+I also think about how teams ship -- fault injection
+(link:{fallible}[fallible]), link:{flags}[feature flags], and
+link:{interviewing}[how we interview engineers] -- because robustness is a
+team habit before it is a technology.
diff --git a/src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc b/src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc
index 76bd8e6..7c1e837 100644
--- a/src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc
+++ b/src/content/en/blog/2018/08/01/npm-ci-reproducibility.adoc
@@ -115,7 +115,8 @@ https://lernajs.io/[Lerna]footnote:lerna-package-lock[
was harder than I expected.
]:
-```bash
+[source,sh]
+----
cd /tmp/
git clone https://github.com/lerna/lerna.git
cd lerna/
@@ -127,7 +128,7 @@ npm ci
merkle-tree node_modules/ # outputs 11e218c4ac32fac8a9607a8da644fe870a25c99821167d21b607af45699afafa
npm ci # test if it also works with an existing node_modules/ folder
merkle-tree node_modules/ # outputs 11e218c4ac32fac8a9607a8da644fe870a25c99821167d21b607af45699afafa
-```
+----
Good job `npm ci` :)
diff --git a/src/content/en/blog/2020/11/14/local-first-review.adoc b/src/content/en/blog/2020/11/14/local-first-review.adoc
index 2036069..4effc43 100644
--- a/src/content/en/blog/2020/11/14/local-first-review.adoc
+++ b/src/content/en/blog/2020/11/14/local-first-review.adoc
@@ -1,4 +1,4 @@
-= Local-First Software: article review
+= Local-First Software: You Own Your Data, in spite of the Cloud - article review
:categories: presentation article-review
:empty:
diff --git a/src/content/en/index.adoc b/src/content/en/index.adoc
index 275f7c4..2510fef 100644
--- a/src/content/en/index.adoc
+++ b/src/content/en/index.adoc
@@ -1 +1,3 @@
-= index
+= Home
+
+The newest of each collection is below.
diff --git a/src/content/en/music.adoc b/src/content/en/music.adoc
new file mode 100644
index 0000000..6828baa
--- /dev/null
+++ b/src/content/en/music.adoc
@@ -0,0 +1,33 @@
+= Music
+:dengoso: ../music/dengoso
+:marcha: ../music/marcha-dos-marinheiros
+:choro: ../music/choro-da-saudade
+
+Scores I have engraved, with a synthesised rendering of each. The
+LilyPond sources are in the repository; the PDFs are built from them.
+
+== Scores
+
+João Pernambuco, link:{dengoso}.pdf[Dengoso]
+
+++++
+<audio controls>
+ <source src="../music/dengoso.ogg" type="audio/ogg" />
+</audio>
+++++
+
+Canhoto, link:{marcha}.pdf[Marcha dos Marinheiros]
+
+++++
+<audio controls>
+ <source src="../music/marcha-dos-marinheiros.ogg" type="audio/ogg" />
+</audio>
+++++
+
+Agustín Barrios, link:{choro}.pdf[Choro da Saudade]
+
+++++
+<audio controls>
+ <source src="../music/choro-da-saudade.ogg" type="audio/ogg" />
+</audio>
+++++
diff --git a/src/content/en/pastebin/2021/06/22/curl-wget.adoc b/src/content/en/pastebin/2021/06/22/curl-wget.adoc
index 97f55c7..02a9744 100644
--- a/src/content/en/pastebin/2021/06/22/curl-wget.adoc
+++ b/src/content/en/pastebin/2021/06/22/curl-wget.adoc
@@ -1,4 +1,4 @@
-= "cloc: curl and wget"
+= cloc: curl and wget
`curl`:
diff --git a/src/content/en/screencast/2021/02/07/autoqemu.adoc b/src/content/en/screencast/2021/02/07/autoqemu.adoc
index b20b092..15bac9a 100644
--- a/src/content/en/screencast/2021/02/07/autoqemu.adoc
+++ b/src/content/en/screencast/2021/02/07/autoqemu.adoc
@@ -10,7 +10,6 @@
:script: https://www.man7.org/linux/man-pages/man1/script.1.html
:klaatu: https://gnuworldorder.info/
-video: true
After reading begriffs "{begriffs-tips}[Tips for stable and portable software]",
the "Begriffs Buildfarm?" section caught my attention, as this is something I
diff --git a/src/content/en/slide/2020/10/19/feature-flags.adoc b/src/content/en/slide/2020/10/19/feature-flags.adoc
index 553cf4c..360c00f 100644
--- a/src/content/en/slide/2020/10/19/feature-flags.adoc
+++ b/src/content/en/slide/2020/10/19/feature-flags.adoc
@@ -1,230 +1,8 @@
----
-# Rollout, feature flag, experiment, operational toggle
+= Rollout, feature flag, experiment, operational toggle
+:categories: presentation
+:deck: feature-flags.pdf
-@Different use cases for backend, frontend and mobile
+Different use cases for backend, frontend and mobile, and why the
+four things people call "feature flags" are not the same thing.
----
-.
-.
-.
-# "Feature flags" tend to come up when talking about continuous deployment
-
----
-.
-.
-.
-.
-@CI: continuous integration
-.
-@CD: continuous delivery
-.
-@CD: continuous deployment
-
----
-## Types
-.
-.
-.
-1. rollout
-2. feature flag
-3. experiment
-4. operational toggle
-
-% {favicon.svg}
----
-## Rollout
-
-# For *rolling out* a new version of software
-
-Short-lived using percentages
-
-% FIXME: links
-- a new deployment of kubernetes
-- new APK released to the Play Store
-
----
-## Feature flag
-
-# For turning a feature *on* or *off*
-
-Medium-lived using allow list, A/B test, percentage, app version, etc.
-
-- :new-chargeback-flow
-- :new-debit-card-activation-screen
-
----
-## Experiment
-
-# For analysing behaviour
-
-Medium-lived using allow list and A/B test
-
-- :debit-withdrawal-test
-
----
-## Operational toggle
-
-# For disabling features in #crash-like situations
-
-Long-lived using percentage
-
-- :bank-barcode-payment
-- :savings-bank-barcode-query-provider
-
----
-.
-.
-@We know know about the types
-# But they have different relevance for backend, frontend and mobile
-
----
-## backend
-.
-.
-1. rollout: k8s blue/green, canary and ~common-rollout~ common-xp
-2. feature flag: ~common-rollout~ common-xp and datasets
-3. experiment: common-xp
-4. operational toggle: ~common-rollout~ common-xp
-
----
-## frontend
-.
-.
-1. rollout: CDN and page refreshes
-2. feature flag: percentages and maybe IPs (no :customer/id on the website)
-3. experiment: via dynamic backend control
-4. operational toggle: via dynamic backend control
-
----
-## backend
-.
-.
-1. rollout: app stores
-2. feature flag: via dynamic backend control
-3. experiment: via dynamic backend control
-4. operational toggle: via dynamic backend control
-
----
-.
-.
-@Key differentiator is
-# how much *control* we have over the environment
-
----
-## backend
-# full control
-% FIXME: emoji
-% 🎉
-
----
-## frontend
-# partial control
-We choose when to make a new version available
-
----
-## mobile
-# very limited control
-- app stores can restrict updates (worse for iOS)
-- customers still have to download new versions
-
----
-# Costs
-- more complex code
-- compatibility with old app versions
-- nesting is exponential
-
----
-# Benefits
-- dynamicity
-
----
-## weighting costs × benefits
-# The less control we have, the more we value dynamicity
-
----
-## weighting costs × benefits
-.
-.
-.
-- backend: sometimes worth the cost
-- frontend: almost always worth the cost
-- mobile: *always* worth the cost
-
----
-.
-.
-.
-# Best practices
-
----
-# dynamic content > feature flag
-Always true for mobile, almost always for frontend
-
----
-# Use :include-list for named groups
-Always true for backend, frontend and mobile
-
- {:rules
- #{{:types :include-list
- :content {:filename "debit-team-members.txt"}}}}
-
----
-# Always use :app-version
-Only for mobile
-
- {:rules
- #{{:types :app-version
- :content {:min-version #{{:platform :android
- :code 1000000}
- {:platform :ios
- :code 2000000}}}}}}
-
----
-# Extend ~common-rollout~ common-xp if required
-
-That's how :include-list, :app-version, etc. were born
-
----
-# Beware of many nested feature flags
-True for backend, frontend and mobile
-
----
-# Don't delete app-facing feature flags
-True for mobile
-
----
-.
-.
-.
-# Include a feature flag on the whiteboarding phase
-
----
-.
-.
-.
-# Include deleting/retiring the feature flag at the end
-
----
-# Avoid renaming a feature flag
-Use :app-version with :min-version instead
-
----
-.
-.
-.
-# And most importantly...
-
----
-# *Always* rely on a feature flag on the app
-Never do a hotfix, avoid expedited releases at all costs
-
----
-## References
-.
-% FIXME: links
-1. "Feature Toggles (aka Feature Flags)", by Pete Hodgson
-2. "Continuous integration vs. delivery vs. deployment", by Sten Pittet
-3. Accelerate, by N. Forsgren, J. Humble and G. Kim
-4. these slides: euandre.org/slide/
-5. prose version of this presentation
-6. view source
+link:{deck}[Read the deck (PDF)].
diff --git a/src/content/en/slide/2020/10/19/feature-flags.eslaides b/src/content/en/slide/2020/10/19/feature-flags.eslaides
new file mode 100644
index 0000000..553cf4c
--- /dev/null
+++ b/src/content/en/slide/2020/10/19/feature-flags.eslaides
@@ -0,0 +1,230 @@
+---
+# Rollout, feature flag, experiment, operational toggle
+
+@Different use cases for backend, frontend and mobile
+
+---
+.
+.
+.
+# "Feature flags" tend to come up when talking about continuous deployment
+
+---
+.
+.
+.
+.
+@CI: continuous integration
+.
+@CD: continuous delivery
+.
+@CD: continuous deployment
+
+---
+## Types
+.
+.
+.
+1. rollout
+2. feature flag
+3. experiment
+4. operational toggle
+
+% {favicon.svg}
+---
+## Rollout
+
+# For *rolling out* a new version of software
+
+Short-lived using percentages
+
+% FIXME: links
+- a new deployment of kubernetes
+- new APK released to the Play Store
+
+---
+## Feature flag
+
+# For turning a feature *on* or *off*
+
+Medium-lived using allow list, A/B test, percentage, app version, etc.
+
+- :new-chargeback-flow
+- :new-debit-card-activation-screen
+
+---
+## Experiment
+
+# For analysing behaviour
+
+Medium-lived using allow list and A/B test
+
+- :debit-withdrawal-test
+
+---
+## Operational toggle
+
+# For disabling features in #crash-like situations
+
+Long-lived using percentage
+
+- :bank-barcode-payment
+- :savings-bank-barcode-query-provider
+
+---
+.
+.
+@We know know about the types
+# But they have different relevance for backend, frontend and mobile
+
+---
+## backend
+.
+.
+1. rollout: k8s blue/green, canary and ~common-rollout~ common-xp
+2. feature flag: ~common-rollout~ common-xp and datasets
+3. experiment: common-xp
+4. operational toggle: ~common-rollout~ common-xp
+
+---
+## frontend
+.
+.
+1. rollout: CDN and page refreshes
+2. feature flag: percentages and maybe IPs (no :customer/id on the website)
+3. experiment: via dynamic backend control
+4. operational toggle: via dynamic backend control
+
+---
+## backend
+.
+.
+1. rollout: app stores
+2. feature flag: via dynamic backend control
+3. experiment: via dynamic backend control
+4. operational toggle: via dynamic backend control
+
+---
+.
+.
+@Key differentiator is
+# how much *control* we have over the environment
+
+---
+## backend
+# full control
+% FIXME: emoji
+% 🎉
+
+---
+## frontend
+# partial control
+We choose when to make a new version available
+
+---
+## mobile
+# very limited control
+- app stores can restrict updates (worse for iOS)
+- customers still have to download new versions
+
+---
+# Costs
+- more complex code
+- compatibility with old app versions
+- nesting is exponential
+
+---
+# Benefits
+- dynamicity
+
+---
+## weighting costs × benefits
+# The less control we have, the more we value dynamicity
+
+---
+## weighting costs × benefits
+.
+.
+.
+- backend: sometimes worth the cost
+- frontend: almost always worth the cost
+- mobile: *always* worth the cost
+
+---
+.
+.
+.
+# Best practices
+
+---
+# dynamic content > feature flag
+Always true for mobile, almost always for frontend
+
+---
+# Use :include-list for named groups
+Always true for backend, frontend and mobile
+
+ {:rules
+ #{{:types :include-list
+ :content {:filename "debit-team-members.txt"}}}}
+
+---
+# Always use :app-version
+Only for mobile
+
+ {:rules
+ #{{:types :app-version
+ :content {:min-version #{{:platform :android
+ :code 1000000}
+ {:platform :ios
+ :code 2000000}}}}}}
+
+---
+# Extend ~common-rollout~ common-xp if required
+
+That's how :include-list, :app-version, etc. were born
+
+---
+# Beware of many nested feature flags
+True for backend, frontend and mobile
+
+---
+# Don't delete app-facing feature flags
+True for mobile
+
+---
+.
+.
+.
+# Include a feature flag on the whiteboarding phase
+
+---
+.
+.
+.
+# Include deleting/retiring the feature flag at the end
+
+---
+# Avoid renaming a feature flag
+Use :app-version with :min-version instead
+
+---
+.
+.
+.
+# And most importantly...
+
+---
+# *Always* rely on a feature flag on the app
+Never do a hotfix, avoid expedited releases at all costs
+
+---
+## References
+.
+% FIXME: links
+1. "Feature Toggles (aka Feature Flags)", by Pete Hodgson
+2. "Continuous integration vs. delivery vs. deployment", by Sten Pittet
+3. Accelerate, by N. Forsgren, J. Humble and G. Kim
+4. these slides: euandre.org/slide/
+5. prose version of this presentation
+6. view source
diff --git a/src/content/en/slide/2020/11/14/local-first-hype.adoc b/src/content/en/slide/2020/11/14/local-first-hype.adoc
index fd83115..6083dca 100644
--- a/src/content/en/slide/2020/11/14/local-first-hype.adoc
+++ b/src/content/en/slide/2020/11/14/local-first-hype.adoc
@@ -1,204 +1,8 @@
-# On "local-first"
+= On "local-first": beyond the CRDT silver bullet
+:categories: presentation
+:deck: local-first-hype.pdf
-@Beyond the CRDT silver bullet
+What local-first software asks of a system, and why conflict-free
+replicated data types answer only part of it.
----
-## Part 1
-# Exposition
-
----
-## Target
-...
-- documents
-- files
-- personal data repositories
-..
-Not: banking services, e-commerce, social networking, ride-sharing, etc.
-
----
-...
-# 7 ideals for local-first software
-
----
-...
-# 1 - no spinners: your work at your fingertips
-
----
-...
-# 2 - your work is not trapped on one device
-
----
-...
-# 3 - the network is optional
-
----
-...
-# 4 - seamless collaboration with your colleagues
-
----
-...
-# 5 - the long now
-
----
-...
-# 6 - security and privacy by default
-
----
-...
-# 7 - you retain ultimate ownership and control
-
----
-## Towards a better future
-....
-@ CRDTs (Conflict-free Replicated Data Types) as a Foundational Technology
-
----
-## Use case
-.
- # in node A and node B
- s = "Hello, World"
-
- # in node A
- s = "Hello, Alice"
-
- # in node B
- s = "Hello, Bob"
-
-How to reconcile those?
-- Hello, ABloibce
-- Hello, AliceBob
-- Hello, BobAlice
-- Hello, Alice
-\...
-
----
-# Existing CRDTs differ
-- performance
-- storage
-- compression
-- metadata overhead
-
----
-...
-# Hint towards the "automerge" CRDT
-
----
-......
-@@show comparison table, page 9
-
----
-## Part 2
-# Critique
-
----
-## Software license
-...
-@@"In our opinion, maintaining control and ownership of data does not mean that the software must necessarily be open source."
-
----
-## Example 1 - intentional restriction
-.
- #!/bin/sh
- TODAY="$(date +%s)"
- LICENSE_EXPIRATION="$(date -d 2020-10-27 +%s)"
- if [ "$TODAY" -ge "$LICENSE_EXPIRATION" ]; then
- echo 'License expired!'
- exit 1
- fi
- echo $((2 + 2))
-.
- # today
- $ ./useful-adder.sh
- 4
-
- # tomorrow
- $ ./useful-adder.sh
- License expired!
----
-## Example 2 - unintentional restriction
-.
- # today
- $ useful-program
- # ... useful output ...
-
- # tomorrow, with more data
- $ useful-program
- ERROR: Panic! Stack overflow!
-
----
-..
-# local-first *requires* free software
-
-Otherwise "The Long Now" (ideal nº5) is lost
-
----
-## Denial of existing solutions
-..
-@@"In principle it is possible to collaborate without a repository service, e.g. by sending patch files by email, but the majority of Git users rely on GitHub."
-.
-Solution: either GitHub+CRDTs or git send-email
-
----
-## Plain-text formats
-.
-@@"Git is highly optimized for code and similar line-based text file"
-.
-It even pulls software to the plain text directtion, e.g.:
-- delivery-templates
-- common-core.protocols.config
-.
-Why not exploit that more?
-
----
-## Ditching of web applications
-..
-@@"The architecture of web apps remains fundamentally server-centric
-.
-% FIXME: links
-Disagree. Contrast PouchDB with Android Instant Apps
-
----
-## Costs are underrated
-.
-- storage
-- backups
-- maintenance
-.
-Example: blog vs vlog
-
----
-## Real-time collaboration a bit overrated
-.
-It is only possible on the presence of reliable, medium-quality network connection
-..
-@@"X also works when inside an elevator, subway or plane!"
-
----
-## On CRDTs and developer experience
-.
-@@"For an app developer, how does the use of a CRDT-based data layer compare to existing storage layers like a SQL database, a filesystem, or CoreData? Is a distributed system harder to write software for?
-.
-@YES.
-.
-% FIXME: link
-See "A Note on Distributed Computing"
-
----
-## Conclusion
-.
-Why this is a "paper I love": it took offline-first and ran with it.
-.
-But a pinch of CRDT won't make the world local-first.
-.
-The tricky part is the end of the sentence: "in spite of the Cloud".
-
----
-## References
-.
-% FIXME: links
-1. "Local-First Software: You Own Your Data, in spite of the Cloud", by M. Kleppmann, A. Wiggins, P. Van Hardenberg and M. F. McGranaghan
-2. The Morning Paper article
-3. "A Note on Distributed Compiting", by J. Waldo, G. Wyant, A. Wollrath and S. Kendall
-4. these slides: euandre.org/slide/
-5. prose version of this presentation
-6. view source
+link:{deck}[Read the deck (PDF)].
diff --git a/src/content/en/slide/2020/11/14/local-first-hype.eslaides b/src/content/en/slide/2020/11/14/local-first-hype.eslaides
new file mode 100644
index 0000000..fd83115
--- /dev/null
+++ b/src/content/en/slide/2020/11/14/local-first-hype.eslaides
@@ -0,0 +1,204 @@
+# On "local-first"
+
+@Beyond the CRDT silver bullet
+
+---
+## Part 1
+# Exposition
+
+---
+## Target
+...
+- documents
+- files
+- personal data repositories
+..
+Not: banking services, e-commerce, social networking, ride-sharing, etc.
+
+---
+...
+# 7 ideals for local-first software
+
+---
+...
+# 1 - no spinners: your work at your fingertips
+
+---
+...
+# 2 - your work is not trapped on one device
+
+---
+...
+# 3 - the network is optional
+
+---
+...
+# 4 - seamless collaboration with your colleagues
+
+---
+...
+# 5 - the long now
+
+---
+...
+# 6 - security and privacy by default
+
+---
+...
+# 7 - you retain ultimate ownership and control
+
+---
+## Towards a better future
+....
+@ CRDTs (Conflict-free Replicated Data Types) as a Foundational Technology
+
+---
+## Use case
+.
+ # in node A and node B
+ s = "Hello, World"
+
+ # in node A
+ s = "Hello, Alice"
+
+ # in node B
+ s = "Hello, Bob"
+
+How to reconcile those?
+- Hello, ABloibce
+- Hello, AliceBob
+- Hello, BobAlice
+- Hello, Alice
+\...
+
+---
+# Existing CRDTs differ
+- performance
+- storage
+- compression
+- metadata overhead
+
+---
+...
+# Hint towards the "automerge" CRDT
+
+---
+......
+@@show comparison table, page 9
+
+---
+## Part 2
+# Critique
+
+---
+## Software license
+...
+@@"In our opinion, maintaining control and ownership of data does not mean that the software must necessarily be open source."
+
+---
+## Example 1 - intentional restriction
+.
+ #!/bin/sh
+ TODAY="$(date +%s)"
+ LICENSE_EXPIRATION="$(date -d 2020-10-27 +%s)"
+ if [ "$TODAY" -ge "$LICENSE_EXPIRATION" ]; then
+ echo 'License expired!'
+ exit 1
+ fi
+ echo $((2 + 2))
+.
+ # today
+ $ ./useful-adder.sh
+ 4
+
+ # tomorrow
+ $ ./useful-adder.sh
+ License expired!
+---
+## Example 2 - unintentional restriction
+.
+ # today
+ $ useful-program
+ # ... useful output ...
+
+ # tomorrow, with more data
+ $ useful-program
+ ERROR: Panic! Stack overflow!
+
+---
+..
+# local-first *requires* free software
+
+Otherwise "The Long Now" (ideal nº5) is lost
+
+---
+## Denial of existing solutions
+..
+@@"In principle it is possible to collaborate without a repository service, e.g. by sending patch files by email, but the majority of Git users rely on GitHub."
+.
+Solution: either GitHub+CRDTs or git send-email
+
+---
+## Plain-text formats
+.
+@@"Git is highly optimized for code and similar line-based text file"
+.
+It even pulls software to the plain text directtion, e.g.:
+- delivery-templates
+- common-core.protocols.config
+.
+Why not exploit that more?
+
+---
+## Ditching of web applications
+..
+@@"The architecture of web apps remains fundamentally server-centric
+.
+% FIXME: links
+Disagree. Contrast PouchDB with Android Instant Apps
+
+---
+## Costs are underrated
+.
+- storage
+- backups
+- maintenance
+.
+Example: blog vs vlog
+
+---
+## Real-time collaboration a bit overrated
+.
+It is only possible on the presence of reliable, medium-quality network connection
+..
+@@"X also works when inside an elevator, subway or plane!"
+
+---
+## On CRDTs and developer experience
+.
+@@"For an app developer, how does the use of a CRDT-based data layer compare to existing storage layers like a SQL database, a filesystem, or CoreData? Is a distributed system harder to write software for?
+.
+@YES.
+.
+% FIXME: link
+See "A Note on Distributed Computing"
+
+---
+## Conclusion
+.
+Why this is a "paper I love": it took offline-first and ran with it.
+.
+But a pinch of CRDT won't make the world local-first.
+.
+The tricky part is the end of the sentence: "in spite of the Cloud".
+
+---
+## References
+.
+% FIXME: links
+1. "Local-First Software: You Own Your Data, in spite of the Cloud", by M. Kleppmann, A. Wiggins, P. Van Hardenberg and M. F. McGranaghan
+2. The Morning Paper article
+3. "A Note on Distributed Compiting", by J. Waldo, G. Wyant, A. Wollrath and S. Kendall
+4. these slides: euandre.org/slide/
+5. prose version of this presentation
+6. view source
diff --git a/src/content/en/slide/categories.adoc b/src/content/en/slide/categories.adoc
new file mode 100644
index 0000000..feb64ff
--- /dev/null
+++ b/src/content/en/slide/categories.adoc
@@ -0,0 +1,2 @@
+= Articles by category
+:type: categories
diff --git a/src/content/en/slide/index.adoc b/src/content/en/slide/index.adoc
new file mode 100644
index 0000000..4e5b53d
--- /dev/null
+++ b/src/content/en/slide/index.adoc
@@ -0,0 +1,4 @@
+= Slides
+
+Slide decks, rendered to PDF: no browser needed to read them, and no
+JavaScript presentation framework to carry along.