profile
viewpoint
If you are wondering where the data of this site comes from, please visit https://api.github.com/users/HerbCaudill/events. GitMemory does not store any data, but only uses NGINX to cache data for a period of time. The idea behind GitMemory is simply to give users a better reading experience.
Herb Caudill HerbCaudill DevResults Barcelona devresults.com Software for human beings. Global development. Cities. Tools for thinking. RPCV. CEO & founder, @DevResults.

covidatlas/coronadatascraper 374

COVID-19 Coronavirus data scraped from government and curated data sources.

HerbCaudill/crdx 2

CRDTs meet Redux: Conflict-free, replicated, principled state management

HerbCaudill/ahk-scripts 0

My AutoHotKey scripts

HerbCaudill/appsync-todos 0

Following tutorial at https://github.com/awslabs/aws-mobile-appsync-sdk-js/tree/master/tutorials/react-offline-realtime-todos

HerbCaudill/automerge 0

A JSON-like data structure (a CRDT) that can be modified concurrently by different users, and merged again automatically.

push eventHerbCaudill/hc3.me

HerbCaudill

commit sha 3de96745a81fc1b95631924150258110f7f00c04

content/posts/20210228-establishing-trust-in-a-world-without-servers.md:

view details

push time in 6 days

push eventHerbCaudill/hc3.me

HerbCaudill

commit sha 511f860df58f45c5b2761fb1a2e0e8f90fa48292

content/posts/20210228-establishing-trust-in-a-world-without-servers.md:

view details

push time in 6 days

push eventHerbCaudill/hc3.me

HerbCaudill

commit sha fe2a49720a98ef239488937dbb6b564d749154e4

latest

view details

push time in 6 days

issue commentautomerge/automerge

Claims-based authorization

Apologies for weighing in six weeks after the fact (I was offline for a while), and also apologies for repeatedly spamming this repo to talk about a different library! 😬

I've been working almost exclusively on this problem for the last 18 months or so. Some thoughts:

I don't think it makes sense to try to solve this within Automerge. Instead, I'd suggest determining identity (authentication) and permissions (authorization) elsewhere, and then using that information to inform who you're willing to talk to, and what changes from them you're willing to accept.*

The best solutions I've found for purely peer-to-peer authentication & authorization are applied in a library I've been working on that I think is almost ready to release: localfirst/auth. In brief,

  • Authorization is determined via a chain of permission grants that can be traced back to the group's founder (or document author). No consensus is required, byzantine or otherwise; neither is a central server.
  • Authentication is done using signature challenges (here's some data that includes a random element, sign it with your private key and we'll check it against your public key to know if it's really you).
  • The history of the group (invitations, role assignments, removals, key changes, etc.) is recorded in a directed acyclic graph (DAG) of signed, hash-chained actions that we call a "signature chain".
  • Each device generates its own private keys that never leave that device. Public keys are recorded on the signature chain.

There's lots more interesting stuff: How do you securely invite someone to your group? How do you handle potentially conflicting concurrent membership changes? How do you enforce read permissions? For answers to these questions and so much more, please see this (draft) blog post.


*If someone makes an invalid change (e.g. one they don't have permission to make), the most straightforward solution is to refuse to merge with them until their document is back in a valid state. To continue @pvh's analogy, I'm free to edit my copy of the city's building codes on my own computer. However, I shouldn't reasonably expect anyone to pay attention to my copy, and I also shouldn't expect to be able to cleanly merge in an updated version of the official codes.

MeneDev

comment created time in 6 days

issue openedprettier/prettier

Unexpected indentation of comment prior to array destructuring

Prettier 2.4.1 Playground link <!-- prettier-ignore -->

--parser babel
--no-semi

Input: <!-- prettier-ignore -->

{
  let foo 

  // comment
  ;[foo] = [1]
}

Output: <!-- prettier-ignore -->

{
  let foo

    // comment
  ;[foo] = [1]
}

(Note that the comment is indented one extra level.)

Expected behavior: <!-- prettier-ignore -->

{
  let foo 

  // comment
  ;[foo] = [1]
}

This is clearly a weird edge case, and depends on the let foo not having a value: If you change it to let foo = 42 it formats as expected.

created time in 8 days

push eventHerbCaudill/crdx

HerbCaudill

commit sha 908ead2ed72111beb3cbefd4e537316406f0c5e5

store/Store.ts:

view details

HerbCaudill

commit sha fc4dc147c56f9eeebc8e2ed6be55636a5e83043d

StoreOptions to own file

view details

push time in 12 days

push eventHerbCaudill/crdx

HerbCaudill

commit sha c83a911e13d1598b5c9b18f59541e2e3e4abe8cc

README.md: update

view details

HerbCaudill

commit sha 1592774ced19da8bfaf54079e9d0175ec1e426b9

_test/store/counter.test.ts: simplify

view details

HerbCaudill

commit sha 8142617d89571f5c6ab00694fb4481366b404eb1

_test/store/scrabble.test.ts:

view details

HerbCaudill

commit sha 56b387b7c5a8ae8d002f92bc0610b726f8d9b0f9

_test/store/scheduler.test.ts: create

view details

HerbCaudill

commit sha 715cf7f1e9c72d2a79d9886018fb42260a2bdc1c

replace resolver with filter

view details

HerbCaudill

commit sha b20c6bee8dc81eab3cc3082a5c2deee659fe1e42

store/createStore.ts: use resolver

view details

HerbCaudill

commit sha 08e9b80c6fd90c7326554a98983c691be4ddb88d

_test/chain/getSequence.test.ts: resolver

view details

HerbCaudill

commit sha 2ab30cffb5409efa0d2ccdea0f97d1117a40c67e

chain/getSequence.ts: replace sequencer with resolver

view details

HerbCaudill

commit sha b7dbdbe2f2814e5585bbe8de87ae4ef4e3bf28a6

collapse filter & sequencer into resolver

view details

HerbCaudill

commit sha 14d2178489d03bee854359de18c3efe523d5b3fc

chain/getSequence.ts:

view details

HerbCaudill

commit sha 0d70735f26d198c7fdd46f8fa5beb909b65565c9

_test/store/scheduler.test.ts: conflicts resolved correctly

view details

HerbCaudill

commit sha 427c97c1ad5bc3dd0c7f74bb0cfb3000f66363b4

_test/store/scheduler.test.ts:

view details

HerbCaudill

commit sha a4ae062df13afb06dbb4d84b96c18869c6e6e710

_test/store/scheduler.test.ts: refactor

view details

HerbCaudill

commit sha e634b96b1910d63649be826b5c4b0d3257a787a9

_test/store/scheduler.test.ts:

view details

HerbCaudill

commit sha d62b6ac2bb705a9de757825664a073fa0820a298

_test/store/scheduler.test.ts:

view details

HerbCaudill

commit sha 1204f714399c0515354093487a69bc43a55e82ab

chain/baseResolver.ts:

view details

HerbCaudill

commit sha 25d414cea8778981ab557819fb6f14df677c61e8

constants.ts:

view details

HerbCaudill

commit sha 0c06bf5597128b829241fc364ea4e66438a1128d

.vscode/settings.json:

view details

HerbCaudill

commit sha c93ea0ea026ec37e9c99ea8a3e86c5f8675819aa

README.md: update

view details

HerbCaudill

commit sha 4a0ef82e5aad5ebe75dd24ede367346d6d803bc7

_test/store/scheduler.test.ts:

view details

push time in 12 days

push eventHerbCaudill/scrabbleattacks

HerbCaudill

commit sha 4ef37076c6a43f3a69e511358cf904d11ebf4b1c

cleanup, add useKeyboard

view details

HerbCaudill

commit sha 7d5ead9267fb07dc7d1cb8ec1996dfdf394e2dc9

components/Board.tsx:

view details

HerbCaudill

commit sha 0aee0e2426b41da3a07a29dbb904afc8bdc7a251

components/Game.tsx:

view details

HerbCaudill

commit sha 0be49d9c1da0172b56ab8ff0e4dc7fd75f41f77c

components/Side.tsx:

view details

HerbCaudill

commit sha 06faa2a8ed43e98dee598accb7dedada758dd24a

components/Side.tsx:

view details

HerbCaudill

commit sha 6f870b7e51343f58e9c7b5f55e06ab1cb24a013f

components/Game.tsx:

view details

HerbCaudill

commit sha f8f47fbcd0be3ea48adba7e7d8d5df3a44238542

reducer, useKeyboard

view details

HerbCaudill

commit sha 98ff9f6f08dcae74a2d7b3aec02ab4e7b7310d7c

backspace

view details

HerbCaudill

commit sha cda53afacd1c1e876263596f7cafc645282d11d5

components/Game.tsx:

view details

HerbCaudill

commit sha 10daca681ee6123a0dcb8a9daf066056bc81a16a

README.md: update

view details

push time in 16 days

issue commentautomerge/automerge

Ignoring vs. undoing/correcting vs. applying updates for security and application domain logic?

I see this as a two separate questions:

  • Permissions: You can avoid the need for consensus mechanisms by having authority flow from the creator of the group. I've been tinkering for a while on a library called localfirst/auth that implements this idea. This (draft) blog post explains the thinking behind this library in more detail.

  • Domain-specific conflict resolution: When I started working on localfirst/auth, I assumed I'd use Automerge to record and sync group membership state. But in this domain, "conflict" means something more than "modified the same property." For example, if Bob adds Charlie and concurrently Alice removes Bob, that's a conflict. And the way that conflict is resolved is very specific (Bob's addition of Charlie needs to be discarded). And so on: What if two people remove each other, etc. So I built what ended up being a generic CRDT engine that can work with any domain's semantics and rules; it's basically a Redux-like store but with a hook for conflict-resolution rules so it can be replicated across peers. I've pulled this machinery out into its own library, which I'm calling CRDX.

These are both works in progress - please don't use for anything real until they're released as the APIs might still change - but hopefully the thinking behind them is useful for what you're doing.

jjlee

comment created time in 18 days

push eventHerbCaudill/crdx

HerbCaudill

commit sha a21b95a27a246ff988135003614f94a2f4824a56

v0.1.4

view details

HerbCaudill

commit sha eed24718e28b3356c8bfacec31f7f903544352ea

refactor all the things ✅

view details

HerbCaudill

commit sha c91ee9373b1be022d9681947e408db7f5368a04f

v0.1.5

view details

HerbCaudill

commit sha 00ced9e30a0de048b1358a72ee5e3e04a1f20fbc

add context everywhere

view details

HerbCaudill

commit sha 7d3073b9e4e03d953471b5d509978e8562d90eb8

README.md: update

view details

HerbCaudill

commit sha a5d4770fc4e4351848673bdfe20d18705e9251c6

change append signature

view details

HerbCaudill

commit sha d87a64132eef4f45896a9f2c54a55a478cfa6b46

chain/types.ts:

view details

push time in 18 days

push eventHerbCaudill/crdx

HerbCaudill

commit sha 1fed7ec3dafa8471eed9ce7d47699e4093299c70

README.md: update

view details

push time in 2 months

push eventlocal-first-web/auth

HerbCaudill

commit sha 981641998ec66108e74976f65fa34b07647e04ef

auth/sync/sync.test.ts:

view details

HerbCaudill

commit sha ab78711de1cd0f31ca1cedef7a8c2f37ee0e6224

new assets

view details

HerbCaudill

commit sha e1d50864fad8bd9bacbe1739bf594b58f34fc4e4

bump crypto

view details

HerbCaudill

commit sha 9413d920317aa911865d5630c934c2c338e8ab97

base58

view details

push time in 2 months

push eventHerbCaudill/crypto

HerbCaudill

commit sha 7faecebc4f0fc93fb5196af95d5028988d03e967

v0.1.13

view details

HerbCaudill

commit sha bc27b173cd136ae3a4473450d8531cc12b980e6d

use scrypt-js

view details

HerbCaudill

commit sha d4b69e1d8c54ab28b970bb1a5715fee14f367510

v0.1.14

view details

HerbCaudill

commit sha 72f21fd4072fb5789705ad10e77f0d3d08a6aff5

use base58

view details

HerbCaudill

commit sha b3f841a1b51d249bb5d9a5a25b4864acaed2a38d

package.json:

view details

HerbCaudill

commit sha 8cef6f1c809c4c14976885219bd29ea6a8cdbf2c

get rid of circular dependencies

view details

push time in 2 months

push eventlocal-first-web/auth

HerbCaudill

commit sha 7fa26a5fc2a70d1f807c213e21b099cf7bcbe8e1

demo/components/Chooser.tsx:

view details

HerbCaudill

commit sha e95fa329641ad84c94ae7345c09722eda1763bcf

auth/chain/membershipResolver.ts:

view details

HerbCaudill

commit sha 0f49dc1794f8294c8a8e04df9d59a1083c677b2e

auth/connection/Connection.ts:

view details

HerbCaudill

commit sha 86a10820c6535d940ba0df03767ba5b6e2f5e94b

auth/connection/encryption.test.ts:

view details

HerbCaudill

commit sha c2801f5e6956027d0691bb0de6d15f7b3ae49b66

auth/sync/generateMessage.ts:

view details

HerbCaudill

commit sha d3c07187e239801ae87ac19f6792a7a7da5e3d5d

auth/team/reducers/changeDeviceKeys.ts:

view details

HerbCaudill

commit sha f9aa4aeb7e4b80beee72ea4085f88df6d8379bb0

auth/team/reducers/changeMemberKeys.ts:

view details

HerbCaudill

commit sha c3c466a5ca59e1c848b92724f990fccf8751f49b

auth/team/selectors/keys.ts:

view details

HerbCaudill

commit sha 1120eac38275577336a067e03d24d6bcd9d21dd6

auth/team/validate.ts:

view details

HerbCaudill

commit sha e47ee9ff91411c69628577f6cbc182e21adee617

auth/util/truncateHashes.ts:

view details

HerbCaudill

commit sha 2e08f2d488e0d61d681c217f49ab306f2d98ab18

bump cypress

view details

HerbCaudill

commit sha dd7653bfd5027ce3171572bfc1abe14be0b06c7a

auth/util/debug.ts:

view details

HerbCaudill

commit sha 960448d7d07f971b03a646ec00347c8303ab4771

auth/sync/sync.test.ts:

view details

HerbCaudill

commit sha ed92bc4bc45f6c629c2fec2a39350d0c1e84811f

auth/sync/TruncatedHashFilter.test.ts: use strings

view details

HerbCaudill

commit sha 7c2407e3098ad8e5daad20ae288742bbdd233db9

auth/util/testing/Network.ts: types

view details

HerbCaudill

commit sha bb24e7cdeac9140b35733581bbd3584744fd4d91

tsconfig.json: remove nonexistent path

view details

HerbCaudill

commit sha 9f9b5dec2500687d7cb48b7ce298b10438d0196a

add demo to packages

view details

HerbCaudill

commit sha f85e801f33788da626c8a1c3c351e7b30a83daff

demo/tailwind.config.js: add index.html

view details

HerbCaudill

commit sha 10434f174dd51c35375153072aebd235bad69a99

react/package.json:

view details

HerbCaudill

commit sha a07797ab5be72e9ebc57439366b59dbe00b7342f

auth/package.json: tscpaths postbuild

view details

push time in 2 months

push eventHerbCaudill/crdx

HerbCaudill

commit sha 5769bdc9d53e9c26478aeec9c62ab6cfd6e9ed65

README.md: update

view details

push time in 2 months

push eventHerbCaudill/crdx

HerbCaudill

commit sha 246a96392a766a03ebb698a4c36e7081df3f87c2

README.md: update

view details

push time in 2 months

push eventHerbCaudill/crdx

HerbCaudill

commit sha 9da54d8ee4659211b46d70f4f5fcfdcc24b22f3d

v0.1.2

view details

HerbCaudill

commit sha 084ada65dafef73714570c48d458c618b55e939e

v0.1.3

view details

HerbCaudill

commit sha 1e95e855e628bb6e7d6ea663f6e22455837d4d8e

README.md: update

view details

push time in 2 months

push eventHerbCaudill/crdx

HerbCaudill

commit sha b46f1cacba1f6f235601135c9ab632d644413a52

v0.1.1

view details

HerbCaudill

commit sha 28b700ab195f295bd30c23cd6c8d9c291ba14007

README.md: update

view details

push time in 2 months

push eventHerbCaudill/crdx

HerbCaudill

commit sha c54c113021e9ec62cf62967126be495c97a78ca6

_test/store/scrabble.test.ts:

view details

HerbCaudill

commit sha dd394b9e97b2e4d65dffde41dfe1e9bb5ab7eeed

_test/store/scrabble.test.ts:

view details

HerbCaudill

commit sha 32886d23ee740ac89f7f264666bbae8ee873c6ec

_test/store/scrabble.test.ts:

view details

HerbCaudill

commit sha babfe71e093c49619a1e192ab741738b670562ff

docs

view details

push time in 2 months

push eventHerbCaudill/crdx

HerbCaudill

commit sha 8c638312301d306a81af8e0fcf868129e777d746

_test/store/store.test.ts:

view details

HerbCaudill

commit sha a1f9981f951be7ab6baa469e14e9cb6c73746ab0

introducing scrabble attacks

view details

HerbCaudill

commit sha 2fedee3830b3e1eb93ddcdfee3a58d2eb753b843

_test/store/scrabble.test.ts: concurrent changes, no conflict

view details

push time in 2 months

push eventHerbCaudill/crdx

HerbCaudill

commit sha 64fdae6f1d9dd6df5c3fad74bf90c952fbadb790

chain/getSequence.ts:

view details

HerbCaudill

commit sha d20adf1c1875b68031753d5690101204cfaaa0e2

chain/baseResolver.ts: create

view details

HerbCaudill

commit sha d93e7ae6b3b136fe53923eb30b16024201f1fc2f

chain: fix imports

view details

HerbCaudill

commit sha 415300c042df363293fa328f8be18d78bbcdc8a7

store validation

view details

HerbCaudill

commit sha 7408a9b5e3d1af8e805851139ac53e5990c588a5

_test/store/store.test.ts:

view details

HerbCaudill

commit sha 1b20248ce343ac021e42918f6a8b29c5f3082d8b

_test/store/store.test.ts:

view details

HerbCaudill

commit sha e457cb15143eb6db03f51a3eb9cf232b3b02014f

store/createStore.ts:

view details

HerbCaudill

commit sha f5b104b053bce7fa833bb02276fc3fd9a93f8b52

merge ✅

view details

HerbCaudill

commit sha ffa586c8e5ce203e24e909303d8595107d094f32

_test/store/store.test.ts:

view details

push time in 2 months

push eventHerbCaudill/crdx

HerbCaudill

commit sha cc152ae4baa4a2c8f9b98b855cfcbb9e4b4d9343

more counter tests ✅

view details

HerbCaudill

commit sha 3e09e7913b0c65f47a67790b54a8877cbdecdafb

store/createStore.ts: consistent imports

view details

push time in 2 months

push eventHerbCaudill/crdx

HerbCaudill

commit sha c0d44cfc62a65290047d6cc622401e7b5e6d41f5

cleanup

view details

HerbCaudill

commit sha 0d245a806d508c53beff59817e4fcd8a18e654b8

tsdx.config.js:

view details

HerbCaudill

commit sha 6619af505d199ec570c14d071db9d721cceb527d

replace ramda w lodash

view details

HerbCaudill

commit sha 2682c8e1ae4f096c64c11bbef726e0c8e12a1038

cleanup

view details

HerbCaudill

commit sha e1a6493fdf573f88279a73de44a029f465966bae

upgrade jest, ts-jest

view details

HerbCaudill

commit sha 54ea881aeaef96a5c00f9005553bb291c9ad139f

redundant dependency

view details

HerbCaudill

commit sha 5dd814a6358688aeeb113a6967802d36dedac40d

unused dep

view details

HerbCaudill

commit sha 056135f51a745fda06253c6838b9e27a1137486a

store: counter test passing ✅

view details

push time in 2 months

push eventHerbCaudill/crdx

HerbCaudill

commit sha a2256a406d6e82c5ffc0cbe6773d046e968e5874

cleanup

view details

HerbCaudill

commit sha e9c10a4a5bec8d18846fc2f8c63c3af0b2984946

cleanup

view details

push time in 2 months

create barnchHerbCaudill/crdx

branch : master

created branch time in 2 months

created repositoryHerbCaudill/crdx

created time in 2 months

create barnchlocal-first-web/auth

branch : vite

created branch time in 3 months