{ "views": { "home": "/", "search": "/?q=t", "start": "/start", "profile": "/alice.test", "profile-fork": "/bob.test", "repository": "/alice.test/tally", "directory": "/alice.test/tally/tree/main/src", "file": "/alice.test/tally/blob/main/src/lib.rs", "markdown": "/alice.test/tally/blob/main/README.md", "image": "/alice.test/tally/blob/main/assets/logo.svg", "commits": "/alice.test/tally/commits/main", "commit": "/alice.test/tally/commit/97727c2c19d5d8b3849b2ed9ad47130cee9798f5", "pulls": "/alice.test/tally/pulls", "pulls-closed": "/alice.test/tally/pulls?state=closed", "pull": "/alice.test/tally/pull/did:plc:6jyayarzmhqfvz4w4tgj4xes/3mygjq5dbkkmg", "pull-open": "/alice.test/tally/pull/did:plc:6jyayarzmhqfvz4w4tgj4xes/3mygjq7w6et2x", "issues": "/alice.test/tally/issues", "issues-closed": "/alice.test/tally/issues?state=closed", "issue": "/alice.test/tally/issue/did:plc:6jyayarzmhqfvz4w4tgj4xes/3mygjqa2suo32", "issue-closed": "/alice.test/tally/issue/did:plc:6jyayarzmhqfvz4w4tgj4xes/3mygjqa7nqp4u", "fork": "/bob.test/tally", "empty": "/alice.test/scratch", "missing": "/alice.test/tally/blob/main/nowhere" }, "answers": { "/_data/alice.test": { "status": 200, "headers": { "content-type": "application/json", "cache-control": "no-cache" }, "body": "{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"Alice Moreau\",\"bio\":\"Small tools for text. Writes tally.\",\"avatar\":null,\"about\":\"Small tools for text. Writes tally.\",\"repos\":[{\"owner\":\"alice.test\",\"avatar\":null,\"name\":\"scratch\",\"description\":null,\"forkOf\":null,\"createdAt\":\"2026-10-09T13:42:00.000Z\",\"private\":false},{\"owner\":\"alice.test\",\"avatar\":null,\"name\":\"notes\",\"description\":\"Scratch notes 📝\",\"forkOf\":null,\"createdAt\":\"2026-10-09T11:51:00.000Z\",\"private\":false},{\"owner\":\"alice.test\",\"avatar\":null,\"name\":\"tally\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":null,\"createdAt\":\"2026-10-09T10:00:00.000Z\",\"private\":false}]}" }, "/_data/alice.test/scratch": { "status": 200, "headers": { "content-type": "application/json", "cache-control": "no-cache" }, "body": "{\"repo\":{\"authority\":\"alice.test\",\"avatar\":null,\"name\":\"scratch\",\"description\":null,\"forkOf\":null,\"head\":\"main\",\"pulls\":0,\"issues\":0,\"about\":\"A git repository in alice.test's atmosphere account.\",\"card\":\"/alice.test/scratch/card.png?v=93262b63e081657c\"},\"rev\":\"main\",\"path\":\"\",\"empty\":true,\"last\":null,\"entries\":[],\"readme\":null}" }, "/_data/alice.test/tally": { "status": 200, "headers": { "content-type": "application/json", "cache-control": "no-cache" }, "body": "{\"repo\":{\"authority\":\"alice.test\",\"avatar\":null,\"name\":\"tally\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":null,\"head\":\"main\",\"pulls\":1,\"issues\":1,\"about\":\"Counts lines, words and bytes, with output that lines up\",\"card\":\"/alice.test/tally/card.png?v=715ad689e9f7ec63\"},\"rev\":\"main\",\"path\":\"\",\"empty\":false,\"last\":{\"sha\":\"686a36205b82620af07dd99997c570f04f461df9\",\"parents\":[\"97727c2c19d5d8b3849b2ed9ad47130cee9798f5\"],\"author\":{\"name\":\"Bob Tanaka\",\"account\":\"bob.test\",\"avatar\":null},\"coauthors\":[],\"date\":\"2026-10-09T09:31:00+00:00\",\"message\":\"Count no lines in empty input\"},\"entries\":[{\"name\":\"assets\",\"kind\":\"tree\",\"size\":null},{\"name\":\"docs\",\"kind\":\"tree\",\"size\":null},{\"name\":\"src\",\"kind\":\"tree\",\"size\":null},{\"name\":\".gitignore\",\"kind\":\"blob\",\"size\":8},{\"name\":\"Cargo.toml\",\"kind\":\"blob\",\"size\":122},{\"name\":\"README.md\",\"kind\":\"blob\",\"size\":388}],\"readme\":{\"name\":\"README.md\",\"html\":\"
Counts lines, words and bytes, like wc, with output that lines up.
cargo install --path .\\ntally notes.txt\\necho \\\"one two\\\" | tally\\n\\n| Column | Meaning |
|---|---|
| 1 | lines |
| 2 | words, split on whitespace |
| 3 | bytes |
See the design notes for why it reads the whole file.
\\nMIT
\\n\",\"text\":null}}" }, "/_data/alice.test/tally/blob/main/README.md": { "status": 200, "headers": { "content-type": "application/json", "cache-control": "no-cache" }, "body": "{\"repo\":{\"authority\":\"alice.test\",\"avatar\":null,\"name\":\"tally\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":null,\"head\":\"main\",\"pulls\":1,\"issues\":1,\"about\":\"Counts lines, words and bytes, with output that lines up\",\"card\":\"/alice.test/tally/card.png?v=715ad689e9f7ec63\"},\"rev\":\"main\",\"path\":\"README.md\",\"shown\":\"text\",\"size\":388,\"lines\":27,\"text\":\"# tally\\n\\nCounts lines, words and bytes, like `wc`, with output that lines up.\\n\\n\\n\\n## Usage\\n\\n```sh\\ncargo install --path .\\ntally notes.txt\\necho \\\"one two\\\" | tally\\n```\\n\\n## Output\\n\\n| Column | Meaning |\\n| --- | --- |\\n| 1 | lines |\\n| 2 | words, split on whitespace |\\n| 3 | bytes |\\n\\nSee [the design notes](docs/design.md) for why it reads the whole file.\\n\\n## License\\n\\nMIT\\n\",\"ranges\":\"\"}" }, "/_data/alice.test/tally/blob/main/assets/logo.svg": { "status": 200, "headers": { "content-type": "application/json", "cache-control": "no-cache" }, "body": "{\"repo\":{\"authority\":\"alice.test\",\"avatar\":null,\"name\":\"tally\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":null,\"head\":\"main\",\"pulls\":1,\"issues\":1,\"about\":\"Counts lines, words and bytes, with output that lines up\",\"card\":\"/alice.test/tally/card.png?v=715ad689e9f7ec63\"},\"rev\":\"main\",\"path\":\"assets/logo.svg\",\"shown\":\"image\",\"size\":282,\"lines\":1,\"text\":null,\"ranges\":null}" }, "/_data/alice.test/tally/blob/main/nowhere": { "status": 404, "headers": { "content-type": "application/json", "cache-control": "no-store" }, "body": "{\"message\":\"no nowhere at main\"}" }, "/_data/alice.test/tally/blob/main/src/lib.rs": { "status": 200, "headers": { "content-type": "application/json", "cache-control": "no-cache" }, "body": "{\"repo\":{\"authority\":\"alice.test\",\"avatar\":null,\"name\":\"tally\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":null,\"head\":\"main\",\"pulls\":1,\"issues\":1,\"about\":\"Counts lines, words and bytes, with output that lines up\",\"card\":\"/alice.test/tally/card.png?v=715ad689e9f7ec63\"},\"rev\":\"main\",\"path\":\"src/lib.rs\",\"shown\":\"text\",\"size\":783,\"lines\":37,\"text\":\"//! Counting, kept apart from reading so it can be tested.\\n\\nmod parse;\\n\\n/// What a text holds.\\n#[derive(Debug, Default, PartialEq)]\\npub struct Counts {\\n pub lines: usize,\\n pub words: usize,\\n pub bytes: usize,\\n}\\n\\n/// Counts `text` in one pass.\\npub fn count(text: &str) -> Counts {\\n let mut counts = Counts { bytes: text.len(), ..Counts::default() };\\n for line in parse::lines(text) {\\n counts.lines += 1;\\n counts.words += parse::words(line);\\n }\\n counts\\n}\\n\\n#[cfg(test)]\\nmod tests {\\n use super::*;\\n\\n #[test]\\n fn counts() {\\n let c = count(\\\"one two\\\\nthree\\\\n\\\");\\n assert_eq!(c, Counts { lines: 2, words: 3, bytes: 14 });\\n }\\n\\n #[test]\\n fn a_last_line_without_a_newline() {\\n assert_eq!(count(\\\"a\\\\nb\\\").lines, 2);\\n }\\n}\\n\",\"ranges\":\"comment:0,59,13,23,126,31;string:585,18,153,6;keyword:60,3,69,3,1,6,14,3,19,3,19,3,49,3,1,2,35,3,1,3,65,3,6,2,126,3,13,3,1,5,22,2,20,3,120,2;number:422,1,221,1,9,1,9,2,105,1;function:259,5,67,3,14,7,29,5,67,5,91,6,21,5,30,10,73,29,13,10;type:104,5,2,7,2,9,14,6,18,5,17,5,17,5,56,3,5,6,24,6,24,6,282,6;attr:95,9,5,2,7,2,9,2,358,12,36,7,138,7\"}" }, "/_data/alice.test/tally/commit/97727c2c19d5d8b3849b2ed9ad47130cee9798f5": { "status": 200, "headers": { "content-type": "application/json", "cache-control": "public, max-age=31536000, immutable" }, "body": "{\"repo\":{\"authority\":\"alice.test\",\"avatar\":null,\"name\":\"tally\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":null,\"head\":\"main\",\"pulls\":1,\"issues\":1,\"about\":\"Counts lines, words and bytes, with output that lines up\",\"card\":\"/alice.test/tally/card.png?v=715ad689e9f7ec63\"},\"commit\":{\"sha\":\"97727c2c19d5d8b3849b2ed9ad47130cee9798f5\",\"parents\":[\"4f6b9a1168c6534f64c836b4c3a11e23e74637ad\"],\"author\":{\"name\":\"Alice Moreau\",\"account\":\"alice.test\",\"avatar\":null},\"coauthors\":[],\"date\":\"2026-10-08T11:47:00+00:00\",\"message\":\"Split parsing into its own module\"},\"files\":[{\"old\":\"docs/design.md\",\"new\":\"docs/DESIGN.md\",\"status\":\"renamed\",\"added\":0,\"removed\":0,\"note\":\"Moved without changes.\",\"ranges\":null,\"rows\":[]},{\"old\":\"src/lib.rs\",\"new\":\"src/lib.rs\",\"status\":\"modified\",\"added\":9,\"removed\":2,\"note\":null,\"ranges\":\"comment:0,58,14,22,58,30;string:529,18,153,6;keyword:60,3,69,3,1,6,41,3,38,3,1,3,65,3,6,2,20,3,6,2,177,3,120,2;number:384,1,203,1,9,1,9,2,105,1;function:262,3,14,7,27,5,28,5,65,16,3,5,35,5,43,5,30,10,73,29,13,10;type:104,5,2,7,2,9,14,6,54,3,5,6,24,6,24,6,295,6;attr:95,9,5,2,7,2,9,2,495,7;xins:339,17,112,17;xdel:308,11,92,30\",\"rows\":[{\"kind\":\"h\",\"line\":false,\"old\":null,\"new\":null,\"text\":\"@@ -1,5 +1,7 @@\"},{\"kind\":\"\",\"line\":true,\"old\":1,\"new\":1,\"text\":\"//! Counting, kept apart from reading so it can be tested.\"},{\"kind\":\"\",\"line\":true,\"old\":2,\"new\":2,\"text\":\"\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":3,\"text\":\"mod parse;\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":4,\"text\":\"\"},{\"kind\":\"\",\"line\":true,\"old\":3,\"new\":5,\"text\":\"/// What a text holds.\"},{\"kind\":\"\",\"line\":true,\"old\":4,\"new\":6,\"text\":\"#[derive(Debug, Default, PartialEq)]\"},{\"kind\":\"\",\"line\":true,\"old\":5,\"new\":7,\"text\":\"pub struct Counts {\"},{\"kind\":\"h\",\"line\":false,\"old\":null,\"new\":null,\"text\":\"@@ -11,9 +13,9 @@ pub struct Counts {\"},{\"kind\":\"\",\"line\":true,\"old\":11,\"new\":13,\"text\":\"/// Counts `text` in one pass.\"},{\"kind\":\"\",\"line\":true,\"old\":12,\"new\":14,\"text\":\"pub fn count(text: &str) -> Counts {\"},{\"kind\":\"\",\"line\":true,\"old\":13,\"new\":15,\"text\":\" let mut counts = Counts { bytes: text.len(), ..Counts::default() };\"},{\"kind\":\"d\",\"line\":true,\"old\":14,\"new\":null,\"text\":\" for line in text.lines() {\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":16,\"text\":\" for line in parse::lines(text) {\"},{\"kind\":\"\",\"line\":true,\"old\":15,\"new\":17,\"text\":\" counts.lines += 1;\"},{\"kind\":\"d\",\"line\":true,\"old\":16,\"new\":null,\"text\":\" counts.words += line.split_whitespace().count();\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":18,\"text\":\" counts.words += parse::words(line);\"},{\"kind\":\"\",\"line\":true,\"old\":17,\"new\":19,\"text\":\" }\"},{\"kind\":\"\",\"line\":true,\"old\":18,\"new\":20,\"text\":\" counts\"},{\"kind\":\"\",\"line\":true,\"old\":19,\"new\":21,\"text\":\"}\"},{\"kind\":\"h\",\"line\":false,\"old\":null,\"new\":null,\"text\":\"@@ -27,4 +29,9 @@ mod tests {\"},{\"kind\":\"\",\"line\":true,\"old\":27,\"new\":29,\"text\":\" let c = count(\\\"one two\\\\nthree\\\\n\\\");\"},{\"kind\":\"\",\"line\":true,\"old\":28,\"new\":30,\"text\":\" assert_eq!(c, Counts { lines: 2, words: 3, bytes: 14 });\"},{\"kind\":\"\",\"line\":true,\"old\":29,\"new\":31,\"text\":\" }\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":32,\"text\":\"\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":33,\"text\":\" #[test]\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":34,\"text\":\" fn a_last_line_without_a_newline() {\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":35,\"text\":\" assert_eq!(count(\\\"a\\\\nb\\\").lines, 2);\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":36,\"text\":\" }\"},{\"kind\":\"\",\"line\":true,\"old\":30,\"new\":37,\"text\":\"}\"}]},{\"old\":\"src/parse.rs\",\"new\":\"src/parse.rs\",\"status\":\"added\",\"added\":11,\"removed\":0,\"note\":null,\"ranges\":\"comment:0,48,2,57,76,68;keyword:108,3,1,2,138,3,1,2,22,4;function:115,5,33,16,3,5,82,5,54,5;type:128,3,5,5,131,3,10,8,1,4,4,3\",\"rows\":[{\"kind\":\"h\",\"line\":false,\"old\":null,\"new\":null,\"text\":\"@@ -0,0 +1,11 @@\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":1,\"text\":\"//! Splitting text into the things tally counts.\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":2,\"text\":\"\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":3,\"text\":\"/// The words of `line`: runs of anything but whitespace.\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":4,\"text\":\"pub fn words(line: &str) -> usize {\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":5,\"text\":\" line.split_whitespace().count()\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":6,\"text\":\"}\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":7,\"text\":\"\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":8,\"text\":\"/// The lines of `text`. A last line without a newline still counts.\"},{\"kind\":\"a\",\"line\":true,\"old\":null,\"new\":9,\"text\":\"pub fn lines(text: &str) -> impl IteratorRunning tally image.png panics:
thread 'main' panicked at src/main.rs:8:56:\\nstream did not contain valid UTF-8\\n\\nwc counts bytes for any file.
\\n\",\"comments\":[{\"author\":\"alice.test\",\"avatar\":null,\"createdAt\":\"2026-10-10T00:11:00.000Z\",\"html\":\"Confirmed. Reading bytes and counting words lossily would fix it.
\\n\",\"verdict\":null}],\"merged\":null,\"about\":\"Running `tally image.png` panics: ``` thread 'main' panicked at src/main.rs:8:56: stream did not contain valid UTF-8 ``` wc counts bytes for any file.\",\"card\":\"/alice.test/tally/issue/did:plc:6jyayarzmhqfvz4w4tgj4xes/3mygjqa2suo32/card.png?v=160a3e2db8db2127\"}" }, "/_data/alice.test/tally/issue/did:plc:6jyayarzmhqfvz4w4tgj4xes/3mygjqa7nqp4u": { "status": 200, "headers": { "content-type": "application/json", "cache-control": "no-cache" }, "body": "{\"repo\":{\"authority\":\"alice.test\",\"avatar\":null,\"name\":\"tally\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":null,\"head\":\"main\",\"pulls\":1,\"issues\":1,\"about\":\"Counts lines, words and bytes, with output that lines up\",\"card\":\"/alice.test/tally/card.png?v=715ad689e9f7ec63\"},\"kind\":\"issue\",\"title\":\"Typo in the README ✏️\",\"state\":\"closed\",\"author\":\"bob.test\",\"avatar\":null,\"createdAt\":\"2026-10-10T00:48:00.000Z\",\"base\":null,\"from\":null,\"branch\":null,\"body\":null,\"comments\":[],\"merged\":null,\"about\":\"An issue on alice.test/tally by bob.test.\",\"card\":\"/alice.test/tally/issue/did:plc:6jyayarzmhqfvz4w4tgj4xes/3mygjqa7nqp4u/card.png?v=72fe47df61de13f9\"}" }, "/_data/alice.test/tally/issues": { "status": 200, "headers": { "content-type": "application/json", "cache-control": "no-cache" }, "body": "{\"repo\":{\"authority\":\"alice.test\",\"avatar\":null,\"name\":\"tally\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":null,\"head\":\"main\",\"pulls\":1,\"issues\":1,\"about\":\"Counts lines, words and bytes, with output that lines up\",\"card\":\"/alice.test/tally/card.png?v=715ad689e9f7ec63\"},\"kind\":\"issue\",\"open\":true,\"opened\":1,\"closed\":1,\"items\":[{\"title\":\"Fails on files that are not UTF-8\",\"state\":\"open\",\"href\":\"/alice.test/tally/issue/did:plc:6jyayarzmhqfvz4w4tgj4xes/3mygjqa2suo32\",\"author\":\"bob.test\",\"createdAt\":\"2026-10-09T23:34:00.000Z\",\"comments\":1}]}" }, "/_data/alice.test/tally/issues?state=closed": { "status": 200, "headers": { "content-type": "application/json", "cache-control": "no-cache" }, "body": "{\"repo\":{\"authority\":\"alice.test\",\"avatar\":null,\"name\":\"tally\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":null,\"head\":\"main\",\"pulls\":1,\"issues\":1,\"about\":\"Counts lines, words and bytes, with output that lines up\",\"card\":\"/alice.test/tally/card.png?v=715ad689e9f7ec63\"},\"kind\":\"issue\",\"open\":false,\"opened\":1,\"closed\":1,\"items\":[{\"title\":\"Typo in the README ✏️\",\"state\":\"closed\",\"href\":\"/alice.test/tally/issue/did:plc:6jyayarzmhqfvz4w4tgj4xes/3mygjqa7nqp4u\",\"author\":\"bob.test\",\"createdAt\":\"2026-10-10T00:48:00.000Z\",\"comments\":0}]}" }, "/_data/alice.test/tally/pull/did:plc:6jyayarzmhqfvz4w4tgj4xes/3mygjq5dbkkmg": { "status": 200, "headers": { "content-type": "application/json", "cache-control": "no-cache" }, "body": "{\"repo\":{\"authority\":\"alice.test\",\"avatar\":null,\"name\":\"tally\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":null,\"head\":\"main\",\"pulls\":1,\"issues\":1,\"about\":\"Counts lines, words and bytes, with output that lines up\",\"card\":\"/alice.test/tally/card.png?v=715ad689e9f7ec63\"},\"kind\":\"pull\",\"title\":\"Count no lines in empty input\",\"state\":\"merged\",\"author\":\"bob.test\",\"avatar\":null,\"createdAt\":\"2026-10-09T18:38:00.000Z\",\"base\":\"main\",\"from\":\"bob.test/tally\",\"branch\":\"empty-input\",\"body\":\"tally printed one line for an empty file. lines now yields nothing when the text is empty, and a test covers it.
Could lines check for emptiness once, rather than in the filter?
It only runs per line, so the cost is one comparison each. Happy to change it if you prefer.
\\n\",\"verdict\":null},{\"author\":\"alice.test\",\"avatar\":null,\"createdAt\":\"2026-10-09T20:29:00.000Z\",\"html\":\"Fair enough. Thanks!
\\n\",\"verdict\":\"approve\"}],\"merged\":\"686a36205b82620af07dd99997c570f04f461df9\",\"about\":\"`tally` printed one line for an empty file. `lines` now yields nothing when the text is empty, and a test covers it.\",\"card\":\"/alice.test/tally/pull/did:plc:6jyayarzmhqfvz4w4tgj4xes/3mygjq5dbkkmg/card.png?v=7f555a00efc7106b\"}" }, "/_data/alice.test/tally/pull/did:plc:6jyayarzmhqfvz4w4tgj4xes/3mygjq7w6et2x": { "status": 200, "headers": { "content-type": "application/json", "cache-control": "no-cache" }, "body": "{\"repo\":{\"authority\":\"alice.test\",\"avatar\":null,\"name\":\"tally\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":null,\"head\":\"main\",\"pulls\":1,\"issues\":1,\"about\":\"Counts lines, words and bytes, with output that lines up\",\"card\":\"/alice.test/tally/card.png?v=715ad689e9f7ec63\"},\"kind\":\"pull\",\"title\":\"Print counts as JSON with --json\",\"state\":\"open\",\"author\":\"bob.test\",\"avatar\":null,\"createdAt\":\"2026-10-09T22:57:00.000Z\",\"base\":\"main\",\"from\":\"bob.test/tally\",\"branch\":\"json\",\"body\":\"For scripts. The object has lines, words, bytes and name.
Counts lines, words and bytes, like wc, with output that lines up.
cargo install --path .\\ntally notes.txt\\necho \\\"one two\\\" | tally\\n\\n| Column | Meaning |
|---|---|
| 1 | lines |
| 2 | words, split on whitespace |
| 3 | bytes |
See the design notes for why it reads the whole file.
\\nMIT
\\n\",\"text\":null}}" }, "/_data/search?q=t": { "status": 200, "headers": { "content-type": "application/json", "cache-control": "no-cache" }, "body": "{\"query\":\"t\",\"repos\":[{\"owner\":\"bob.test\",\"avatar\":null,\"name\":\"tally\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":null,\"createdAt\":\"2026-10-09T14:19:00.000Z\",\"private\":false},{\"owner\":\"alice.test\",\"avatar\":null,\"name\":\"scratch\",\"description\":null,\"forkOf\":null,\"createdAt\":\"2026-10-09T13:42:00.000Z\",\"private\":false},{\"owner\":\"alice.test\",\"avatar\":null,\"name\":\"notes\",\"description\":\"Scratch notes 📝\",\"forkOf\":null,\"createdAt\":\"2026-10-09T11:51:00.000Z\",\"private\":false},{\"owner\":\"alice.test\",\"avatar\":null,\"name\":\"tally\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":null,\"createdAt\":\"2026-10-09T10:00:00.000Z\",\"private\":false}]}" }, "/alice.test/tally/raw/main/assets/logo.svg": { "status": 200, "headers": { "content-type": "image/svg+xml", "cache-control": "no-cache", "content-security-policy": "sandbox; default-src 'none'; style-src 'unsafe-inline'" }, "body": "\n" }, "/bob.test/tally/raw/main/assets/logo.svg": { "status": 200, "headers": { "content-type": "image/svg+xml", "cache-control": "no-cache", "content-security-policy": "sandbox; default-src 'none'; style-src 'unsafe-inline'" }, "body": "\n" }, "/xrpc/dev.knotless.getFeed": { "status": 200, "headers": { "content-type": "application/json" }, "body": "{\"events\":[{\"createdAt\":\"2026-10-10T01:25:00.000Z\",\"actor\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#changed\",\"subject\":\"at://did:plc:6jyayarzmhqfvz4w4tgj4xes/dev.knotless.issue/3mygjqa7nqp4u\",\"title\":\"Typo in the README ✏️\",\"state\":\"closed\"}},{\"createdAt\":\"2026-10-10T00:48:00.000Z\",\"actor\":{\"did\":\"did:plc:6jyayarzmhqfvz4w4tgj4xes\",\"handle\":\"bob.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#opened\",\"subject\":\"at://did:plc:6jyayarzmhqfvz4w4tgj4xes/dev.knotless.issue/3mygjqa7nqp4u\",\"title\":\"Typo in the README ✏️\"}},{\"createdAt\":\"2026-10-10T00:11:00.000Z\",\"actor\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#commented\",\"subject\":\"at://did:plc:6jyayarzmhqfvz4w4tgj4xes/dev.knotless.issue/3mygjqa2suo32\",\"title\":\"Fails on files that are not UTF-8\",\"text\":\"Confirmed. Reading bytes and counting words lossily would fix it.\"}},{\"createdAt\":\"2026-10-09T23:34:00.000Z\",\"actor\":{\"did\":\"did:plc:6jyayarzmhqfvz4w4tgj4xes\",\"handle\":\"bob.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#opened\",\"subject\":\"at://did:plc:6jyayarzmhqfvz4w4tgj4xes/dev.knotless.issue/3mygjqa2suo32\",\"title\":\"Fails on files that are not UTF-8\"}},{\"createdAt\":\"2026-10-09T22:57:00.000Z\",\"actor\":{\"did\":\"did:plc:6jyayarzmhqfvz4w4tgj4xes\",\"handle\":\"bob.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#opened\",\"subject\":\"at://did:plc:6jyayarzmhqfvz4w4tgj4xes/dev.knotless.pull/3mygjq7w6et2x\",\"title\":\"Print counts as JSON with --json\"}},{\"createdAt\":\"2026-10-09T22:20:00.000Z\",\"actor\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#changed\",\"subject\":\"at://did:plc:6jyayarzmhqfvz4w4tgj4xes/dev.knotless.pull/3mygjq5dbkkmg\",\"title\":\"Count no lines in empty input\",\"state\":\"merged\"}},{\"createdAt\":\"2026-10-09T21:06:00.000Z\",\"actor\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#pushed\",\"ref\":\"refs/heads/main\",\"created\":false,\"count\":1,\"commits\":[{\"sha\":\"686a36205b82620af07dd99997c570f04f461df9\",\"message\":\"Count no lines in empty input\"}]}},{\"createdAt\":\"2026-10-09T20:29:00.000Z\",\"actor\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#commented\",\"subject\":\"at://did:plc:6jyayarzmhqfvz4w4tgj4xes/dev.knotless.pull/3mygjq5dbkkmg\",\"title\":\"Count no lines in empty input\",\"text\":\"Fair enough. Thanks!\",\"verdict\":\"approve\"}},{\"createdAt\":\"2026-10-09T19:52:00.000Z\",\"actor\":{\"did\":\"did:plc:6jyayarzmhqfvz4w4tgj4xes\",\"handle\":\"bob.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#commented\",\"subject\":\"at://did:plc:6jyayarzmhqfvz4w4tgj4xes/dev.knotless.pull/3mygjq5dbkkmg\",\"title\":\"Count no lines in empty input\",\"text\":\"It only runs per line, so the cost is one comparison each. Happy to change it if you prefer.\"}},{\"createdAt\":\"2026-10-09T19:15:00.000Z\",\"actor\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#commented\",\"subject\":\"at://did:plc:6jyayarzmhqfvz4w4tgj4xes/dev.knotless.pull/3mygjq5dbkkmg\",\"title\":\"Count no lines in empty input\",\"text\":\"Could `lines` check for emptiness once, rather than in the filter?\",\"verdict\":\"changes\"}},{\"createdAt\":\"2026-10-09T18:38:00.000Z\",\"actor\":{\"did\":\"did:plc:6jyayarzmhqfvz4w4tgj4xes\",\"handle\":\"bob.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#opened\",\"subject\":\"at://did:plc:6jyayarzmhqfvz4w4tgj4xes/dev.knotless.pull/3mygjq5dbkkmg\",\"title\":\"Count no lines in empty input\"}},{\"createdAt\":\"2026-10-09T17:24:00.000Z\",\"actor\":{\"did\":\"did:plc:6jyayarzmhqfvz4w4tgj4xes\",\"handle\":\"bob.test\"},\"repo\":{\"did\":\"did:plc:6jyayarzmhqfvz4w4tgj4xes\",\"handle\":\"bob.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#pushed\",\"ref\":\"refs/heads/json\",\"created\":true,\"count\":1,\"commits\":[{\"sha\":\"2063dabcda7417d5831f3b6bfd8ffb18da82fb8e\",\"message\":\"Print counts as JSON with --json\"}]}},{\"createdAt\":\"2026-10-09T16:10:00.000Z\",\"actor\":{\"did\":\"did:plc:6jyayarzmhqfvz4w4tgj4xes\",\"handle\":\"bob.test\"},\"repo\":{\"did\":\"did:plc:6jyayarzmhqfvz4w4tgj4xes\",\"handle\":\"bob.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#pushed\",\"ref\":\"refs/heads/empty-input\",\"created\":true,\"count\":1,\"commits\":[{\"sha\":\"686a36205b82620af07dd99997c570f04f461df9\",\"message\":\"Count no lines in empty input\"}]}},{\"createdAt\":\"2026-10-09T14:19:00.000Z\",\"actor\":{\"did\":\"did:plc:6jyayarzmhqfvz4w4tgj4xes\",\"handle\":\"bob.test\"},\"repo\":{\"did\":\"did:plc:6jyayarzmhqfvz4w4tgj4xes\",\"handle\":\"bob.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#created\",\"description\":\"Counts lines, words and bytes, with output that lines up\",\"forkOf\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"}}},{\"createdAt\":\"2026-10-09T13:42:00.000Z\",\"actor\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"scratch\"},\"action\":{\"$type\":\"dev.knotless.getFeed#created\"}},{\"createdAt\":\"2026-10-09T12:28:00.000Z\",\"actor\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"notes\"},\"action\":{\"$type\":\"dev.knotless.getFeed#pushed\",\"ref\":\"refs/heads/main\",\"created\":true,\"count\":1,\"commits\":[{\"sha\":\"e78543abf0f799b7eb5713ccdf8d88b84d0f8ec0\",\"message\":\"Begin\"}]}},{\"createdAt\":\"2026-10-09T11:51:00.000Z\",\"actor\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"notes\"},\"action\":{\"$type\":\"dev.knotless.getFeed#created\",\"description\":\"Scratch notes 📝\"}},{\"createdAt\":\"2026-10-09T10:37:00.000Z\",\"actor\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#pushed\",\"ref\":\"refs/heads/main\",\"created\":true,\"count\":6,\"commits\":[{\"sha\":\"97727c2c19d5d8b3849b2ed9ad47130cee9798f5\",\"message\":\"Split parsing into its own module\"},{\"sha\":\"4f6b9a1168c6534f64c836b4c3a11e23e74637ad\",\"message\":\"Document usage and output\"},{\"sha\":\"d1f55d39d12c4d6ba6ab25b1e9c76d15fb2cbaca\",\"message\":\"Add a logo\"},{\"sha\":\"7818a5bc1bef9184ad313cf79175da3d87d4b9cf\",\"message\":\"Read from stdin when no file is given\\n\\nSo tally works at the end of a pipe, as wc does. The name shown\\nfor stdin is \\\"-\\\".\"},{\"sha\":\"a7e467c6f9acd7b1be0603afdec0b8cfdcf3cf49\",\"message\":\"Count words, lines and bytes\"},{\"sha\":\"cac02c464843db4d55fecfa69d327ef7b12702c0\",\"message\":\"Start tally\"}]}},{\"createdAt\":\"2026-10-09T10:00:00.000Z\",\"actor\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\"},\"repo\":{\"did\":\"did:plc:zq4qywccowjtdq3jltex43ro\",\"handle\":\"alice.test\",\"name\":\"tally\"},\"action\":{\"$type\":\"dev.knotless.getFeed#created\",\"description\":\"Counts lines, words and bytes, with output that lines up\"}}]}" } } }