Top all-time · #2415
Chris Morgan
Personal blog · chrismorgan.info · on HN as chrismorganprogrammingwebphilosophy
Chris Morgan's personal blog at chrismorgan.info covers programming, web and philosophy. Since 2013, 34 different Hacker News readers have linked it 111 times, most often “Why your first FizzBuzz implementation in Rust may not work”. It is still writing: the last post was on 2026-05-16, and you can follow it by feed.
I’m a software developer by trade and a Christian by life.
Most-linked posts?
- Why your first FizzBuzz implementation in Rust may not work7 people · 14 mentions · first linked 2020-03-25
- I've Banned Query Strings5 people · 5 mentions · first linked 2026-05-08
- Rust Ownership from the Hard Way3 people · 3 mentions · first linked 2021-02-21
- Rust ownership, the hard way3 people · 3 mentions · first linked 2015-05-12
- Why your first Rust FizzBuzz implementation may not work3 people · 3 mentions · first linked 2014-10-12
- The Unlicense is an inferior license wrapped in an atrocious name2 people · 5 mentions · first linked 2022-03-04
- /2 people · 3 mentions · first linked 2021-08-24
- Font-Family Recommendations2 people · 2 mentions · first linked 2026-06-25
- Atom is better than RSS, in ways that matter2 people · 2 mentions · first linked 2026-08-01
- A few ways of specifying per-theme colours in only CSS2 people · 2 mentions · first linked 2026-05-16
What Hacker News says?
Related to this, alpha channels can be very useful in writing a single colour that appears as different colours against known dark and light colours. For example, see the mention of #8888 in https://chrismorgan.info/blog/dark-theme-implementation/ , where that #8888 becomes effectively #bfbfbf against white, and #484848 against black.
Comment linking /blog/dark-theme-implementation/
on “My Current HTML Boilerplate”Submitted Using `make` and `git diff` for a simple and powerful test harness as a story · 239 points
HN discussionHere’s an example on my site: https://chrismorgan.info/blog/rust-fizzbuzz/ That’s left-aligned (margin-left: 0; margin-right: 0) rather than centre-aligned (margin-left: auto; margin-right: auto), but it gets the point across. Headings, paragraphs, list items, &c. all get their widths constrained (deliberately to different points, in my case, which wouldn’t work if you were going centre-aligned), but figures can be…
Comment linking /blog/rust-fizzbuzz/
on “Full-Bleed Layout Using CSS Grid”Submitted Why your first Rust FizzBuzz implementation may not work as a story · 183 points
HN discussionMy own website has a dark theme if you have @media (prefers-color-scheme: dark), or if JavaScript is enabled, there’s a switcher in the top right hand corner. Note however that I use Triplicate T3 in the dark theme (300/700 for regular/bold), compared with Triplicate T4 in the light theme (400/700). You can fiddle with the @font-face declarations in dev tools (the font change happens in 2019b-dark.css) if you want t…
Comment linking /blog/rust-fizzbuzz/
on “Dev Fonts”Submitted Say “no” to import side‐effects in Python as a story · 148 points
HN discussionI agree with you and do consider the default l glyph to be a poor choice, insufficiently distinct from 1. Fortunately, the Code variant of the font goes for a curved tail on l, so that it’s sufficiently distinct. (However, if you try to enable both the Code and Poly features—Poly meaning “don’t be a true monospace, make characters like l and i a little narrower and characters like m a little wider”—you end up with a…
Comment linking /blog/make-and-git-diff-test-harness/
on “Dev Fonts”Submitted The Unlicense is an inferior license wrapped in an atrocious name as a story · 123 points
HN discussionThere are already a number of libraries and frameworks that implement an HTTP setver in Rust, though things seem to be coalescing around Teepee. http://chrismorgan.info/blog/introducing-teepee.html#main There are few REST api libraries as well.
Comment linking /blog/introducing-teepee.html
on “The Road to Rust 1.0”Submitted Make me a sandwich as a story · 62 points
HN discussion1–4 are good, but 5 is not. The checkbox hack is decent in a few places (though I’d say <details> is normally a better choice now, and the checkbox hack should be accompanied by certain ARIA properties and augmented with some JavaScript to twiddle properties as it’s used), but dark mode is not one of them. The checkbox hack is only suitable for transient state that you actively don’t want to persist over page loads.…
Comment linking /blog/dark-theme-implementation/
on “Things you don't need JavaScript for”Submitted Introducing Teepee: the next step for rust-http as a story · 43 points
HN discussionI recently added dark mode support with a new website for myself, using (prefers-color-scheme: dark) by default, but also allowing the user to switch between light and dark mode if they have JavaScript enabled. It also supports switching image sources in dark mode, so that I can use a dark mode screenshot in dark mode, and light in light. (I haven't yet published the draft article I have using this feature.) I wrote…
Comment linking /blog/dark-theme-implementation/
on “Dark mode in a website with CSS”Submitted GitHub: a case study in link maintenance and 404 pages as a story · 36 points
HN discussionThe treatment of <samp> in mvp.css is incorrect. It’s treating <code> as inline monospace, <samp> as block monospace, and completely ignoring <pre>, which is actually block monospace (with no defined semantics). Rather, <code> and <samp> should both be inline, and placed inside <pre> for block usage. This matters because it’ll mess things up if the stylesheet doesn’t load, as your blocks of code won’t be formatted p…
Comment linking /blog/rust-fizzbuzz/
on “Show HN: MVP.css – Minimalist stylesheet for HTML elements”Submitted Rust ownership, the hard way as a story · 4 points
HN discussionMy own summary and collection of information about the problems with the Unlicense: https://chrismorgan.info/blog/unlicense/ (I collected that mostly because I didn’t find all the relevant information in one place, or explanation of the reasonable alternatives.)
Comment linking /blog/unlicense/
on “Jiff: Datetime library for Rust”Submitted Teepee design: header representation as a story · 4 points
HN discussionUnfortunately applying both Poly and Code gives you an imperfect result: the default l glyph has a flat base, Poly makes it narrower, and Code makes it a curly tail, but enable both (e.g. font-feature-settings: "ss01", "ss02") and you get the Poly glyph rather than the Code glyph or a hybrid, both of which would be nicer, and MB has said “won’t fix” (and I haven’t gone to the trouble of patching it myself). A demo o…
Comment linking /blog/rust-fizzbuzz/
on “Almost monospaced: the perfect fonts for writing”Submitted Rust ownership, the hard way as a story · 3 points
HN discussionI’m disappointed that this uses a custom XML format, rather than RSS (tolerable) or Atom (better). Then you could just drop it into a feed reader fine. A few years ago, I decided to style my own feeds, and ended up with this: https://chrismorgan.info/blog/tags/fun/feed.xml . https://chrismorgan.info/atom.xsl is pretty detailed, I don’t think you’ll find one with more comprehensive feature support. (I wrote a variant…
Comment linking /atom.xsl
on “XSLT – Native, zero-config build system for the Web”Submitted Tween: a middleware library experiment as a story · 3 points
HN discussionI adore that someone like Armin is so delighted to use Rust. From what I've seen of Flask and his other Python libraries, the level of consideration that he devotes to API design is absolutely inspiring. At such an early stage in the language's history, I'm optimistic that his thoughtfulness in API design will become the baseline for the entire Rust ecosystem. In this vein, I'd also like to credit Chris Morgan's Tee…
Comment linking /blog/introducing-teepee.html
on “A Fresh Look at Rust”Submitted Rust ownership, the hard way as a story · 3 points
HN discussionFun related fact people may not be aware of: you can do basically this with arbitrary XML files, defining a stylesheet which transforms the XML into HTML however you like using XSLT. As an example, Atom feeds on my website (such as < https://chrismorgan.info/blog/tags/meta/feed.xml >) render just fine in all mainstream browsers, thanks to this processing instruction at the start of the file: <?xml-stylesheet type="t…
Comment linking /blog/tags/meta/feed.xml
on “We should have Markdown-rendered websites”Submitted Teepee design: a careful look at the HTTP/1.1 Status-Line as a story · 3 points
HN discussionI’ve consistently used &c. (almost always in italics, too, as was the custom due to the convention of italics for foreign language words, but especially also because it yields even prettier results in many fonts—the “et” is more likely to come through in italics¹) for 8½ years now.² I’ve only been asked about it twice (once “what is that?” and once “I think you made a typo”), though I’ve probably confused or surpris…
Comment linking /blog/rust-fizzbuzz/
on “The History of ‘Ampersand’ (2020)”Submitted Font-Family Recommendations as a story · 2 points
HN discussionPretty much all of it. For example, let's take http://chrismorgan.info/blog/teepee-design-header-representa... impl<'a> AnyRefExt<'a> for &'a Header { #[inline] fn as_ref<T: 'static>(self) -> Option<&'a T> { trait UncheckedAnyRefExt<'a> { unsafe fn as_ref_unchecked<T: 'static>(self) -> &'a T; } //I am guessing the second line is special because Rust can't deduce "to" should be a TraitObject type? let raw = require_s…
Comment linking /blog/teepee-design-header-representation.html
on “The Unreasonable Effectiveness of C (2013)”Submitted Font-Family Recommendations as a story · 2 points
HN discussion