{"exhaustive":{"nbHits":false,"typo":false},"exhaustiveNbHits":false,"exhaustiveTypo":false,"hits":[{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"zerojames"},"story_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"Aurora is a fast, extensible Python static site generator. With Aurora, I can generate my personal website [1] (~1,700 files, with multiple layers of jinja2 templates for each page) in &lt; 4 seconds. Aurora generated 292,884 pages from a Hacker News post dataset in 2m:20s.<p>I appreciate being able to see changes I make as soon as possible, so Aurora comes with hot reloading and incremental static regeneration for development. Refreshes and reloads are ~200ms, and trigger automatically.<p>You can see a demo at:<p><a href=\"https://github.com/capjamesg/aurora/assets/37276661/39f62bd8-cf5f-4d15-a325-7d433b7ceeb0\">https://github.com/capjamesg/aurora/assets/37276661/39f62bd8...</a><p>Aurora comes with a &quot;hooks&quot; API that lets you control state before page generation and after site build. I use the former feature to read locally-cached link previews. There is also a feature to load data from JSON and CSV files.<p>I would love feedback!<p><pre><code>  [1] https://<em>jamesg.blog</em>\n  [2] https://<em>jamesg.blog</em>/2024/06/16/aurora-isr/</code></pre>"},"title":{"matchLevel":"none","matchedWords":[],"value":"Show HN: Aurora, an extensible Python static site generator"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/capjamesg/aurora"}},"_tags":["story","author_zerojames","story_40716253","show_hn"],"author":"zerojames","created_at":"2024-06-18T11:00:56Z","created_at_i":1718708456,"num_comments":0,"objectID":"40716253","points":3,"story_id":40716253,"story_text":"Aurora is a fast, extensible Python static site generator. With Aurora, I can generate my personal website [1] (~1,700 files, with multiple layers of jinja2 templates for each page) in &lt; 4 seconds. Aurora generated 292,884 pages from a Hacker News post dataset in 2m:20s.<p>I appreciate being able to see changes I make as soon as possible, so Aurora comes with hot reloading and incremental static regeneration for development. Refreshes and reloads are ~200ms, and trigger automatically.<p>You can see a demo at:<p><a href=\"https:&#x2F;&#x2F;github.com&#x2F;capjamesg&#x2F;aurora&#x2F;assets&#x2F;37276661&#x2F;39f62bd8-cf5f-4d15-a325-7d433b7ceeb0\">https:&#x2F;&#x2F;github.com&#x2F;capjamesg&#x2F;aurora&#x2F;assets&#x2F;37276661&#x2F;39f62bd8...</a><p>Aurora comes with a &quot;hooks&quot; API that lets you control state before page generation and after site build. I use the former feature to read locally-cached link previews. There is also a feature to load data from JSON and CSV files.<p>I would love feedback!<p><pre><code>  [1] https:&#x2F;&#x2F;jamesg.blog\n  [2] https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;06&#x2F;16&#x2F;aurora-isr&#x2F;</code></pre>","title":"Show HN: Aurora, an extensible Python static site generator","updated_at":"2024-09-20T17:13:02Z","url":"https://github.com/capjamesg/aurora"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"zerojames"},"story_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"I am fascinated by different ways to explore corpora of texts. A few months ago, I built an index for my blog [1], inspired by physical book indices, which lets you explore blog posts by key word.<p>With this spirit of exploring text data in different ways in mind, I have been working on KGL, a query language for knowledge graphs. Using GPT, I ingested my personal website into semantic (&quot;subject, predicate, object&quot;) triples. I then turned these into a graph that I could query.<p>KGL is designed for unstructured data, whereas RDF was designed for explicitly structured data (and thus suffers from significant verbosity that is not necessary for my application). SPARQL, which is used to query RDF, is similarly complex. SPARQL as conducive to play, the intent for this language.<p>The language is processed as pointers between concepts, like:<p><pre><code>    { taylor swift -&gt; created }!\n</code></pre>\nRetrieves information about all albums that Taylor Swift created. The ! is the expansion operator to explore the graph by one degree. [2]<p>You can create queries of arbitrary length, like:<p><pre><code>    { taylor swift -&gt; created -&gt; have }\n</code></pre>\nKGL is implemented in Python and works on an in-memory graph. Data can be imported to and exported from a KGL graph in CSV, TSV, and JSON.<p>Demo video: <a href=\"https://jamesg.blog/assets/kgl-interpreter-demo.mp4\" rel=\"nofollow\">https://<em>jamesg.blog</em>/assets/kgl-interpreter-demo.mp4</a><p>Playground with which you can experiment: <a href=\"https://jamesg.blog/kgl/\" rel=\"nofollow\">https://<em>jamesg.blog</em>/kgl/</a><p>[1]: <a href=\"https://jamesg.blog/2023/06/03/website-index/\" rel=\"nofollow\">https://<em>jamesg.blog</em>/2023/06/03/website-index/</a><p>[2]: <a href=\"https://jamesg.blog/2024/03/22/kgl/\" rel=\"nofollow\">https://<em>jamesg.blog</em>/2024/03/22/kgl/</a>"},"title":{"matchLevel":"none","matchedWords":[],"value":"Show HN: KGL, a query language for knowledge graphs"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/capjamesg/knowledge-graph-language"}},"_tags":["story","author_zerojames","story_39827078","show_hn"],"author":"zerojames","created_at":"2024-03-26T12:37:07Z","created_at_i":1711456627,"num_comments":0,"objectID":"39827078","points":3,"story_id":39827078,"story_text":"I am fascinated by different ways to explore corpora of texts. A few months ago, I built an index for my blog [1], inspired by physical book indices, which lets you explore blog posts by key word.<p>With this spirit of exploring text data in different ways in mind, I have been working on KGL, a query language for knowledge graphs. Using GPT, I ingested my personal website into semantic (&quot;subject, predicate, object&quot;) triples. I then turned these into a graph that I could query.<p>KGL is designed for unstructured data, whereas RDF was designed for explicitly structured data (and thus suffers from significant verbosity that is not necessary for my application). SPARQL, which is used to query RDF, is similarly complex. SPARQL as conducive to play, the intent for this language.<p>The language is processed as pointers between concepts, like:<p><pre><code>    { taylor swift -&gt; created }!\n</code></pre>\nRetrieves information about all albums that Taylor Swift created. The ! is the expansion operator to explore the graph by one degree. [2]<p>You can create queries of arbitrary length, like:<p><pre><code>    { taylor swift -&gt; created -&gt; have }\n</code></pre>\nKGL is implemented in Python and works on an in-memory graph. Data can be imported to and exported from a KGL graph in CSV, TSV, and JSON.<p>Demo video: <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;assets&#x2F;kgl-interpreter-demo.mp4\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;assets&#x2F;kgl-interpreter-demo.mp4</a><p>Playground with which you can experiment: <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;kgl&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;kgl&#x2F;</a><p>[1]: <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;2023&#x2F;06&#x2F;03&#x2F;website-index&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;2023&#x2F;06&#x2F;03&#x2F;website-index&#x2F;</a><p>[2]: <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;03&#x2F;22&#x2F;kgl&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;03&#x2F;22&#x2F;kgl&#x2F;</a>","title":"Show HN: KGL, a query language for knowledge graphs","updated_at":"2024-09-20T16:39:32Z","url":"https://github.com/capjamesg/knowledge-graph-language"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"zerojames"},"story_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"One of my favourite features of Wikipedia is the hovercard. You can hover over a link and see a preview of the content at the link destination.<p>I made a small JavaScript utility that accepts a JSON object with link information and enables hovercards on a personal website. I am &quot;eating what I cook&quot; per se by running this on my website. You can hover over any link in blog posts on my personal website and see hovercard.js in action.<p>Here's an example:<p><pre><code>    https://<em>jamesg.blog</em>/2023/05/19/airport-pianos/\n</code></pre>\nI also maintain a Python package [1] that makes it easy to retrieve meta information about sites for use with hovercards [1] (The format is title, image, and description, so you can use any tool you want, though!).<p>[1] <a href=\"https://jamesg.blog/2022/10/12/hovercards/\" rel=\"nofollow noreferrer\">https://<em>jamesg.blog</em>/2022/10/12/hovercards/</a>"},"title":{"matchLevel":"none","matchedWords":[],"value":"Show HN: Hovercard.js, simple hovercard utility for web pages"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/capjamesg/hovercard.js"}},"_tags":["story","author_zerojames","story_37408386","show_hn"],"author":"zerojames","children":[37409728],"created_at":"2023-09-06T17:41:10Z","created_at_i":1694022070,"num_comments":1,"objectID":"37408386","points":2,"story_id":37408386,"story_text":"One of my favourite features of Wikipedia is the hovercard. You can hover over a link and see a preview of the content at the link destination.<p>I made a small JavaScript utility that accepts a JSON object with link information and enables hovercards on a personal website. I am &quot;eating what I cook&quot; per se by running this on my website. You can hover over any link in blog posts on my personal website and see hovercard.js in action.<p>Here&#x27;s an example:<p><pre><code>    https:&#x2F;&#x2F;jamesg.blog&#x2F;2023&#x2F;05&#x2F;19&#x2F;airport-pianos&#x2F;\n</code></pre>\nI also maintain a Python package [1] that makes it easy to retrieve meta information about sites for use with hovercards [1] (The format is title, image, and description, so you can use any tool you want, though!).<p>[1] <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;2022&#x2F;10&#x2F;12&#x2F;hovercards&#x2F;\" rel=\"nofollow noreferrer\">https:&#x2F;&#x2F;jamesg.blog&#x2F;2022&#x2F;10&#x2F;12&#x2F;hovercards&#x2F;</a>","title":"Show HN: Hovercard.js, simple hovercard utility for web pages","updated_at":"2024-09-20T14:57:47Z","url":"https://github.com/capjamesg/hovercard.js"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"zerojames"},"story_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"Over the last two weeks, I have been learning more about how NoSQL databases work. I decided to make a database, with the intent to use it on my personal website.<p>JameSQL supports several query types, including and/or, range, span, and wildcard. It also has a text-based query language with support for operators that is transpiled back into a JSON query to be executed.<p>You can try it out at:<p><a href=\"https://jamesg.blog/search-pages/?q=category_lower:%27indieweb%27%20website%20ideas\" rel=\"nofollow\">https://<em>jamesg.blog</em>/search-pages/?q=category_lower:%27indiew...</a><p>Under the hood, I use a reverse index for text and boolean searches, a b-tree for range queries (using the btrees Python package), and a trie for string prefix queries (using the pygtrie package). Most queries are executed in &lt; 0.01s."},"title":{"matchLevel":"none","matchedWords":[],"value":"Show HN: A Python-based, in-memory NoSQL database"},"url":{"matchLevel":"none","matchedWords":[],"value":"https://github.com/capjamesg/jamesql"}},"_tags":["story","author_zerojames","story_41339480","show_hn"],"author":"zerojames","created_at":"2024-08-24T16:45:49Z","created_at_i":1724517949,"num_comments":0,"objectID":"41339480","points":1,"story_id":41339480,"story_text":"Over the last two weeks, I have been learning more about how NoSQL databases work. I decided to make a database, with the intent to use it on my personal website.<p>JameSQL supports several query types, including and&#x2F;or, range, span, and wildcard. It also has a text-based query language with support for operators that is transpiled back into a JSON query to be executed.<p>You can try it out at:<p><a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;search-pages&#x2F;?q=category_lower:%27indieweb%27%20website%20ideas\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;search-pages&#x2F;?q=category_lower:%27indiew...</a><p>Under the hood, I use a reverse index for text and boolean searches, a b-tree for range queries (using the btrees Python package), and a trie for string prefix queries (using the pygtrie package). Most queries are executed in &lt; 0.01s.","title":"Show HN: A Python-based, in-memory NoSQL database","updated_at":"2024-09-20T17:38:39Z","url":"https://github.com/capjamesg/jamesql"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"zerojames"},"story_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"I have been experimenting with procedural text generation. I made an application that uses the words on the front-page of the HN homepage to generate poems.<p>The poems are generated with Tracery, which lets you specify grammars for generating text. Poems are regenerated hourly.<p>In testing, some poems are delightful (i.e. &quot;for all the radiant night&quot; and &quot;like a zip in the hypothesis&quot;, and &quot;my compiler is mathematical&quot;, whereas others are... not-so-great.<p>I wrote about how it works on my blog [0]. I would love to know what rules I could use to improve this tool.<p>[0]: <a href=\"https://jamesg.blog/hn-poetry/\" rel=\"nofollow\">https://<em>jamesg.blog</em>/hn-poetry/</a>"},"title":{"matchLevel":"none","matchedWords":[],"value":"Show HN: Hacker News Poetry"},"url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"https://hnpoetry.<em>jamesg.blog</em>/"}},"_tags":["story","author_zerojames","story_39589400","show_hn"],"author":"zerojames","created_at":"2024-03-04T11:59:38Z","created_at_i":1709553578,"num_comments":0,"objectID":"39589400","points":1,"story_id":39589400,"story_text":"I have been experimenting with procedural text generation. I made an application that uses the words on the front-page of the HN homepage to generate poems.<p>The poems are generated with Tracery, which lets you specify grammars for generating text. Poems are regenerated hourly.<p>In testing, some poems are delightful (i.e. &quot;for all the radiant night&quot; and &quot;like a zip in the hypothesis&quot;, and &quot;my compiler is mathematical&quot;, whereas others are... not-so-great.<p>I wrote about how it works on my blog [0]. I would love to know what rules I could use to improve this tool.<p>[0]: <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;hn-poetry&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;hn-poetry&#x2F;</a>","title":"Show HN: Hacker News Poetry","updated_at":"2024-09-20T16:34:23Z","url":"https://hnpoetry.jamesg.blog/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"GarnetFloride"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"Warning: opening a can of worms.\nAnn Blair is a great source on general, but there are so many facets to this topic here's a list that I have read or am going to read.<p>* The Notebook: A History of Thinking on Paper by Roland Allen \n* The Carrier Bag Theory of Fiction by Ursula K. Le Guin\n* Too Much To Know: Managing Scholarly Information Before the Modern Age by \nAnn M. Blair\n* Communicating with Slip Boxes: An Empirical Account by Niklas Luhmann\n* Akin's Laws of Spacecraft Design\n* Writing the Laboratory Notebook by Howard M Kanare\n* Paper Machines: About Cards &amp; Catalogs by Markus Krajewski\n* A System for Writing by Bob Doto\n* Building a Second Brain By Tiago Forte\n* Index, a History of the by Dennis Duncan\n* Forgetting Machines: Knowledge Management Evolution in Early Modern Europe\nby Alberto Cevolini\n* The Filing Cabinet: A Vertical History of Information by  Craig Robertson \n* How to Take Smart Notes by Sonke Ahrens\n* Filing and Database Systems by Jeffrey Robert Stewart, Judith A. Scharle, Judith Scharle Greene\n* Organizing from the Inside Out by Julie Morgenstern\n* The Library: A Fragile History by Andrew Pettegree, Arthur der Weduwen\n* The Extended Mind by Annie Murphy Paul \n* Stolen Focus: Why You Can't Pay Attention by Johann Hari\n* Papyrus: The Invention of Books in the Ancient World by Irene Vallejo\n* Filing by Jeffrey Robert Stewart, Judith A. Scharle\n* How Romantics and Victorians Organized Information by Jillian M. Hess\n* A Writer's Notebook by W. Somerset Maugham\n* The Bullet Journal Method by Ryder Carroll \n* The Medieval Scriptorium by Sara J. Charles\n* Chance Particulars by Sara Mansfield Taber, Maud Taber-Thomas \n* The Great Mental Models Volume 1- General Thinking Concepts by Parrish, Shane; Beaubien, Rhiannon \n* The Product is Docs by Christopher Gales\n* Antinet Zettelkasten by Scott P. Scheper \n<i>Articulating design decisions  by Tom Greever \n</i> The Card System at the Office by J Kaiser\n* Systematic Indexing by J Kaiser\n* Commonplace Books and the Teaching of Style by Lynee Lewis Gaillet\n* Magic and hypersystems : constructing the information-sharing library by\nHarold Billings.\n* The Magical Number Seven, Plus or Minus Two: Some Limits on our Capacity for\nProcessing Information by George A. Miller \n* The Commonplace Book by Elizabeth Smither\n* The Oxford Handbook of Expertise\n* Trees, maps, and theorems: Effective communication for rational minds by\nJean-luc Doumont\n* Applied Secretarial Practice by Rupert P. Sorelle and John Robert Gregg \n* The Card Catalog by Carla Hayden\n* What is a Document by Michael Buckland\n* The Commonplace Book by Ann Blair\n* Make Better Documents by Anil Dash\n* A Core Calculus for Documents by Will Crichton and Shriram Krishnamurthi\n* The Craft of Research by Wayne C. Booth, Gregory G. Colomb, Joseph M. Williams\n* Information by Anthony Grafton\n* The Card Catalog by Carla Hayden\n* Files: Law and Media Technology by Cornelia Vismann\n* Living Documentation: Continuous Knowledge by Cyrille Martraire\n* Living in Information by Jorge Arango\n* How to Write a Technical Paper: Structure and Style of the Epitome of your Research\u2020 by Georgios Varsamopoulos\n* Information Development: Managing Your Documentation Projects, Portfolio, and People by JoAnn T. Hackos\n* Information Architecture: For the Web and Beyond by Louis Rosenfeld, Peter Morville, Jorge Arango\n* Software Technical Writing: A Guidebook by James (<em>jamesg.blog</em>)"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: What did you find out or explore today?"}},"_tags":["comment","author_GarnetFloride","story_46619464"],"author":"GarnetFloride","children":[46644840],"comment_text":"Warning: opening a can of worms.\nAnn Blair is a great source on general, but there are so many facets to this topic here&#x27;s a list that I have read or am going to read.<p>* The Notebook: A History of Thinking on Paper by Roland Allen \n* The Carrier Bag Theory of Fiction by Ursula K. Le Guin\n* Too Much To Know: Managing Scholarly Information Before the Modern Age by \nAnn M. Blair\n* Communicating with Slip Boxes: An Empirical Account by Niklas Luhmann\n* Akin&#x27;s Laws of Spacecraft Design\n* Writing the Laboratory Notebook by Howard M Kanare\n* Paper Machines: About Cards &amp; Catalogs by Markus Krajewski\n* A System for Writing by Bob Doto\n* Building a Second Brain By Tiago Forte\n* Index, a History of the by Dennis Duncan\n* Forgetting Machines: Knowledge Management Evolution in Early Modern Europe\nby Alberto Cevolini\n* The Filing Cabinet: A Vertical History of Information by  Craig Robertson \n* How to Take Smart Notes by Sonke Ahrens\n* Filing and Database Systems by Jeffrey Robert Stewart, Judith A. Scharle, Judith Scharle Greene\n* Organizing from the Inside Out by Julie Morgenstern\n* The Library: A Fragile History by Andrew Pettegree, Arthur der Weduwen\n* The Extended Mind by Annie Murphy Paul \n* Stolen Focus: Why You Can&#x27;t Pay Attention by Johann Hari\n* Papyrus: The Invention of Books in the Ancient World by Irene Vallejo\n* Filing by Jeffrey Robert Stewart, Judith A. Scharle\n* How Romantics and Victorians Organized Information by Jillian M. Hess\n* A Writer&#x27;s Notebook by W. Somerset Maugham\n* The Bullet Journal Method by Ryder Carroll \n* The Medieval Scriptorium by Sara J. Charles\n* Chance Particulars by Sara Mansfield Taber, Maud Taber-Thomas \n* The Great Mental Models Volume 1- General Thinking Concepts by Parrish, Shane; Beaubien, Rhiannon \n* The Product is Docs by Christopher Gales\n* Antinet Zettelkasten by Scott P. Scheper \n<i>Articulating design decisions  by Tom Greever \n</i> The Card System at the Office by J Kaiser\n* Systematic Indexing by J Kaiser\n* Commonplace Books and the Teaching of Style by Lynee Lewis Gaillet\n* Magic and hypersystems : constructing the information-sharing library by\nHarold Billings.\n* The Magical Number Seven, Plus or Minus Two: Some Limits on our Capacity for\nProcessing Information by George A. Miller \n* The Commonplace Book by Elizabeth Smither\n* The Oxford Handbook of Expertise\n* Trees, maps, and theorems: Effective communication for rational minds by\nJean-luc Doumont\n* Applied Secretarial Practice by Rupert P. Sorelle and John Robert Gregg \n* The Card Catalog by Carla Hayden\n* What is a Document by Michael Buckland\n* The Commonplace Book by Ann Blair\n* Make Better Documents by Anil Dash\n* A Core Calculus for Documents by Will Crichton and Shriram Krishnamurthi\n* The Craft of Research by Wayne C. Booth, Gregory G. Colomb, Joseph M. Williams\n* Information by Anthony Grafton\n* The Card Catalog by Carla Hayden\n* Files: Law and Media Technology by Cornelia Vismann\n* Living Documentation: Continuous Knowledge by Cyrille Martraire\n* Living in Information by Jorge Arango\n* How to Write a Technical Paper: Structure and Style of the Epitome of your Research\u2020 by Georgios Varsamopoulos\n* Information Development: Managing Your Documentation Projects, Portfolio, and People by JoAnn T. Hackos\n* Information Architecture: For the Web and Beyond by Louis Rosenfeld, Peter Morville, Jorge Arango\n* Software Technical Writing: A Guidebook by James (jamesg.blog)","created_at":"2026-01-16T02:59:07Z","created_at_i":1768532347,"objectID":"46642499","parent_id":46633117,"story_id":46619464,"story_title":"Ask HN: What did you find out or explore today?","updated_at":"2026-03-05T23:25:37Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"KTallguy"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"I\u2019ve been using Artemis ever since it was posted here earlier this year. I love it because there is very little pressure to read <i>everything</i> and it updates infrequently so I don\u2019t impulsively check it. Great product.<p><a href=\"https://news.ycombinator.com/item?id=42471913\">https://news.ycombinator.com/item?id=42471913</a><p><a href=\"https://artemis.jamesg.blog/\" rel=\"nofollow\">https://artemis.<em>jamesg.blog</em>/</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"RSS is awesome"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://evanverma.com/rss-is-awesome"}},"_tags":["comment","author_KTallguy","story_45058024"],"author":"KTallguy","comment_text":"I\u2019ve been using Artemis ever since it was posted here earlier this year. I love it because there is very little pressure to read <i>everything</i> and it updates infrequently so I don\u2019t impulsively check it. Great product.<p><a href=\"https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=42471913\">https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=42471913</a><p><a href=\"https:&#x2F;&#x2F;artemis.jamesg.blog&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;artemis.jamesg.blog&#x2F;</a>","created_at":"2025-08-29T22:30:00Z","created_at_i":1756506600,"objectID":"45070126","parent_id":45058024,"story_id":45058024,"story_title":"RSS is awesome","story_url":"https://evanverma.com/rss-is-awesome","updated_at":"2026-03-05T22:34:28Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"kayvulpe"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"<a href=\"https://artemis.jamesg.blog/app\" rel=\"nofollow\">https://artemis.<em>jamesg.blog</em>/app</a><p>Really like this."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Show HN: Artemis, a Calm Web Reader"},"story_url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"https://artemis.<em>jamesg.blog</em>/"}},"_tags":["comment","author_kayvulpe","story_42471913"],"author":"kayvulpe","comment_text":"<a href=\"https:&#x2F;&#x2F;artemis.jamesg.blog&#x2F;app\" rel=\"nofollow\">https:&#x2F;&#x2F;artemis.jamesg.blog&#x2F;app</a><p>Really like this.","created_at":"2024-12-21T10:34:44Z","created_at_i":1734777284,"objectID":"42478810","parent_id":42471913,"story_id":42471913,"story_title":"Show HN: Artemis, a Calm Web Reader","story_url":"https://artemis.jamesg.blog/","updated_at":"2024-12-21T10:38:36Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"exprez135"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"The tool actually is open source, so you could self-host it if you wish. MIT license, in Python. The repository [1] is linked in the blog post the author wrote about the project [2].<p>[1]: <a href=\"https://github.com/capjamesg/web-reader\">https://github.com/capjamesg/web-reader</a><p>[2]: <a href=\"https://jamesg.blog/2024/11/30/designing-a-calm-web-reader/\" rel=\"nofollow\">https://<em>jamesg.blog</em>/2024/11/30/designing-a-calm-web-reader/</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Show HN: Artemis, a Calm Web Reader"},"story_url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"https://artemis.<em>jamesg.blog</em>/"}},"_tags":["comment","author_exprez135","story_42471913"],"author":"exprez135","children":[42473603],"comment_text":"The tool actually is open source, so you could self-host it if you wish. MIT license, in Python. The repository [1] is linked in the blog post the author wrote about the project [2].<p>[1]: <a href=\"https:&#x2F;&#x2F;github.com&#x2F;capjamesg&#x2F;web-reader\">https:&#x2F;&#x2F;github.com&#x2F;capjamesg&#x2F;web-reader</a><p>[2]: <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;11&#x2F;30&#x2F;designing-a-calm-web-reader&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;11&#x2F;30&#x2F;designing-a-calm-web-reader&#x2F;</a>","created_at":"2024-12-20T18:00:59Z","created_at_i":1734717659,"objectID":"42473244","parent_id":42472027,"story_id":42471913,"story_title":"Show HN: Artemis, a Calm Web Reader","story_url":"https://artemis.jamesg.blog/","updated_at":"2024-12-22T19:46:13Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"rakoo"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"For reference, and not implying it's better or worse than your work OP, I've pleasantly used Fraidycat (<a href=\"https://fraidyc.at/\" rel=\"nofollow\">https://fraidyc.at/</a>) in the past. It's a webextension, so completely local, and also incorporates the idea of having a &quot;calmer&quot; experience: no infinite list of links to check, different update rates, ...<p>I love your philosophy page, OP ! (<a href=\"https://jamesg.blog/2024/11/30/designing-a-calm-web-reader/\" rel=\"nofollow\">https://<em>jamesg.blog</em>/2024/11/30/designing-a-calm-web-reader/</a>)"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Show HN: Artemis, a Calm Web Reader"},"story_url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"https://artemis.<em>jamesg.blog</em>/"}},"_tags":["comment","author_rakoo","story_42471913"],"author":"rakoo","children":[42472863,42473119],"comment_text":"For reference, and not implying it&#x27;s better or worse than your work OP, I&#x27;ve pleasantly used Fraidycat (<a href=\"https:&#x2F;&#x2F;fraidyc.at&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;fraidyc.at&#x2F;</a>) in the past. It&#x27;s a webextension, so completely local, and also incorporates the idea of having a &quot;calmer&quot; experience: no infinite list of links to check, different update rates, ...<p>I love your philosophy page, OP ! (<a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;11&#x2F;30&#x2F;designing-a-calm-web-reader&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;11&#x2F;30&#x2F;designing-a-calm-web-reader&#x2F;</a>)","created_at":"2024-12-20T16:52:01Z","created_at_i":1734713521,"objectID":"42472647","parent_id":42471913,"story_id":42471913,"story_title":"Show HN: Artemis, a Calm Web Reader","story_url":"https://artemis.jamesg.blog/","updated_at":"2024-12-20T23:14:19Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"fabianholzer"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"Well, it is hard to change a company from the oral/meeting-driven style to an async writing-based culture and a fear even the best resource won't really help with that. But since you've asked also on an indiviual level, I found some nuggets on technical writing in <a href=\"https://jamesg.blog/2024/01/03/software-technical-writing/\" rel=\"nofollow\">https://<em>jamesg.blog</em>/2024/01/03/software-technical-writing/</a> - certainly way better than a SEOed listicle"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: Technical Writing Resources"}},"_tags":["comment","author_fabianholzer","story_41299817"],"author":"fabianholzer","comment_text":"Well, it is hard to change a company from the oral&#x2F;meeting-driven style to an async writing-based culture and a fear even the best resource won&#x27;t really help with that. But since you&#x27;ve asked also on an indiviual level, I found some nuggets on technical writing in <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;01&#x2F;03&#x2F;software-technical-writing&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;01&#x2F;03&#x2F;software-technical-writing&#x2F;</a> - certainly way better than a SEOed listicle","created_at":"2024-08-21T09:04:11Z","created_at_i":1724231051,"objectID":"41308311","parent_id":41299817,"story_id":41299817,"story_title":"Ask HN: Technical Writing Resources","updated_at":"2024-09-20T17:35:31Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"tmtvl"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"Link seems broken? I assume you meant this: <a href=\"https://jamesg.blog/2024/06/18/designing-software/\" rel=\"nofollow\">https://<em>jamesg.blog</em>/2024/06/18/designing-software/</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Designing Software"},"story_url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"https://<em>jamesg.blog</em>/404.html/"}},"_tags":["comment","author_tmtvl","story_40722088"],"author":"tmtvl","children":[40722723],"comment_text":"Link seems broken? I assume you meant this: <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;06&#x2F;18&#x2F;designing-software&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;06&#x2F;18&#x2F;designing-software&#x2F;</a>","created_at":"2024-06-18T20:58:48Z","created_at_i":1718744328,"objectID":"40722150","parent_id":40722088,"story_id":40722088,"story_title":"Designing Software","story_url":"https://jamesg.blog/404.html/","updated_at":"2024-09-20T17:13:43Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"zerojames"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"Another day, another story on HN that will have me down a rabbit hole (yesterday's was a three-hour tangent into ternary bit compression after the Microsoft paper) :D<p>Your project is delightful -- thank you for sharing. I have explored this realm a bit before [0] [1], but in Python. The tool I made was for personal use, but streaming every keystroke through a network connection added a lot of unnecessary latency.<p>I used word surprisals (entropy) to calculate the most likely candidates, and gave a boost to words from my own writing (thus, the predictive engine was &quot;fine-tuned&quot; on my writing). The result is a dictionary of words with their probabilities of use. This can be applied to bigrams, too. Your project has me thinking: how could that be pruned, massively, to create the smallest possible structure. Your engine feels like the answer.<p>My use case is technical writing: you know what you want to say, including long words you have to repeat over again, but you want a quicker way of typing.<p>[0]: <a href=\"https://jamesg.blog/2023/12/15/auto-write/\" rel=\"nofollow\">https://<em>jamesg.blog</em>/2023/12/15/auto-write/</a><p>[1]: <a href=\"https://github.com/capjamesg/autowrite\">https://github.com/capjamesg/autowrite</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Show HN: Predictive text using only 13kb of JavaScript. no LLM"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://www.adamgrant.info/tiny-predictive-text"}},"_tags":["comment","author_zerojames","story_39556956"],"author":"zerojames","comment_text":"Another day, another story on HN that will have me down a rabbit hole (yesterday&#x27;s was a three-hour tangent into ternary bit compression after the Microsoft paper) :D<p>Your project is delightful -- thank you for sharing. I have explored this realm a bit before [0] [1], but in Python. The tool I made was for personal use, but streaming every keystroke through a network connection added a lot of unnecessary latency.<p>I used word surprisals (entropy) to calculate the most likely candidates, and gave a boost to words from my own writing (thus, the predictive engine was &quot;fine-tuned&quot; on my writing). The result is a dictionary of words with their probabilities of use. This can be applied to bigrams, too. Your project has me thinking: how could that be pruned, massively, to create the smallest possible structure. Your engine feels like the answer.<p>My use case is technical writing: you know what you want to say, including long words you have to repeat over again, but you want a quicker way of typing.<p>[0]: <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;2023&#x2F;12&#x2F;15&#x2F;auto-write&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;2023&#x2F;12&#x2F;15&#x2F;auto-write&#x2F;</a><p>[1]: <a href=\"https:&#x2F;&#x2F;github.com&#x2F;capjamesg&#x2F;autowrite\">https:&#x2F;&#x2F;github.com&#x2F;capjamesg&#x2F;autowrite</a>","created_at":"2024-03-01T09:53:45Z","created_at_i":1709286825,"objectID":"39560264","parent_id":39556956,"story_id":39556956,"story_title":"Show HN: Predictive text using only 13kb of JavaScript. no LLM","story_url":"https://www.adamgrant.info/tiny-predictive-text","updated_at":"2024-09-20T16:31:06Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"Crestwave"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"&gt; curl -sL -H &quot;Accept: text/roff&quot; <a href=\"https://jamesg.blog/2024/02/28/programming-projects/\" rel=\"nofollow\">https://<em>jamesg.blog</em>/2024/02/28/programming-projects/</a> &gt; post.page &amp;&amp; man ./post.page &amp;&amp; rm post.page<p>What if I have a post.page in my current directory?<p>&gt; curl -sL -H &quot;Accept: text/roff&quot; <a href=\"https://jamesg.blog/2024/02/28/programming-projects/\" rel=\"nofollow\">https://<em>jamesg.blog</em>/2024/02/28/programming-projects/</a> &gt; /tmp/post.page &amp;&amp; man /tmp/post.page<p>What if another user runs the command at the same time, then?<p>Or what if a malicious user creates a 666 mode /tmp/post.page file beforehand, detects when you finish writing to it, then attaches a payload right before `man` reads it?<p>Unfortunately, there is no perfect solution for this problem; I run arbitrary html, css, and javascript every day by browsing the web. It's debatable whether switching to command chains instead of piping results in overall benefits. Of course, the same goes for vice versa as well."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Serving my blog posts as Linux manual pages"},"story_url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"https://<em>jamesg.blog</em>/2024/02/29/linux-manual-pages/"}},"_tags":["comment","author_Crestwave","story_39548410"],"author":"Crestwave","children":[39564236],"comment_text":"&gt; curl -sL -H &quot;Accept: text&#x2F;roff&quot; <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;02&#x2F;28&#x2F;programming-projects&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;02&#x2F;28&#x2F;programming-projects&#x2F;</a> &gt; post.page &amp;&amp; man .&#x2F;post.page &amp;&amp; rm post.page<p>What if I have a post.page in my current directory?<p>&gt; curl -sL -H &quot;Accept: text&#x2F;roff&quot; <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;02&#x2F;28&#x2F;programming-projects&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;02&#x2F;28&#x2F;programming-projects&#x2F;</a> &gt; &#x2F;tmp&#x2F;post.page &amp;&amp; man &#x2F;tmp&#x2F;post.page<p>What if another user runs the command at the same time, then?<p>Or what if a malicious user creates a 666 mode &#x2F;tmp&#x2F;post.page file beforehand, detects when you finish writing to it, then attaches a payload right before `man` reads it?<p>Unfortunately, there is no perfect solution for this problem; I run arbitrary html, css, and javascript every day by browsing the web. It&#x27;s debatable whether switching to command chains instead of piping results in overall benefits. Of course, the same goes for vice versa as well.","created_at":"2024-03-01T09:23:10Z","created_at_i":1709284990,"objectID":"39560112","parent_id":39557740,"story_id":39548410,"story_title":"Serving my blog posts as Linux manual pages","story_url":"https://jamesg.blog/2024/02/29/linux-manual-pages/","updated_at":"2024-09-20T16:31:06Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"godelski"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"1. Regardless, it is bad practice. It isn't a good idea to teach people to pipe downloaded content into any command. Regardless of how naive and safe the command seems. You may not know. Especially considering how you aren't guaranteed to run the full contents and may even run partial lines. Just don't get in the habit of streaming anything into a command. Because you'll be more tempted to stream into a different one which might have issues. Running two commands (or &amp;&amp;) just isn't a big deal. Low cost for high reward.<p>2. The person replying to me mentioned ffmpeg and well... see the reply to them. Parsers may not seem like a big deal, but see this about `cat`[0] or this about `less`[1] (a quick search shows a lot of pipe and pager type of vulnerabilities, including privilege escalation). Programs that look simple and a non-risk are probably actually prime targets for hackers because it can lull someone into a false sense of security.<p>3. You can detect bash piping server side. There's been a bunch of HN and reddit posts, several have been shared already so I won't repeat.<p>I'm sticking to:<p><pre><code>  Friends don't let friends pipe streams into commands\n</code></pre>\nIt's just safer. Risk is pretty low, but does using `&amp;&amp;` or a `;` instead really create a lot more work? How about<p><pre><code>  curl -sL -H &quot;Accept: text/roff&quot; https://<em>jamesg.blog</em>/2024/02/28/programming-projects/ &gt; post.page &amp;&amp; man ./post.page &amp;&amp; rm post.page\n</code></pre>\nThis at least guarantees you don't get a truncated execution.You'll delete the file after you close man. This at least guarantees you don't get a truncated execution. Better if we send to /tmp/post.page and not delete, in case something is fuzzy. Both of these also prevent server side detection and possible tomfoolery. /tmp will be cleared on reboot anyways and it's better to have the file in case something DOES happen.<p><pre><code>  curl -sL -H &quot;Accept: text/roff&quot; https://<em>jamesg.blog</em>/2024/02/28/programming-projects/ &gt; /tmp/post.page &amp;&amp; man /tmp/post.page\n</code></pre>\n[0] <a href=\"https://security.stackexchange.com/questions/56307/can-cat-ing-a-file-be-a-potential-security-risk\" rel=\"nofollow\">https://security.stackexchange.com/questions/56307/can-cat-i...</a><p>[1] <a href=\"https://ubuntu.com/security/notices/USN-6664-1\" rel=\"nofollow\">https://ubuntu.com/security/notices/USN-6664-1</a><p>Edit:<p>groff vulns: <a href=\"https://www.cvedetails.com/vulnerability-list/vendor_id-72/product_id-1066/GNU-Groff.html?page=1&amp;order=3&amp;trc=10&amp;sha=6e4cc7f500802f814752fc1a27a3314fdc0dd07b\" rel=\"nofollow\">https://www.cvedetails.com/vulnerability-list/vendor_id-72/p...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Serving my blog posts as Linux manual pages"},"story_url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"https://<em>jamesg.blog</em>/2024/02/29/linux-manual-pages/"}},"_tags":["comment","author_godelski","story_39548410"],"author":"godelski","children":[39559486,39560112],"comment_text":"1. Regardless, it is bad practice. It isn&#x27;t a good idea to teach people to pipe downloaded content into any command. Regardless of how naive and safe the command seems. You may not know. Especially considering how you aren&#x27;t guaranteed to run the full contents and may even run partial lines. Just don&#x27;t get in the habit of streaming anything into a command. Because you&#x27;ll be more tempted to stream into a different one which might have issues. Running two commands (or &amp;&amp;) just isn&#x27;t a big deal. Low cost for high reward.<p>2. The person replying to me mentioned ffmpeg and well... see the reply to them. Parsers may not seem like a big deal, but see this about `cat`[0] or this about `less`[1] (a quick search shows a lot of pipe and pager type of vulnerabilities, including privilege escalation). Programs that look simple and a non-risk are probably actually prime targets for hackers because it can lull someone into a false sense of security.<p>3. You can detect bash piping server side. There&#x27;s been a bunch of HN and reddit posts, several have been shared already so I won&#x27;t repeat.<p>I&#x27;m sticking to:<p><pre><code>  Friends don&#x27;t let friends pipe streams into commands\n</code></pre>\nIt&#x27;s just safer. Risk is pretty low, but does using `&amp;&amp;` or a `;` instead really create a lot more work? How about<p><pre><code>  curl -sL -H &quot;Accept: text&#x2F;roff&quot; https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;02&#x2F;28&#x2F;programming-projects&#x2F; &gt; post.page &amp;&amp; man .&#x2F;post.page &amp;&amp; rm post.page\n</code></pre>\nThis at least guarantees you don&#x27;t get a truncated execution.You&#x27;ll delete the file after you close man. This at least guarantees you don&#x27;t get a truncated execution. Better if we send to &#x2F;tmp&#x2F;post.page and not delete, in case something is fuzzy. Both of these also prevent server side detection and possible tomfoolery. &#x2F;tmp will be cleared on reboot anyways and it&#x27;s better to have the file in case something DOES happen.<p><pre><code>  curl -sL -H &quot;Accept: text&#x2F;roff&quot; https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;02&#x2F;28&#x2F;programming-projects&#x2F; &gt; &#x2F;tmp&#x2F;post.page &amp;&amp; man &#x2F;tmp&#x2F;post.page\n</code></pre>\n[0] <a href=\"https:&#x2F;&#x2F;security.stackexchange.com&#x2F;questions&#x2F;56307&#x2F;can-cat-ing-a-file-be-a-potential-security-risk\" rel=\"nofollow\">https:&#x2F;&#x2F;security.stackexchange.com&#x2F;questions&#x2F;56307&#x2F;can-cat-i...</a><p>[1] <a href=\"https:&#x2F;&#x2F;ubuntu.com&#x2F;security&#x2F;notices&#x2F;USN-6664-1\" rel=\"nofollow\">https:&#x2F;&#x2F;ubuntu.com&#x2F;security&#x2F;notices&#x2F;USN-6664-1</a><p>Edit:<p>groff vulns: <a href=\"https:&#x2F;&#x2F;www.cvedetails.com&#x2F;vulnerability-list&#x2F;vendor_id-72&#x2F;product_id-1066&#x2F;GNU-Groff.html?page=1&amp;order=3&amp;trc=10&amp;sha=6e4cc7f500802f814752fc1a27a3314fdc0dd07b\" rel=\"nofollow\">https:&#x2F;&#x2F;www.cvedetails.com&#x2F;vulnerability-list&#x2F;vendor_id-72&#x2F;p...</a>","created_at":"2024-03-01T02:11:03Z","created_at_i":1709259063,"objectID":"39557740","parent_id":39556658,"story_id":39548410,"story_title":"Serving my blog posts as Linux manual pages","story_url":"https://jamesg.blog/2024/02/29/linux-manual-pages/","updated_at":"2024-09-20T16:30:48Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"jasomill"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"<p><pre><code>  curl -sL -H &quot;Accept: text/roff&quot; https://<em>jamesg.blog</em>/2024/02/28/programming-projects/ | mandoc -a\n</code></pre>\nworks on macOS (and should also work on (Free|Net|Open)BSD, which ship similar man toolchains)."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Serving my blog posts as Linux manual pages"},"story_url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"https://<em>jamesg.blog</em>/2024/02/29/linux-manual-pages/"}},"_tags":["comment","author_jasomill","story_39548410"],"author":"jasomill","comment_text":"<p><pre><code>  curl -sL -H &quot;Accept: text&#x2F;roff&quot; https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;02&#x2F;28&#x2F;programming-projects&#x2F; | mandoc -a\n</code></pre>\nworks on macOS (and should also work on (Free|Net|Open)BSD, which ship similar man toolchains).","created_at":"2024-02-29T23:58:52Z","created_at_i":1709251132,"objectID":"39556860","parent_id":39554054,"story_id":39548410,"story_title":"Serving my blog posts as Linux manual pages","story_url":"https://jamesg.blog/2024/02/29/linux-manual-pages/","updated_at":"2024-09-20T16:30:41Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"_joel"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"From the post<p>curl -sL -H &quot;Accept: text/roff&quot; <a href=\"https://jamesg.blog/2024/02/28/programming-projects/\" rel=\"nofollow\">https://<em>jamesg.blog</em>/2024/02/28/programming-projects/</a> &gt; post.page &amp;&amp; man ./post.page<p>If curl's process is interupted, it'll generate a non-0 exit code and the man command won't be exectued. That's how double ampersands work in shell."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Serving my blog posts as Linux manual pages"},"story_url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"https://<em>jamesg.blog</em>/2024/02/29/linux-manual-pages/"}},"_tags":["comment","author__joel","story_39548410"],"author":"_joel","children":[39557785],"comment_text":"From the post<p>curl -sL -H &quot;Accept: text&#x2F;roff&quot; <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;02&#x2F;28&#x2F;programming-projects&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;02&#x2F;28&#x2F;programming-projects&#x2F;</a> &gt; post.page &amp;&amp; man .&#x2F;post.page<p>If curl&#x27;s process is interupted, it&#x27;ll generate a non-0 exit code and the man command won&#x27;t be exectued. That&#x27;s how double ampersands work in shell.","created_at":"2024-02-29T23:23:30Z","created_at_i":1709249010,"objectID":"39556551","parent_id":39555529,"story_id":39548410,"story_title":"Serving my blog posts as Linux manual pages","story_url":"https://jamesg.blog/2024/02/29/linux-manual-pages/","updated_at":"2024-09-20T16:30:41Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"zerojames"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"This is now in progress.<p><a href=\"https://github.com/capjamesg/jamesg.blog.deb\">https://github.com/capjamesg/<em>jamesg.blog</em>.deb</a> has all you need to build a man-page-only deb file using:<p>git clone <a href=\"https://github.com/capjamesg/jamesg.blog.deb\">https://github.com/capjamesg/<em>jamesg.blog</em>.deb</a>\ncd <em>jamesg.blog</em>.deb\ndpkg-deb --build --root-owner-group <em>jamesg.blog</em>\nsudo dpkg -i <em>jamesg.blog</em>.deb<p>You should see:<p>...\nProcessing triggers for man-db (2.9.1-1) ...<p>Which indicates the man page for `man <em>jamesg.blog</em>` is available. There is just a placeholder in there for now. I will perhaps finish this tomorrow!<p>NB: This may become a blog post soon :D"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Serving my blog posts as Linux manual pages"},"story_url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"https://<em>jamesg.blog</em>/2024/02/29/linux-manual-pages/"}},"_tags":["comment","author_zerojames","story_39548410"],"author":"zerojames","children":[39559341],"comment_text":"This is now in progress.<p><a href=\"https:&#x2F;&#x2F;github.com&#x2F;capjamesg&#x2F;jamesg.blog.deb\">https:&#x2F;&#x2F;github.com&#x2F;capjamesg&#x2F;jamesg.blog.deb</a> has all you need to build a man-page-only deb file using:<p>git clone <a href=\"https:&#x2F;&#x2F;github.com&#x2F;capjamesg&#x2F;jamesg.blog.deb\">https:&#x2F;&#x2F;github.com&#x2F;capjamesg&#x2F;jamesg.blog.deb</a>\ncd jamesg.blog.deb\ndpkg-deb --build --root-owner-group jamesg.blog\nsudo dpkg -i jamesg.blog.deb<p>You should see:<p>...\nProcessing triggers for man-db (2.9.1-1) ...<p>Which indicates the man page for `man jamesg.blog` is available. There is just a placeholder in there for now. I will perhaps finish this tomorrow!<p>NB: This may become a blog post soon :D","created_at":"2024-02-29T21:30:18Z","created_at_i":1709242218,"objectID":"39555396","parent_id":39553082,"story_id":39548410,"story_title":"Serving my blog posts as Linux manual pages","story_url":"https://jamesg.blog/2024/02/29/linux-manual-pages/","updated_at":"2024-09-20T16:30:35Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"Gormo"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"There's no need to fork or use an intermediate file; you can just pipe straight into `man`:<p>`curl -sL -H &quot;Accept: text/roff&quot; <a href=\"https://jamesg.blog/2024/02/28/programming-projects/\" rel=\"nofollow\">https://<em>jamesg.blog</em>/2024/02/28/programming-projects/</a> | man -l -`"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Serving my blog posts as Linux manual pages"},"story_url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"https://<em>jamesg.blog</em>/2024/02/29/linux-manual-pages/"}},"_tags":["comment","author_Gormo","story_39548410"],"author":"Gormo","children":[39554195,39556047],"comment_text":"There&#x27;s no need to fork or use an intermediate file; you can just pipe straight into `man`:<p>`curl -sL -H &quot;Accept: text&#x2F;roff&quot; <a href=\"https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;02&#x2F;28&#x2F;programming-projects&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;02&#x2F;28&#x2F;programming-projects&#x2F;</a> | man -l -`","created_at":"2024-02-29T19:47:50Z","created_at_i":1709236070,"objectID":"39554085","parent_id":39548410,"story_id":39548410,"story_title":"Serving my blog posts as Linux manual pages","story_url":"https://jamesg.blog/2024/02/29/linux-manual-pages/","updated_at":"2024-09-20T16:30:29Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"salviati"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"You can save a few chars with a process sostitution instead of a pipe if you're using bash:<p><pre><code>    man -l &lt;(curl -sL -H &quot;Accept: text/roff&quot; https://<em>jamesg.blog</em>/2024/02/28/programming-projects/)</code></pre>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Serving my blog posts as Linux manual pages"},"story_url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["jamesg",".","blog"],"value":"https://<em>jamesg.blog</em>/2024/02/29/linux-manual-pages/"}},"_tags":["comment","author_salviati","story_39548410"],"author":"salviati","children":[39553869,39554728],"comment_text":"You can save a few chars with a process sostitution instead of a pipe if you&#x27;re using bash:<p><pre><code>    man -l &lt;(curl -sL -H &quot;Accept: text&#x2F;roff&quot; https:&#x2F;&#x2F;jamesg.blog&#x2F;2024&#x2F;02&#x2F;28&#x2F;programming-projects&#x2F;)</code></pre>","created_at":"2024-02-29T19:24:39Z","created_at_i":1709234679,"objectID":"39553839","parent_id":39552852,"story_id":39548410,"story_title":"Serving my blog posts as Linux manual pages","story_url":"https://jamesg.blog/2024/02/29/linux-manual-pages/","updated_at":"2024-09-20T16:30:22Z"}],"hitsPerPage":20,"nbHits":208,"nbPages":11,"page":0,"params":"query=jamesg.blog&advancedSyntax=true&analyticsTags=backend","processingTimeMS":38,"processingTimingsMS":{"_request":{"roundTrip":20},"afterFetch":{"format":{"highlighting":1,"total":1},"merge":{"mergeLoop":{"prepareNextHit":1,"total":1},"total":1},"total":1},"fetch":{"query":6,"scanning":29,"total":36},"total":38},"query":"jamesg.blog","serverTimeMS":40}
