This site is called mmx

last updated 2021-06-24

A person building something with bamboo

mmx was built at the start of 2021. Largely inspired by others on {^webring}, especially {^Devine}, the site aims to be a long term repository for my writing, notes, and research. Entries on my previous site (a precarious tower of javascript dependencies) were ported over.

The site's compiler is written in {^Go}. It generates the static site you are reading by building a graph of entries from a bespoke markup language {mmxup}.

Go's {^templating engine} is lightly used, but it's often more straightforward to concat the html directly into a string.

If you want to learn more, see the {^source code}.

Building mmx

I've historically defaulted to the technology du jour to build and rebuild my personal and company webpages. It's worked fine - there have been moments of fantastic efficiency, and others of abysmal reverse engineering of an errant configuration or plugin.

In the spirit of {low tech}, and heavily inspired by others on the {^webring}, I sought out to simplify my dependencies, build something myself, and learn some new technologies in the process.

To start, I mapped out my hoped-for characteristics of the end result. I landed on:

  1. low friction, so as to promote more writing;
  2. low-level - no automagic frameworks or dependencies
  3. long-term, with limited dependencies and render to straight html; and
  4. extendable (I want this to be something that evolves with me over the next 5, 10, 15 years)
{^Devine Lu Linvega's Oscean} served as the primary inspiration. I spent a weekend pouring over their wiki, the underlying C-code, and the ecosystem of file formats and tools they created. The act of reading through their code and reverse engineering the site compilation was one of the most fun weekends I've had in a while. I gained an understanding of their technical approach to linking and render disparate databases, while simultaneously exploring the content of those databases themselves.

I opted for GoLang as a learning opportunity. Compared to my day-to-day work languages of Javascript and Python, GoLang is miles closer to C. The last time I thought about pointers was my senior year of college, if that. I never imagined saying this, but I missed pointers! My impression of GoLang so far is fine. I hardly tapped into the features it is known for, such as concurrency. But this project served as a gentle introduction.

Another reason I wanted to create the compiler myself was so that I could add features over time that are typically only available on "hosted platforms," such as bidirectional linking and other memex-style data graph functions. I noticed that Oscean as well as others on the webring were able to do this. How cool.

The compiler is able to pull context from inbound links to pages. This is achieved by building a node tree when compiling the templating language to HTML. The correct a tag is located in the tree, and the node's parent content is pulled in as html.

In a moment of doubt, I played with {^11ty} as well as {^gatsby plugins} that promised functionality I sought. But after speedbumps with each, always grappling with the obfuscation that make them "magic," I felt confident that growing something from seed was the right path.

I've updated mmx to no longer rely on external dependencies (like markdown) outside of Golang's standard library. In order to do that while maintaining a nice writing experience (as much as I love html...), I created my own markdown language, {mmxup}.

Other features of established web frameworks are replicatable with bash, usually. For instance, "live reloading" is achieved with the following bash:

#!/bin/sh
bash build.sh
while inotifywait -qqre modify ./src ./links ./data; do
  bash build.sh
done

The site is hosted using Github pages. This is great, because there is no build step. I check in the built html files (in /doc) and they are served within seconds. CNAME setup was a breeze.


The wood thrush, it is! Now I know

who sings that clear arpeggio,

three far notes weaving

into the evening

among leaves

and shadow;

or at dawn in the woods, I've heard

the sweet ascending triple word

echoing over

the silent river —

but never

seen the bird.

Learning the Name by Ursula K. Le Guin
⇣ (7)
2021-06-19 
  • Ideas for {mmx} improvements
    • Simplify jrnl images
    • Optimize {mmxup} rendering
    • Pull in backref excerpt for context
    • Change reading to include other consumed media, like movies, videos, significant articles, etc. "reading logbook"
    • Create running, climbing, exercise log
  • 2021-06-28 
  • Rewrite {mmx} page
  • 2021-07-18 
  • write an {mmx} architecture overview and usage guide
  • Now  Last {compiled} 2022-07-19 9:11AM EDT
    Now 

    This is the first entry in what I hope will be recurring format. It's an experiment in a different organizational structure on {mmx} to move from topic-based organization on the site to regular writing that spans different projects and interests. I've updated pages less often than I thought I would, mainly because of how distributed the content is across the site. I think this sort of diary-tag-entity relationship is how all those hot tools like Roam and others do it (is it the zettel-whatever pattern?). Topics can have their own content but will also be supplemented with extractions from other page's references to those content. This already happens, but it's hidden at the bottom of a page in a details tag. I'm also interested to see if topic pages can be created without being explicitly defined. This change will need some small technical changes in mmx, but minor in the scheme of things. I am glad at how general-purpose mmx is, and pulling out some of the last technical idiosyncrasies will be a welcome refactor.

    About 

    This site is called {mmx}. It is my place to write, research, share ideas and keep notes.

    Ideas 

    {mmx} internal