{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":580788054,"defaultBranch":"main","name":"pail","ownerLogin":"web3-storage","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2022-12-21T13:00:12.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/86230656?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1713792037.0","currentOid":""},"activityList":{"items":[{"before":"a26acea204898ffd3df8eba53d61640f7d680b88","after":"dfc8ac0b70a60a27572d7d17e4362794663a99aa","ref":"refs/heads/main","pushedAt":"2024-04-22T13:20:22.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"chore(main): release 0.6.0 (#39)\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>","shortMessageHtmlLink":"chore(main): release 0.6.0 (#39)"}},{"before":"a26acea204898ffd3df8eba53d61640f7d680b88","after":"d19bc0380d877584095efaf23d373b3bdc16b2fc","ref":"refs/heads/release-please--branches--main--components--pail","pushedAt":"2024-04-22T12:48:26.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"chore(main): release 0.6.0","shortMessageHtmlLink":"chore(main): release 0.6.0"}},{"before":null,"after":"a26acea204898ffd3df8eba53d61640f7d680b88","ref":"refs/heads/release-please--branches--main--components--pail","pushedAt":"2024-04-22T12:48:25.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"feat: deterministic DAG structure (#36)\n\nThis PR changes the sharding strategy to ensure a pail DAG is deterministic in structure (provided operations do not touch the same keys) i.e. operations can be applied in any order, and they will result in the same DAG.\r\n\r\nThis makes diffing easier, and can enable pail to operate efficiently in a diff syncing environment without a merkle clock.\r\n\r\nIt also results in a significant speedup to `put` operations, due to the reduced string comparison and manipulation operations needed.\r\n\r\n```console\r\n$ node bench/put-x10_000.js \r\nsetup\r\nbench\r\n..........\r\nput x10000: 51.736s\r\n\r\n$ node bench/put-x10_000-v1.js\r\nsetup\r\nbench\r\n..........\r\nput x10000: 1.136s\r\n```\r\n\r\nWhile the strategy (and configuration) for shards has changed, the main format has not. This means that v1 can _read_ v0 but should not write to it.\r\n\r\nThe change in the sharding strategy is that instead of sharding at the back of a key (largest common prefix) when the size limit is reached, we shard at the front, using the smallest common prefix (which is always a single character) always, if a common prefix exists. This effectively ensures consistent sharding.\r\n\r\nFor example, previously when putting `aaaa` and then `aabb` we might end up with a DAG like this when the shard size is reached:\r\n\r\n```\r\naa -> aa\r\n bb\r\n```\r\n\r\nIf we then put `abbb` we might then get a DAG like:\r\n\r\n```\r\naa -> aa\r\n bb\r\nabbb\r\n```\r\n\r\n...but if `abbb` was put BEFORE `aabb` we may have ended up with a DAG like:\r\n\r\n```\r\na -> aaa\r\n abb\r\n bbb\r\n```\r\n\r\nNow we _always_ end up with a DAG like the following, because we _always_ shard when there's a common prefix, independent of the order and indepentent of shard size:\r\n\r\n```\r\na -> a -> aa\r\n bb\r\n bbb\r\n```\r\n\r\nThat is to say, there is no maximum shard size, and the max key length is now absolute, not just the point at which a shard is created.\r\n\r\nThe maximum shard size is controlled by the creator of the pail by specifying 2 options:\r\n\r\n* `keyChars` - the characters allowed in keys (default ASCII only).\r\n* `maxKeySize` - maximum size in bytes a UTF-8 encoded key is allowed to be (default 4096 bytes).\r\n\r\nA good estimate for the max size of a shard is the number of characters allowed in keys multiplied by the maximum key size. For ASCII keys of 4096 bytes the biggest possible shard will stay well within the maximum block size allowed by libp2p.\r\n\r\nNote: The default max key size is the same as `MAX_PATH` - the maximum filename+path size on most windows/unix systems so should be sifficient for most purposes.\r\n\r\nNote: even if you use unicode key characters it would still be tricky to exceed the max libp2p block size, but it is not impossible.\r\n\r\nOverall this makes pail skewed less towards quick reads and more towards quick writes. This is contrary to the original goal of the project but on balance I think worth the trade offs, in view of the DAG structure properties and the write speed increase.\r\n\r\nI discovered a bug with `removals` in the current implementation - In theory there's a chance if you put the same value to multiple keys and then update it, a shard might appear in the `removals` list that is a shard in a different part of the tree. The new version fixes this by encoding the path prefix into each shard.\r\n\r\nThe following trade offs exist:\r\n\r\n* Total DAG size is around 20% bigger.\r\n* Theres around around 8x more blocks in the DAG.\r\n* Average DAG depth (the number of blocks you need to traverse to extract a value) is now ~4 vs ~2 previously. This will have a direct impact in read speed, especially network bound reads. Mitigated somewhat by the smaller block size.\r\n\r\nHowever:\r\n\r\n* Put operations are now ~50x faster.\r\n* Average block size is 85% smaller.\r\n* The biggest shard in the DAG is now 99% smaller.\r\n* DAG structure is deterministic, which should speed up diffing","shortMessageHtmlLink":"feat: deterministic DAG structure (#36)"}},{"before":"ea2415bac277f44a8fe9cf122917c566c8873423","after":null,"ref":"refs/heads/feat/deterministic-structure","pushedAt":"2024-04-22T12:48:03.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"}},{"before":"3f90935dda9a6e22dfde191a96fc593e77ab34c6","after":"a26acea204898ffd3df8eba53d61640f7d680b88","ref":"refs/heads/main","pushedAt":"2024-04-22T12:48:00.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"feat: deterministic DAG structure (#36)\n\nThis PR changes the sharding strategy to ensure a pail DAG is deterministic in structure (provided operations do not touch the same keys) i.e. operations can be applied in any order, and they will result in the same DAG.\r\n\r\nThis makes diffing easier, and can enable pail to operate efficiently in a diff syncing environment without a merkle clock.\r\n\r\nIt also results in a significant speedup to `put` operations, due to the reduced string comparison and manipulation operations needed.\r\n\r\n```console\r\n$ node bench/put-x10_000.js \r\nsetup\r\nbench\r\n..........\r\nput x10000: 51.736s\r\n\r\n$ node bench/put-x10_000-v1.js\r\nsetup\r\nbench\r\n..........\r\nput x10000: 1.136s\r\n```\r\n\r\nWhile the strategy (and configuration) for shards has changed, the main format has not. This means that v1 can _read_ v0 but should not write to it.\r\n\r\nThe change in the sharding strategy is that instead of sharding at the back of a key (largest common prefix) when the size limit is reached, we shard at the front, using the smallest common prefix (which is always a single character) always, if a common prefix exists. This effectively ensures consistent sharding.\r\n\r\nFor example, previously when putting `aaaa` and then `aabb` we might end up with a DAG like this when the shard size is reached:\r\n\r\n```\r\naa -> aa\r\n bb\r\n```\r\n\r\nIf we then put `abbb` we might then get a DAG like:\r\n\r\n```\r\naa -> aa\r\n bb\r\nabbb\r\n```\r\n\r\n...but if `abbb` was put BEFORE `aabb` we may have ended up with a DAG like:\r\n\r\n```\r\na -> aaa\r\n abb\r\n bbb\r\n```\r\n\r\nNow we _always_ end up with a DAG like the following, because we _always_ shard when there's a common prefix, independent of the order and indepentent of shard size:\r\n\r\n```\r\na -> a -> aa\r\n bb\r\n bbb\r\n```\r\n\r\nThat is to say, there is no maximum shard size, and the max key length is now absolute, not just the point at which a shard is created.\r\n\r\nThe maximum shard size is controlled by the creator of the pail by specifying 2 options:\r\n\r\n* `keyChars` - the characters allowed in keys (default ASCII only).\r\n* `maxKeySize` - maximum size in bytes a UTF-8 encoded key is allowed to be (default 4096 bytes).\r\n\r\nA good estimate for the max size of a shard is the number of characters allowed in keys multiplied by the maximum key size. For ASCII keys of 4096 bytes the biggest possible shard will stay well within the maximum block size allowed by libp2p.\r\n\r\nNote: The default max key size is the same as `MAX_PATH` - the maximum filename+path size on most windows/unix systems so should be sifficient for most purposes.\r\n\r\nNote: even if you use unicode key characters it would still be tricky to exceed the max libp2p block size, but it is not impossible.\r\n\r\nOverall this makes pail skewed less towards quick reads and more towards quick writes. This is contrary to the original goal of the project but on balance I think worth the trade offs, in view of the DAG structure properties and the write speed increase.\r\n\r\nI discovered a bug with `removals` in the current implementation - In theory there's a chance if you put the same value to multiple keys and then update it, a shard might appear in the `removals` list that is a shard in a different part of the tree. The new version fixes this by encoding the path prefix into each shard.\r\n\r\nThe following trade offs exist:\r\n\r\n* Total DAG size is around 20% bigger.\r\n* Theres around around 8x more blocks in the DAG.\r\n* Average DAG depth (the number of blocks you need to traverse to extract a value) is now ~4 vs ~2 previously. This will have a direct impact in read speed, especially network bound reads. Mitigated somewhat by the smaller block size.\r\n\r\nHowever:\r\n\r\n* Put operations are now ~50x faster.\r\n* Average block size is 85% smaller.\r\n* The biggest shard in the DAG is now 99% smaller.\r\n* DAG structure is deterministic, which should speed up diffing","shortMessageHtmlLink":"feat: deterministic DAG structure (#36)"}},{"before":"cae1621ad8a8dd219678f59a8b7b187fde3ba53c","after":"ea2415bac277f44a8fe9cf122917c566c8873423","ref":"refs/heads/feat/deterministic-structure","pushedAt":"2024-04-22T12:46:16.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"feat: implement batching and cleanup","shortMessageHtmlLink":"feat: implement batching and cleanup"}},{"before":"df640b16a4db8baf8be3c517252cd71d037e5e58","after":"cae1621ad8a8dd219678f59a8b7b187fde3ba53c","ref":"refs/heads/feat/deterministic-structure","pushedAt":"2024-03-27T17:48:00.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"fix: entries range","shortMessageHtmlLink":"fix: entries range"}},{"before":"8e697b56881c9909eacddaa384833239a5ff557d","after":"df640b16a4db8baf8be3c517252cd71d037e5e58","ref":"refs/heads/feat/deterministic-structure","pushedAt":"2024-03-27T16:32:35.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"fix: undefined or null options","shortMessageHtmlLink":"fix: undefined or null options"}},{"before":"d9ffcfa5e99405b5787b932cfd22051c230a6823","after":"8e697b56881c9909eacddaa384833239a5ff557d","ref":"refs/heads/feat/deterministic-structure","pushedAt":"2024-03-27T15:39:27.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"fix: key range","shortMessageHtmlLink":"fix: key range"}},{"before":"373e48594b508a97d067e4b3110e545d66a788d7","after":"d9ffcfa5e99405b5787b932cfd22051c230a6823","ref":"refs/heads/feat/deterministic-structure","pushedAt":"2024-03-27T10:40:20.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"feat: add lt and lte entries option","shortMessageHtmlLink":"feat: add lt and lte entries option"}},{"before":"9b9a698a851bfb2a7142c67c0a8ea44fa552397e","after":null,"ref":"refs/heads/release-please--branches--main--components--pail","pushedAt":"2024-03-19T09:41:02.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"}},{"before":"444ccd79e8d99fcc06b7528344aab683dcc3341c","after":"3f90935dda9a6e22dfde191a96fc593e77ab34c6","ref":"refs/heads/main","pushedAt":"2024-03-19T09:40:59.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"chore(main): release 0.5.0 (#38)\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>","shortMessageHtmlLink":"chore(main): release 0.5.0 (#38)"}},{"before":"444ccd79e8d99fcc06b7528344aab683dcc3341c","after":"9b9a698a851bfb2a7142c67c0a8ea44fa552397e","ref":"refs/heads/release-please--branches--main--components--pail","pushedAt":"2024-03-19T09:40:09.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"chore(main): release 0.5.0","shortMessageHtmlLink":"chore(main): release 0.5.0"}},{"before":null,"after":"444ccd79e8d99fcc06b7528344aab683dcc3341c","ref":"refs/heads/release-please--branches--main--components--pail","pushedAt":"2024-03-19T09:40:08.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"feat: filter entries with keys greater than this string (#37)","shortMessageHtmlLink":"feat: filter entries with keys greater than this string (#37)"}},{"before":"45ff31624fde78218ab95ff6dbaa2b0abb72ff83","after":null,"ref":"refs/heads/feat/entries-gt-gte","pushedAt":"2024-03-19T09:39:50.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"}},{"before":"9f32fb097f3ab029ba4767e8f5bbb255a01468ab","after":"444ccd79e8d99fcc06b7528344aab683dcc3341c","ref":"refs/heads/main","pushedAt":"2024-03-19T09:39:47.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"feat: filter entries with keys greater than this string (#37)","shortMessageHtmlLink":"feat: filter entries with keys greater than this string (#37)"}},{"before":null,"after":"45ff31624fde78218ab95ff6dbaa2b0abb72ff83","ref":"refs/heads/feat/entries-gt-gte","pushedAt":"2024-03-18T22:15:30.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"feat: filter entries with keys greater than this string","shortMessageHtmlLink":"feat: filter entries with keys greater than this string"}},{"before":"371fef224e65d547237add94d633e4fe183b3fc6","after":"373e48594b508a97d067e4b3110e545d66a788d7","ref":"refs/heads/feat/deterministic-structure","pushedAt":"2024-03-18T21:34:23.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"fix: tweaks","shortMessageHtmlLink":"fix: tweaks"}},{"before":"e51671ca86cc3336a9f4b053038af5056b0b0413","after":"371fef224e65d547237add94d633e4fe183b3fc6","ref":"refs/heads/feat/deterministic-structure","pushedAt":"2024-03-12T11:12:11.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"test: add tests","shortMessageHtmlLink":"test: add tests"}},{"before":null,"after":"e51671ca86cc3336a9f4b053038af5056b0b0413","ref":"refs/heads/feat/deterministic-structure","pushedAt":"2024-03-11T15:38:56.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"feat: deterministic DAG structure","shortMessageHtmlLink":"feat: deterministic DAG structure"}},{"before":"f2e8cb856351a2ed163d46b6f96889ae3050d530","after":null,"ref":"refs/heads/release-please--branches--main--components--pail","pushedAt":"2024-02-10T14:22:17.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"}},{"before":"3ef028ac5b9cfb4f59830c7b496f03a187841414","after":"9f32fb097f3ab029ba4767e8f5bbb255a01468ab","ref":"refs/heads/main","pushedAt":"2024-02-10T14:22:14.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"chore(main): release 0.4.2 (#35)\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>","shortMessageHtmlLink":"chore(main): release 0.4.2 (#35)"}},{"before":"3ef028ac5b9cfb4f59830c7b496f03a187841414","after":"f2e8cb856351a2ed163d46b6f96889ae3050d530","ref":"refs/heads/release-please--branches--main--components--pail","pushedAt":"2024-02-10T14:21:10.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"chore(main): release 0.4.2","shortMessageHtmlLink":"chore(main): release 0.4.2"}},{"before":null,"after":"3ef028ac5b9cfb4f59830c7b496f03a187841414","ref":"refs/heads/release-please--branches--main--components--pail","pushedAt":"2024-02-10T14:21:09.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"fix: traversal optimization when checking if x contains y (#34)\n\n* continue if seen\r\n\r\n* test for contains seen\r\n\r\n* new clock test to fail without optimization\r\n\r\n* formatter\r\n\r\n* test name\r\n\r\n* more realistic forking?\r\n\r\n* refactor: simplify test\r\n\r\n---------\r\n\r\nCo-authored-by: Chris Anderson \r\nCo-authored-by: valorant-dhruv <78591597+valorant-dhruv@users.noreply.github.com>","shortMessageHtmlLink":"fix: traversal optimization when checking if x contains y (#34)"}},{"before":"8f07b62f754c89b58f816e682ef178e418e0efc5","after":null,"ref":"refs/heads/contains-seen","pushedAt":"2024-02-10T14:20:52.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"}},{"before":"bfe30a53d6d15b8057e2fad2110dcbfbd0ab372d","after":"3ef028ac5b9cfb4f59830c7b496f03a187841414","ref":"refs/heads/main","pushedAt":"2024-02-10T14:20:49.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"fix: traversal optimization when checking if x contains y (#34)\n\n* continue if seen\r\n\r\n* test for contains seen\r\n\r\n* new clock test to fail without optimization\r\n\r\n* formatter\r\n\r\n* test name\r\n\r\n* more realistic forking?\r\n\r\n* refactor: simplify test\r\n\r\n---------\r\n\r\nCo-authored-by: Chris Anderson \r\nCo-authored-by: valorant-dhruv <78591597+valorant-dhruv@users.noreply.github.com>","shortMessageHtmlLink":"fix: traversal optimization when checking if x contains y (#34)"}},{"before":null,"after":"8f07b62f754c89b58f816e682ef178e418e0efc5","ref":"refs/heads/contains-seen","pushedAt":"2024-02-10T14:18:36.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"refactor: simplify test","shortMessageHtmlLink":"refactor: simplify test"}},{"before":"c4eab3323780ce95d2593b19572741711759e6ca","after":null,"ref":"refs/heads/release-please--branches--main--components--pail","pushedAt":"2024-01-25T11:57:07.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"}},{"before":"7c327d48ad60038f61336a006289364fda94a40d","after":"bfe30a53d6d15b8057e2fad2110dcbfbd0ab372d","ref":"refs/heads/main","pushedAt":"2024-01-25T11:57:04.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"alanshaw","name":"Alan Shaw","path":"/alanshaw","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/152863?s=80&v=4"},"commit":{"message":"chore(main): release 0.4.1 (#32)\n\nCo-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>","shortMessageHtmlLink":"chore(main): release 0.4.1 (#32)"}},{"before":"133df31b6170eedfaf23eaa067e6f4654ce05bf9","after":"c4eab3323780ce95d2593b19572741711759e6ca","ref":"refs/heads/release-please--branches--main--components--pail","pushedAt":"2024-01-25T11:55:48.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"github-actions[bot]","name":null,"path":"/apps/github-actions","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/15368?s=80&v=4"},"commit":{"message":"chore(main): release 0.4.1","shortMessageHtmlLink":"chore(main): release 0.4.1"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAENwlPYAA","startCursor":null,"endCursor":null}},"title":"Activity ยท web3-storage/pail"}