[HN Gopher] Rewriting my blog in Rust for fun and profit
       ___________________________________________________________________
        
       Rewriting my blog in Rust for fun and profit
        
       Author : lawn
       Score  : 155 points
       Date   : 2022-08-29 14:24 UTC (8 hours ago)
        
 (HTM) web link (www.jonashietala.se)
 (TXT) w3m dump (www.jonashietala.se)
        
       | Tesl wrote:
       | This is a cool idea, I've wanted to find a Rust project for a
       | while and regenerating my own site (which uses jekyll) might not
       | be a bad idea too. Every time I come back to mine it never works
       | because it always complains about the wrong ruby library versions
       | being installed.
        
         | bbkane wrote:
         | I switched from Jekyll to Zola because of my difficulty running
         | Jekyll locally too. I chose Zola because it's a single binary
         | and its template language (Tera) is similar to Jekyll's so my
         | blog was fairly easy to port.
        
       | jasonjmcghee wrote:
       | Great post- great project. Always fun to see someone building
       | something (from scratch!) that filled a need they personally had.
        
       | heurisko wrote:
       | > On my crappy laptop a full site rebuild took 75 seconds. (Not
       | compile, just to generate the site.) I only have 240 posts so I
       | don't think it should be that slow.
       | 
       | Wow, what on earth was Hakyll doing all that time?
        
       | manholio wrote:
       | Why even bother with a static generator when you can run rust
       | code at essentially wire speed and dynamically generate all the
       | required formatting on the fly?
       | 
       | Because Rust binaries are so secure, you can expose them over the
       | internet safely. With a little bit of glue, you can automatically
       | recompile the CGI binary every time the rs source is touched, for
       | a dev experience similar to interpreted web scripts.
        
       | brabel wrote:
       | Don't forget to throw your static site generator on the pile:
       | https://jamstack.org/generators/
       | 
       | 347 options and counting!
        
       | munificent wrote:
       | I also rewrote my blog's static site generator to a bespoke one
       | (in Dart in my case), largely for performance reasons. Prior, I
       | was using Jekyll and Pygments. Jekyll and Pygments are _really_
       | slow. My new site generator is literally 100x faster, and I did,
       | like, zero real optimization work. In fact, it can rebuild my
       | entire blog and every post from scratch faster than Jekyll 's
       | watch mode (with caching set up properly) could rebuild a single
       | page.
        
         | Keats wrote:
         | I wrote Zola because at that time I was using Hugo + Pygments
         | and while Hugo was fast, Pygments was the opposite. I'm pretty
         | sure Zola can build a 1k page website with syntax highlighting
         | faster than Pygments can highlight 20 pages.
        
       | impoppy wrote:
       | I've been trying to make a cool static site generator numerous
       | times. Well, yes, it actually is a quite fun thing to tinker
       | with, but I've found myself struggling to decide on what do I
       | want to see in the final app and what I do not; what features
       | might be needed by other users and what features might be an
       | overkill. So I ultimately went with Zola[1] and encourage you to
       | try it too! Aaaand it is written in Rust, too. It's available in
       | Alpine Linux's repos so it's trivial to set up a CI/CD to compile
       | your blog.
       | 
       | [1] https://www.getzola.org/
        
         | nivenkos wrote:
         | I'm literally in the process of porting my blog to Zola right
         | now (from Octopress).
         | 
         | One issue I hit is that taxonomies aren't available at the
         | section-level (nor are they section-specific, in case you want
         | to treat sections as sub-sites), this makes it seemingly
         | impossible to have a section taxonomy view.
         | 
         | I might try to patch it, but it's tricky as it's like merging
         | the taxonomy code with the page and section rendering.
        
         | ignite wrote:
         | My static site generate is enough python to invoke mustache on
         | every file in a directory. Maybe 70 lines
         | 
         | That's it.
         | 
         | Works fine.
         | 
         | Not everything is improved by creeping featuritis.
        
         | asicsp wrote:
         | I moved from Jekyll to Zola and it's been great until I started
         | tinkering with templates and stuff recently. Single binary and
         | simple themes were main reasons to choose this. Wanted a
         | feature that wasn't present in the version I started with
         | (about 2 years ago). So, I got the newest version and a few
         | things broke subtly (ex: syntax highlighting). Which led me to
         | tinkering (I don't know much about HTML/CSS/etc).
         | 
         | It was actually good to try a few things almost blindly and
         | then slowly narrowing with a bit more thought process. Been a
         | long time since I had such fun investigating unknown codebase.
         | This even helped me move my post processing scripts to
         | templates. And then I went a step further by reading about meta
         | tags (things like image, description, etc) and adding them via
         | an extra variable in the post frontmatter.
        
           | impoppy wrote:
           | That's exactly why I never used Jekyll and don't really
           | understand people that use it nowadays. It is AWFUL. Not only
           | it uses greatly outdated Ruby, you also HAVE to install
           | outdated Ruby on your machine to play with themes, serve,
           | compile and are forced to use RVM. I know GitHub Pages can
           | compile the page for you, but when you want to customize a
           | theme you have to go through all that hell. It's just a
           | terrible experience. And installing plugins is another hell.
        
             | BrandonS113 wrote:
             | I use Jekyll for a few sites and it works perfectly. Design
             | is bootstrap and so nothing to do with Jekyll and it always
             | compiles the site, takes a few seconds. Works fine on my
             | mac and linux.
             | 
             | Would I have picked Jekyll today? no. Is it worth the cost
             | of switching? no.
        
         | burntsushi wrote:
         | I plan on writing a static site generator soon myself. And I
         | briefly wondered the same thing and realized that I could very
         | easily answer that question: ruthlessly build whatever I
         | personally need and not what others need. I don't _usually_
         | follow that line of thinking, but the static site generator
         | space is so full of so many great tools that I don 't think
         | there's really anything for me to contribute to it.
         | 
         | Instead, I think the killer feature of my static site generator
         | is going to be exactly what makes it difficult for others to
         | use: its tight coupling with my specific use case. I'll be able
         | to hard-code configuration knobs. Avoid dealing with edge
         | cases. Bake strange non-generic and single-blog-post-specific
         | logic right into the tool.
         | 
         | (The reason why I want to build my own is because I've tried
         | using someone else's. And I just keep getting bitten: someone
         | else's tool gets so big and moves so rapidly, that by the time
         | I get around to updating my site, _something_ about the new
         | version of the tool has broken the way my web site works. And
         | then I usually have to spend hours figuring out how to fix it,
         | which is hugely deflating because I had just worked up the
         | energy to write a new post. My naive belief is that if I have
         | my own tool that evolves at precisely the pace I want it to, I
         | won 't run into that specific problem. I'll run into other
         | problems of course, but I'm thinking that I'll prefer those
         | problems to the ones I currently face.)
        
           | jeffparsons wrote:
           | I've just started to take that approach (exactly what I need,
           | no more, no less) with personal process automation, and it's
           | really working for me.
           | 
           | I made a few attempts in the past at building more general-
           | purpose tools that would cover my use cases, but I've never
           | followed through on them. Too much of the work was in the
           | bits that don't actually benifit me right now.
           | 
           | My new tool is simply called "Other Jeff". I write onto it
           | what I need right now. Do I have a series of pull requests
           | that need babysitting to get them over the line? Other Jeff
           | learns to poll their status and notify me of important events
           | along the way. If I want to store some state about what I'm
           | working on right now, I need a database of some kind, right?
           | Nope. Not any more. I hard-code it into `db.rs`, because it
           | turns out there's almost nothing I need to persist that's too
           | burdensome to update by hand.
           | 
           | So what I have in the end is a single Rust program that grows
           | and shrinks depending on my needs at the time, accumulates
           | reusable helpers if and when they actually make sense for
           | _me_, and slowly learns to automate more of my daily
           | distractions.
        
           | epage wrote:
           | You should check out what fasterthanlime does for their blog.
           | Theirs uses sqlite for storing all state and the write
           | plugins into the Rust Liquid template implementation to
           | directly query sqlite so they could do whatever they wanted
           | without recompiling. It was pretty neat.
           | 
           | I have been looking to break out parts of static-site-
           | generators to make it easier to bring one up. So far I only
           | have two primitive building blocks
           | 
           | - https://docs.rs/engarde/latest/engarde/ -
           | https://docs.rs/file-serve/latest/file_serve/
        
             | burntsushi wrote:
             | My needs are far simpler than that. I don't need state. I
             | don't need dynamic content. I don't need ads. I don't need
             | tracking. I don't need search. I just need a way to publish
             | content and maybe an RSS feed. It doesn't even need to
             | serve files. Everything is static. (I'm not saying
             | fasterthanlime has all those things. Just saying what I
             | don't need.)
             | 
             | I can't even imagine I need a template system beyond
             | something I can write in a few dozen lines with some
             | regexes.
             | 
             | I did the SQLite thing more than a decade ago. I ain't
             | going back to it unless I have a really really good reason
             | for it.
             | 
             | I really just need a purely static web site where I can
             | write Markdown posts. There's some other stuff I want in
             | terms of producing the static content, but in terms of web
             | site functionality itself, it should just be HTML, CSS and
             | some images.
             | 
             | I also don't mind re-compiling. For my needs, "compiling"
             | my web site is likely to take less than 1 second.
             | 
             | Definitely don't need plugins. :)
        
               | pdimitar wrote:
               | I plan on trying https://luapress.org/ one of the next
               | weeks. Looks good at a first glance -- give it a quick
               | check if you get a free hour, would be interested what
               | you think of it.
        
               | burntsushi wrote:
               | I don't have a free hour unfortunately. And I know I'm
               | not going to use that because I don't want to setup a Lua
               | environment. Indeed, I have enough Lua experience to know
               | that they break the language in big ways for what seems
               | like every release. That's a liability. What happens when
               | luapress stops getting regular maintenance and the
               | version of Lua it uses is no longer packaged in my Linux
               | distro? Oops. Ticking time bomb.
               | 
               | I meant it. I'm done with static site generators built by
               | others. They have caused me too much pain.
               | 
               | EDIT: That "oops" is already reality:
               | https://github.com/Fizzadar/Luapress#luapress-v4
               | 
               | Static site generators are just too easy to build and too
               | easy to let die. And the ones that don't die grow big and
               | bloated. That's my experience. The only remedy I see is
               | to build my own and simplify ruthlessly through tight
               | coupling.
               | 
               | "You either live long enough to see yourself become the
               | villain, or you die a hero."
        
           | gamegoblin wrote:
           | I've done exactly what you describe and I highly recommend
           | it.
           | 
           | My personal website is served by a couple hundred lines of
           | Rust. There is no database or ORM -- I just defined structs
           | like `BlogPost` or whatever and stuck a `#[derive(Serialize,
           | Deserialize)]` on it and use the `serde` library to JSONify
           | it, store it flat in a hard-coded folder.
           | 
           | I even wrote my own dead-simple Markdown-ish flavor that is
           | tailored exactly to my writing style. I use a lot of em-
           | dashes, for example, so it translates `--` into `--` (rather,
           | &mdash). Or, since a lot of my posts link to other posts, I
           | can do `[post title_of_other_post]` and it'll generate the
           | appropriate link.
           | 
           | Whenever I want a new feature while writing a particular blog
           | post, e.g. pretty inline SVG, I just go add it and then keep
           | writing.
        
           | kaashif wrote:
           | I just wrote like a Perl script that generates my site. It's
           | just printing stuff and converting markdown to HTML, right?
           | Never breaks, never changes, does exactly what I need it to.
           | 
           | Presumably there are reasons people want to use more
           | specialised tools, but I don't have any of those.
        
           | yakubin wrote:
           | I went this route. At first I tried writing a bunch of Python
           | scripts reading a YAML manifest. However, after ~2 weeks I
           | already got warnings and errors about things which got
           | deprecated/removed/changed by a new Python version and the
           | YAML library I was using. So I dumped it and rewrote the
           | thing in XML and XSLT. It's been working for a couple years
           | with no breakages. Essentially 0 maintenance after the
           | initial work. This design was about generating a tree of
           | directories with Markdown files turned into HTML, PDF files
           | turned into pages linking to them, and some directory
           | renames, GUIDs and dates (for Atom feeds, which I generate
           | for each directory) specified in a manifest file.
           | 
           | I've since taken up photography, so now I need to
           | automatically read metadata from jpegs, add some tags and
           | organise it on the site in albums. It's a bit outside the
           | reach of XSLT, so first I've tried using Python with Jinja2
           | and PIL. Same problem as previously. So I've rewritten it in
           | Go with the help of encoding/json (for the manifest),
           | html/template (for the template), image/jpeg,
           | golang.org/x/image/draw (for generating thumbnails of
           | different sizes for different screen sizes) packages and
           | exiftool (reading and removing EXIF tags). Pandoc has been
           | present throughout all the rewrites, because I like its
           | flavour of Markdown and options to shift heading levels by a
           | specified value, so that they fit in with the surrounding
           | template. I'm putting some finishing touches and am going to
           | upload it in the coming days.
           | 
           | I know, you stopped reading at "XSLT". :D
        
           | qudat wrote:
           | We think alike. I started out with Hugo because it's very
           | popular and relatively easy to use. It has a bunch of
           | features that I had to read about but didn't have a use for
           | -- overhead.
           | 
           | One of the most annoying aspects of working with hugo was the
           | friction from idea to publishing it.
           | 
           | I decided to go a completely different route and built
           | https://prose.sh
           | 
           | With prose all I have to do is to create a markdown file and
           | then `scp` it to prose.sh. The platform takes care of the
           | rest and I can still enjoy my own editor and terminal
           | tooling. Even better, authentication happens via SSH so the
           | friction is extremely low.
           | 
           | It's a nice balance between writing a blog on a platform that
           | does everything for you and being able to use my own tooling
           | to write content.
           | 
           | Another big issue with Hugo is when I want to make edits to
           | the content. My brain is weird and I only scrutinize my
           | content after it has been published. So I end up making a lot
           | of edits after an article has been live for a few minutes.
           | It's a terrible habit and Hugo required deployment for every
           | little change.
           | 
           | I've thought about converting prose to be SSG -- we could
           | generate the html when a user uploads the file -- but
           | honestly the site is fast as it is so I don't see the value
           | in that added complexity.
        
             | majou wrote:
             | Tangentially related: the delay field in your hn profile
             | will hide your comment for n minutes for you to make edits.
             | 
             | I always set mine to 2.
        
             | daretorant wrote:
             | Nice! I have a Hugo site I've tweaked over the years, and
             | my workflow is similar to yours. I create/edit an MD file,
             | then run a shell command which pushes changes to Github,
             | which triggers a redeploy.
             | 
             | How do you handle images? That's my main annoyance /
             | biggest hurdle when publishing. I have to take each image,
             | resize it for web, put it in static folder, and reference
             | that pathname in the MD file. Not a big deal, but would
             | love an easier way. I suppose I could write a simple shell
             | script that does all of the resizing and prints out a path
             | back for me to use.
        
               | qudat wrote:
               | We are working on https://imgs.sh which will try to make
               | optimizing for web automatic as well as making it easy to
               | reference images from your blog.
        
               | phlip9 wrote:
               | btw the example image (https://erock.imgs.sh/t/iceland)
               | 404's :(
        
           | rumblings wrote:
           | This. All the big static generators in the market are kinda
           | of generic enough that they demand upfront investment from
           | you. Whether its Jekyll, Hugo or any big shot you have to fit
           | a lot of things according to them. My personal website is
           | built by Jekyll, but I finding a lot harder to make changes
           | because I am not comfortable with a Ruby tooling( Once, I had
           | to debug an obscure Ruby related bug in M1 Mac). I am
           | comfortable with Python though( I have considerable
           | proficiency and good documentation) which then I will use it
           | for my own static generator.
           | 
           | I guess writing your own non-generic own-static generator
           | should be relatively easy and worth the effort as you
           | wouldn't have to read some obscure documentation (like
           | Jekyll).
        
           | a1369209993 wrote:
           | > And I just keep getting bitten: someone else's tool gets so
           | big and moves so rapidly, that by the time I get around to
           | updating my site, [ _]something about the new version of the
           | tool has broken the way my web site works. And then I usually
           | have to spend hours figuring out how to fix it[_ ], which is
           | hugely deflating because I had just worked up the energy to
           | write a new post. My naive belief is that if I have my own
           | tool that evolves at precisely the pace I want it to, I won't
           | run into that specific problem. I'll run into other problems
           | of course, but I'm thinking that I'll prefer those problems
           | to the ones I currently face.
           | 
           | This is true, as a general principle, not just of static site
           | generators, but of all software, and is one of the major
           | Reasons Why We Can't Have Nice Things, and why automatic
           | updates are evil and poisonous, and manual updates dangerous
           | and often-avoided. See eg https://jacquesmattheij.com/why-
           | johnny-wont-upgrade/.
        
             | burntsushi wrote:
             | > but of all software
             | 
             | I don't think so. There's lots of software that I've used
             | and upgraded for decades and rarely if never run into any
             | issues.
             | 
             | I don't think it's a general principle. I don't like
             | generalizing to "all" unless I have a really good reason to
             | do so. Instead, I stuck to my specific experience with
             | static site generators.
        
           | impoppy wrote:
           | Sounds cool, I hope one day I stumble upon your article that
           | utilizes those very custom hard-coded knobs. Yet I wouldn't
           | make a tool like that since tools should be KISS.
        
             | burntsushi wrote:
             | KISS is exactly my point. :)
        
         | sureglymop wrote:
         | I ended up making mine with Pandoc + Make. At first i used
         | Nextjs and Remark/Unifiedjs but then I had a realization that
         | all that is not even needed.
        
         | Keats wrote:
         | > I've found myself struggling to decide on what do I want to
         | see in the final app and what I do not; what features might be
         | needed by other users and what features might be an overkill.
         | 
         | It's tricky. You can't accept all the features otherwise you
         | just have a mess. At the same time you need to also
         | add/supports features that a lot of people want but _you_
         | personally don't need if you want the tool to be used by more
         | than 1 person. For example with SSG I don't use themes, I just
         | write my own templates for every site. Despite that I still
         | added it to Zola because _most_ people want themes. Some people
         | will not be happy when you say no to some features they want
         | but hey, it 's open-source they can always fork it.
        
         | alphachloride wrote:
         | I went with Hugo. It is written in Go.
         | 
         | If I were to make my own generator from scratch, I'd go with
         | python. It's the language I work with the most. A lot of my
         | blog content will be generated from python (figures etc) or
         | will show python code. So having a site generator in the same
         | language can help me add features by hacking on the generator
         | code in a way that a single binary cannot.
        
           | ducharmdev wrote:
           | I went with Hugo too. I used Gatsby in the past, but it was
           | slower and it felt a bit odd using GraphQL in the way it
           | does. Maybe that'd make more sense if I was using an API to
           | deliver content, but for simple markdown pages, it seemed
           | unnecessary.
        
           | impoppy wrote:
           | On the other hand, having single binary is good because you
           | don't have to install the runtime to tinker with the tool.
           | Yet I do agree that tinkering options are very limited in
           | comparison.
        
           | Macha wrote:
           | I migrated from Pelican (Python) to Zola (Rust) because of
           | the ease of replication of the environment. After a few years
           | it was a pain to recreate my pelican environment and even the
           | tools I'd used to try make that situation easier (pipenv)
           | were undergoing their own bitrot.
        
         | cletus wrote:
         | Finding a good static site generator wasn't really the author's
         | point. It was more for the fun of writing something in Rust.
         | 
         | But I appreciate the link to Zola. I haven't looked in this
         | space for awhile and it looks good.
        
           | impoppy wrote:
           | You're welcome! Just wanted to share what did I come to in
           | the end following the same route.
        
       | AceJohnny2 wrote:
       | I'm seeing a few too many comments about static site generators
       | rebuilding _everything_ on a change.
       | 
       | Have the tenets of Make (and the like) from over 40 years ago
       | been forgotten?
       | 
       | I guess maintaining a dependency graph just isn't a high priority
       | feature for site generators.
        
         | pitaj wrote:
         | For something run relatively infrequently, I can see why it
         | wouldn't be a huge priority.
         | 
         | On that topic, I wish there was a generic build system like
         | SCons written in something faster. Maybe there is (does Bazel
         | fit my bill?) and I just don't know of it yet. What I love best
         | about SCons is that you can just write custom builders right
         | there. No need to drop in a shell script - you have the much
         | better Python standard library at your fingertips. This also
         | means it's way easier to make cross-platform.
        
         | vkou wrote:
         | Computers are fast, sites get updated infrequently, and
         | compiling a static site is a lot less computational work than
         | dealing with the utter *********** that is C++ templates.
         | 
         | Unless you're 'web-scale', it's complexity that doesn't solve
         | any particular business need.
        
       | marosgrego wrote:
       | If you're interested in this, a while ago, for my personal photo
       | site with image galleries[1], I wrote a fast static site
       | generator in Rust[0], which also supports plugins now.
       | 
       | [0] https://www.getblades.org
       | 
       | [1] https://grego.site/photo
        
       | benreesman wrote:
       | It's refreshing to see a front-page Rust piece that just nails it
       | on promoting the language.
       | 
       | It cites concrete examples of where the rubber really meets the
       | road: e.g. Cargo as a one-stop-shop for platform insensitive,
       | "just works" build and dep management.
       | 
       | It acknowledges that it's ok for fun and novelty to be features,
       | which it is!
       | 
       | It steers _well clear_ of A  >> B nonsense. No preachy TED talk
       | about memory safety.
       | 
       | It's respectful of the value that other languages provide in
       | their respective niches.
       | 
       |  _This_ is how to sell Rust. It's novel and fun but also
       | pragmatic and industrial grade! And if you're into X, that's cool
       | too!
        
         | taftster wrote:
         | Your comment helped me want to click through and read the post.
         | I'm very tired of all the recent Rust fanboy posts, but level-
         | headed and earnest comparisons against real implementations
         | make for much better understanding of a new concept or
         | language.
         | 
         | Here are some select quotes from the article:
         | 
         |  _> Please note that this is not to say that Rust this [sic]
         | much faster than Haskell, instead see it as a comparison of two
         | implementations. I'm sure someone could make it super fast in
         | Haskell._
         | 
         |  _> I don't think it means that Rust is simpler or easier than
         | Haskell, it just means that I personally had an easier time to
         | grok Rust than Haskell._
        
           | pdimitar wrote:
           | I religiously refresh HN the last few months and I've seen
           | exactly zero "fanboy" Rust articles. All of them outline what
           | was gained by a switch to it and what problems were
           | eliminated. The better ones also list tradeoffs i.e. they say
           | what got a bit harder, too.
           | 
           | Maybe you just have an axe to grind?
        
           | benreesman wrote:
        
             | nindalf wrote:
             | You're really going to call people jihadis for talking
             | about the technical strengths of a programming language?
             | 
             | And then you're going to act like you're the self appointed
             | arbiter of discourse on HN, saying that this kind of
             | article is ok but that kind isn't? Maybe a person who calls
             | those they disagree with jihadis isn't qualified to police
             | what others say.
             | 
             | Let's talk about the way _you_ talk. Here's you from 5 days
             | ago accusing a good tool of being a "dumpster fire" and
             | saying "it crashes process IDs more often than Justin
             | Bieber crashes Maseratis".
             | (https://news.ycombinator.com/item?id=32581005). But it
             | gets worse, because later you start crying about being
             | downvoted.
             | 
             | At this point it looks like a speed run of how many HN
             | rules you can break. And then you follow that up with tone
             | policing others.
        
               | adamdusty wrote:
               | While his vocabulary might be a inflammatory, it's hard
               | to argue that any language has an evangelistic community
               | anywhere near the level of rust's. No other community is
               | pushes their favorite language for every single use case.
               | No other language has a rewrite it in rust meme. No other
               | language attacks people for unsafe code.
        
               | nindalf wrote:
               | You want to see criticism of Rust? Here's the best, most
               | accurate criticism of Rust, written by avid Rustaceans.
               | 
               | - Why Not Rust?
               | (https://matklad.github.io/2020/09/20/why-not-rust.html)
               | 
               | - A Rust match made in hell
               | (https://fasterthanli.me/articles/a-rust-match-made-in-
               | hell)
               | 
               | Compare these with the superficial criticism that
               | benreesman was making. He couldn't even link to the
               | proper issue, a fact he realised 10 hours later. Even had
               | he linked to the right issue, he has no idea what he's
               | talking about. He says he had some issue with the
               | language server and then simultaneously mentions LLVM?
               | rust-analyser doesn't import LLVM because it doesn't need
               | to generate machine code. You think when such poor
               | feedback gets pushback it means people aren't listening.
               | No, it's just poor feedback. If you want high quality
               | criticism of Rust, read the articles I linked. Rust has
               | many shortcomings and these folks discuss it in detail.
               | 
               | > no other language has a rewrite it in rust meme.
               | 
               | Your account is a year old. I've been here almost 10. I
               | remember when everyone was excited about Go and wanted to
               | rewrite everything in Go. And before Go it was Python. A
               | couple of years from now they'll be rewriting everything
               | in Carbon.
               | 
               | This is normal when things are new and people are still
               | discovering it. Most of the folks you're encountering are
               | excited by Rust ... and that's ok. It's not a bad thing
               | to be excited or share that with others. If that reduces
               | your quality of life, I apologise. But they meant no
               | harm.
               | 
               | > No other language
               | 
               | Firstly, no language does anything. And secondly, you're
               | making sweeping generalisations of a large community
               | based on a couple of incidents. I don't know there's
               | anything I can say, other than I haven't seen it in
               | years. No one thinks it's a good idea to attack anyone,
               | and moderators are usually quick to nip any anti-social
               | behaviour in the bud.
               | 
               | Lastly, anyone with a lick of Rust experience knows that
               | unsafe is useful and widely used. You can't implement
               | std::Vec without it, for instance.
        
         | rychco wrote:
         | (Ignoring the language itself for a moment) I absolutely love
         | cargo. It's so productive & easy to use. I have never had the
         | pleasure of using such a painless cross platform build system.
         | I'm neutral on Rust itself but Cargo is awesome.
        
           | benreesman wrote:
           | Cargo takes a rather brute-force approach to the hard
           | problems, but it generally _just fucking works_ , which is a
           | comically under-rated feature!
           | 
           | On the one hand, it's depressing that Cargo is forced to "go
           | it's own way" in order to achieve some sanity because it
           | can't can't trust the platforms, but working is working and I
           | can't remember more than one or two times I've seen it shit
           | the bed. It's pragmatic, useable, discoverable, and
           | industrial strength.
        
             | Jalad wrote:
             | > On the one hand, it's depressing that Cargo is forced to
             | "go it's own way" in order to achieve some sanity because
             | it can't can't trust the platforms
             | 
             | I've used Rust and Cargo a bit but I don't have a lot of
             | insight into it, what does Cargo actually need to implement
             | itself instead of trusting the platform?
        
               | kibwen wrote:
               | It may be referring to the Rust ecosystem's propensity to
               | pull code from crates.io (and for the Rust toolchain to
               | update itself via rustup) rather than relying on distro-
               | level package managers.
               | 
               | Distros do still package Rust, and some are even
               | relatively up to date, but finding third-party libraries
               | that work with [insert arbitrary old version of Rust] can
               | be a challenge, because libraries often start using new
               | APIs quite soon after they hit stable (and obviously old
               | versions of Rust don't know what to do with that; this is
               | the difference between backward compatibility and forward
               | compatibility).
        
         | [deleted]
        
       | skrtskrt wrote:
       | I went from Jekyll to to Hugo to avoid being bothered with
       | futzing with ruby gems.
       | 
       | Eventually I really appreciated the Golang approach to templating
       | much more than Jinja/Liquid style templates, Go has kind of a
       | composition-over-inheritance approach to templates.
       | 
       | If I ever have time to get proficient enough with Rust I'd love
       | to port that Go templating approach to Rust. Maybe not so much
       | the data interpolation syntax, but rather the approach to
       | composing template partials. But ultimately I'm familiar enough
       | with Jinja style, Zola would probably be a breeze to adopt as
       | well.
        
       | zelphirkalt wrote:
       | Ah yes, one of my favorite projects in a newly learned language:
       | Make a blog, based on plain text files, maybe markdown, maybe
       | something else.
       | 
       | But since I have done that, I feel that many existing site
       | generators are bloated, probably, because they cover scenarios,
       | which I would not want on my blog anyway.
        
       | nlh wrote:
       | Nice work and great write up!
       | 
       | I'm a huge fan of treating one's blog as a "homelab" for
       | exploring new (or old) software stacks for the web, so this idea
       | resonates a lot.
       | 
       | One thing I'd like to try (has anyone tried this?): eschew the
       | idea of a static site generator and go the "old school" route of
       | dynamically generating each page on the fly, but take advantage
       | of the modern CDN layer of the web (CloudFlare, etc.) to
       | effectively cache and give you the speed equivalent of a static
       | site. Yes this approach has more dependencies but I think
       | simplifies the work done on the blog side since you can build it
       | using whichever simple web framework appeals to you most (or none
       | at all...this is a homelab after all).
       | 
       | My plan (don't we all have this plan) is to try this out in
       | Crystal when time allows...
        
       | [deleted]
        
       | [deleted]
        
       | thrwawy74 wrote:
       | I really liked the reactive pattern, so one of the best static
       | site generators I found was docpad. It used (backbone?)
       | collections, so you could subscribe to changes on things like
       | "new files under this path" and then rerender the part of the
       | page that needed to change. I haven't seen this done in others.
       | Then docpad was rewritten in ES6, and I lost all love for it.
       | Things were so expressively concise in Coffeescript.
        
         | impoppy wrote:
         | It's kind of ironic and uncool that DocPad's website is made
         | using GitBook.
        
       | cletus wrote:
       | I enjoyed this post. The premise is a good one, as in for fun. A
       | lot of these "I wrote X in Y" go on some spree of questionable
       | assertions but "because I wanted to" is intellectually honest and
       | understandable.
       | 
       | I agree with a lot of the points about Rust too. Every language
       | is a selection of tradeoffs and for me Rust's chosen tradeoffs I
       | think are both important (eg memory safety) and reasonable.
       | 
       | Take something like Cargo. The author says "It just works". This
       | is my experience as well. But more importantly, dependency
       | management and packaging were built into the language and
       | ecosystem from the start. It still boggles my mind that any
       | language that came after Java didn't do this (yes, I'm looking at
       | you, Go).
       | 
       | My heart did sink a little bit at "Using Regex of course!"
       | though.
        
         | brightball wrote:
         | I honestly highly recommend the approach. Anytime I get excited
         | about a new technology, I rewrite my blog in it. Gives me a
         | simple live project with real traffic and all the right moving
         | parts.
         | 
         | Last time I did it was with Elixir + Phoenix + PostgreSQL,
         | without any standard or reasonable approach. It was a lot of
         | fun and still using it today.
         | 
         | https://www.brightball.com/articles/insanity-with-elixir-pho...
        
       | hamaluik wrote:
       | I did the same thing a couple years ago [0]. It's not the most
       | elegant and my blog is miniscule, but it was a fun project and
       | also born out of frustration with the existing site generators. I
       | structured it as the source sitting next to the site contents, so
       | from a fresh computer (with Rust installed), it's as
       | straightforward as `cargo build`.
       | 
       | I think the best thing about this approach (writing your own
       | generator) is that it really lets you build your site / content
       | exactly the way you want to. Don't need categories and tags?
       | Don't add them to begin with. Want to add an RSS feed? No
       | problem, just add it. Want to do some fancy image compression and
       | processing in the pipeline? No problem; you're the boss. It
       | sounds simple but it really frees you up to write / generate your
       | site however you want.
       | 
       | 0: https://github.com/hamaluik/blog.hamaluik.ca
        
         | annowiki wrote:
         | I just linked your blog post in a separate comment because I
         | was reading it over the weekend. I was looking for articles
         | about writing static site generators and didn't realize most
         | people don't roll their own templating engines. I was
         | disappointed to see not much on templating in your post but it
         | definitely gave me the confidence to keep going. Managed to get
         | aspects I'd been struggling to work for months working
         | yesterday.
        
         | mxuribe wrote:
         | As enjoyable as this post was, i recalled my history with
         | static site generators as follows: hand-code html pages -->
         | hand-code html but w/ server-side includes (yes, back in the
         | apache days) --> use php w/own custom templates and mysql db
         | --> move to wordpress --> love the intent of wordpress, but
         | regret the needed maintenance, so move back to custom php and
         | custom templates --> move manage content via Lektor (python
         | SSG) --> learn that i don't need a UI, and am content crafting
         | my content in markdown --> start using pelican (python SSG) -->
         | get bored, so move to Hugo as new SSG flavor of the month -->
         | get annoyed with templating language --> move back to pelican
         | --> realized i spent too much time bouncing around, just did
         | away with any SSG tool set, and hand craft html pages whenever
         | i want to publish something...and now only craft journal
         | entries for my own private diary (with an occasional post on
         | the fediverse). :-)
        
       | bArray wrote:
       | I have some 381 posts (including landing pages, etc). It takes
       | maybe 45 minutes to build (there is no cache process). I have a
       | faster version that skips audio processing, but it still takes
       | minutes.
       | 
       | The problem is that it does several pandoc parses for each page:
       | 
       | 1. Plain text - Input for audio parsing (which takes a
       | significant amount of time, I have a version of the build that
       | skips this).
       | 
       | 2. Simple HTML - Input for RSS feed.
       | 
       | 3. Full HTML - Static web page.
       | 
       | One change I would make to pandoc is to have the option for
       | several outputs (as was discussed years ago [1]). I think
       | generating multiple outputs is _highly_ common usage.
       | 
       | One feature I will get around to writing (eventually) is
       | automatic image compression. I had some success using jpegoptim
       | and optipng on another project. This takes a while, so I want to
       | build a command line tool that caches the output of a command if
       | both the input file(s) and command do not change, and invalidate
       | based on time. That way I could blindly do something like:
       | image="cat-pic.png"         cache-run -i $image -c "optipng -dir
       | out/ -o 4 -strip all -fix $image"
       | 
       | (You might want to experiment with different optimization values
       | based on resolution, etc).
       | 
       | [1] https://groups.google.com/g/pandoc-discuss/c/lex900rSpOM
        
       | mynameisash wrote:
       | > Several external dependencies.
       | 
       | > It's annoying to install all these and to keep them up-to-date,
       | it would be great to just have a single thing to worry about.
       | 
       | I feel the author's pain.
       | 
       | There's a Python2 project for ebook management that I used pretty
       | extensively years ago, but it depended on a number of external
       | dependencies, both as compiled shared objects and other Python
       | libraries. It felt extremely fragile and was always a pain to get
       | it working properly, so I eventually rewrote the core parts of
       | the entire project for my own use (in Rust, incidentally). Now I
       | have a single app that I can be sure will pretty much always
       | work.
        
         | Macha wrote:
         | I also have a personal Rust ebook manager because of
         | frustrations with calibre :)
         | 
         | Though Calibre has at least made it to Python 3 these days.
        
       | dceddia wrote:
       | Fun project! I really resonate with this part
       | 
       | > But I haven't used Haskell in years, and the overhead for me to
       | add slightly more complex things to the site is quite large
       | 
       | I'm starting to come around to the idea that it might be better
       | to avoid shiny fun things in favor of having most of my active
       | projects use the same stack, or at least the same few languages.
       | 
       | I've got a blog in Jekyll (with some Ruby-based customizations),
       | a bunch of stuff in JavaScript, some TypeScript, an app in Elixir
       | & Phoenix, a (desktop) app in Rust, and some Rails to maintain.
       | For me personally, Elixir is the odd one out: I learned enough to
       | build that app, and I really enjoyed Elixir, but that knowledge
       | was fleeting because I haven't needed to touch the code very
       | much. I have to relearn how Phoenix works in order to make
       | changes. As much as it pains me to say this, I kind of wish it
       | was in TypeScript or something, just to reduce the mental
       | overhead. (but then, that's a whole other can of worms because of
       | how piecemeal things are in the Node ecosystem, so I'd end up
       | having to learn a web framework and an ORM and some other
       | libraries, which feels like the sort of knowledge that might be
       | even more fleeting!)
        
         | benreesman wrote:
         | There's a lot of wisdom in that observation.
         | 
         | Knowing a lot of languages well is a super-power in some ways,
         | but heavily polyglot environments create real pragmatic
         | challenges. There's a reason so many marquee shops carefully
         | curate a (short) menu of production languages.
         | 
         | It's been my experience that _if_ (and it's a big if) you have
         | either the need or inclination to operate a big orgy of
         | polyglot language interop, the hellacious learning curves on
         | NixOS and Bazel are "The Way". It's a big investment and only
         | worth it if you're pretty committed /obligated, but there is a
         | path for those whose needs justify the cost.
        
         | zelphirkalt wrote:
         | > As much as it pains me to say this, I kind of wish it was in
         | TypeScript or something, just to reduce the mental overhead.
         | 
         | If you once knew how Elixir works (syntactically), then you
         | will be able to quickly bounce back. If comparing TypeScript
         | with Phoenix, then you would have to relearn your in TS written
         | functionality, in contrast to relearning Phoenix.
         | 
         | I don't see how it being TS would help much tbh. I think what
         | matters much more is, whether your past self left good comments
         | and wrote readable code.
        
       | annowiki wrote:
       | This is mindblowing synchronicity. I thought this article was one
       | I had read this weekend for a second but checked the post date
       | and saw it wasn't available yesterday.
       | 
       | I'm working on trying to write a static site generator for my own
       | personal site/blog in C++, been tinkering for a couple months. It
       | started as a passion project in tribute to my dog that passed.
       | GatsbyJS wasn't working (again) which is what my current site is
       | built with, so I just said screw it, I'll write my own. Chose C
       | to begin with and quickly gave up. Decided to switch to C++
       | because its what I'm supposed to be learning for work.
       | 
       | I named it bluesky, after my dog that passed, Sky Blue.
       | https://github.com/mas-4/bluesky
       | 
       | Templating is a lot harder than I had initially thought. I wanted
       | the templating system to be as bare bones as possible, similar to
       | another static site generator I rather like, sergey[0]. Most of
       | these articles I found ([1], [2]) about writing your own SSG
       | don't go into templating much, they just use an off the shelf
       | library. Inja[3] is available for C++ but, like I said, I want
       | something really bare bones, like if you were designing html now,
       | you'd obviously include html-includes and html-templates. I
       | finally got it working for includes and templates, now I have to
       | add the markdown support, and then I plan on migrating my
       | personal site to using it.
       | 
       | [0]: https://sergey.cool/ [1]:
       | https://www.smashingmagazine.com/2020/09/stack-custom-made-s...
       | [2]: https://blog.hamaluik.ca/posts/build-your-own-static-site-
       | ge... [3]: https://github.com/pantor/inja
       | 
       | edit: a link
        
         | frozencell wrote:
         | Sorry for your loss.
        
         | brundolf wrote:
         | I've found you don't actually need a templating system, you
         | just need format-strings. Write your rendering logic with
         | normal code that just spits out a string
         | 
         | Templating languages probably help with performance a bit when
         | you're rendering at request-time, but for static stuff I don't
         | really see much point
         | 
         | I've got a hand-rolled static site generator in JavaScript that
         | just uses template strings. I only have around 30 pages, to be
         | fair, but when I make a change it re-generates the whole site
         | before I can even alt-tab and reload the page. I assume a C++
         | version could be much faster
        
       ___________________________________________________________________
       (page generated 2022-08-29 23:00 UTC)