Matt Marshall

11 Posts with Tag brimstone (All tags)


Brimstone is the code I use to run this website. You can find the code on Gitlab and, for the time being, on Github. I want to keep this post as a living post, and keep adding to it. That way I hope this post acts like a philosophy.txt.

The code isn't anything special. I write it for several reasons:

  • I like to blog, and wasn't happy with a third-party service like tumblr or Blogspot because
  • I like to own my data, and I met someone at a conference who sold me on the idea of the Indieweb and POSSE.
  • I like to write code. I have a CS degree, and am currently doing HCI research where I don't write a lot of code anymore.
  • I like to make my own tools. For the above reasons, this makes writing blog software useful for the time being. I can develop a tool around my own practices, that helps me achieve my goals.
  • Diversity is pretty neat, and although I doubt anyone will actually use this software -- I like the idea that by writing this code I'm contributing in a small way to that diversity.


The goal of this software is to provide a simple, lightweight, option for publishing text content online that allows a user (me) to:

  • own the data and
  • share copies of the data via social media, with citations back to the original copy
  • not deal with any particularly cumbersome Javascript on the front-end while writing posts.
  • Fire up an instance with a minimal setup e.g. a box with PHP, MySQL and a webserver of choice.

And allows others to view my content in a way that suits them. So far this includes:

  • scraping my site for content marked up in microformats
  • subscribing to my long-form text via rss
  • Seeing versions of my content appear on social media feeds.
  • Viewing the front-end of my site without any Javascript executing.

Why not use Wordpress, Ghost, etc.?

I have no explicit issue with them - but they're not really my thing. I've used wordpress for a variety of things in the past and it suits those things, but I wanted something light. I've never really used Ghost, but already you're dealing with a fully-fledged CMS with complex management options and theming potential. I wanted something that does not put any Javascript on the public-facing portion of the site, and only uses minimal Javascript for the UI in the admin-panel. I also wanted something that didn't require a lot of configuration.

Equally as important, I wanted to play and develop a few skills.

Ok, so what's it built on?

The current version of Brimstone is built on the Symfony PHP Framework. To run the current version you will need PHP 7.1, and Composer to install the vendor packages.

It's released under the GPL 3. This means that if you fork Brimstone or use any of my code in projects, you're also obliged to release under the GPL. Symfony code is released under the MIT License which, thankfully, allows me to use MIT components inside of a GPL'd project.

Ok so what does it actually do?

It does pretty much what any home-brew blog software can do, but specifically:

  • Basic blogging and microblogging with Posts.
  • Write Posts in Markdown (a la Daring Fireball syntax) -- no heavy interface required.
  • Posts are type-inferred. You can write short notes (like tweets) and longer articles (like blog posts) from the same interface, and they display differently based on your choices -- no explicit configuration necessary other than deciding if you want your post to have a title.
  • Long-form articles are available via an RSS feed for people to subscribe to
  • POSSE Posts to Mastodon with citation back to post on the site
  • POSSE posts to Twitter with citation back to post on the site
  • Posts on the site are marked up with microformats for Indieweb feed compatibility
  • Speaking of the Indieweb; you can send webmentions just like this one to mention others in your posts.
  • There are no comments for your posts stored on the site, but you can receive webmentions on them which get delivered into an inbox as notifications in your admin panel so you can see what people have said.
  • You can export all your posts in an XML file, and import posts into the system from an XML file given it has the proper format.
  • You can also download posts individually as Markdown files
  • Basic controls for hiding/showing posts, in case you want to appropriate posting for keeping private notes.
  • You have a short profile which you can fill out, and this gets marked up as an h-card for indiweb compatibility.
  • You have an optional 'About' page to fill out just like a post; if you don't want it keep it blank and the About link disappears from the site.

development brimstone indieweb php

Quick thoughts on Minimalist Design Patterns for Brimstone

Minimalism is one of the inspirations I draw from when hacking at Brimstone. So far this has manifested by removing things like excessive UI elements, cumbersome Javascript and CSS frameworks (thankfully PureCSS exists), and streamlining things such as how Posts work and are displayed.

I had a thought recently when considering the About page, and how a more minimal approach might look. At the moment, the approach is still relatively minimal; the UserProfile object has a field which can store text used to render the About page using markdown. If it's null or empty, the templates don't render a link to the About page and the controller redirects any attempts to directly go to /about to the index page.

How then, do I think it may be improved? Obviously these are rough ideas -- I also don't think there's anything explicitly wrong with the way things are done currently. What might seem simple to me might not be simple to others, and in fact I think there's an argument that these design patterns could add complexity in some regards.

Under both of the following proposals, the UserProfile object has the about attribute removed, and controller logic is changed to accommodate the new pattern.

Idea 1 - Using a Post for an About Page

Under the current design, the About page is simply a text field containing markdown that is rendered when the visitor calls /about. This works basically exactly the same as a Post but is a bit less versatile e.g. Posts store a lastModified attribute which can inform the reader if/when the Post was last edited and give some idea of freshness.

Under this design pattern, Post receives a new boolean attribute which marks it as the About page. A form or button is implemented, along with a controller to handle elevating a Post to this position with the following logic:

post = post // from controller
previousAbout = searchPosts(where: about == true)

if ( previousAbout is not null ):


return new Response(200)

The About page template can actually remain, with the controller simply changing the variable it passes into it to achieve the goal. Another consideration, however, is the header templates logic when choosing to render an /about link. Currently it utilises a UserProfile object already passed in to the template which is used for H-Card generation and Site titles as well as visible elements such as the name and profile image. Since the UserProfile object also contains the About page, it simply checks to see if it's null or not to decide whether to render the /about link. If I made the About page a Post, the controller would need to inform the template separately, unless the UserProfile maintained a 1-to-1 relationship with a single post, which is nullable. This changes the previous controller logic above to:

post = post // from controller
userProfile = user.getProfile()


return new Response(200)

Which I actually prefer. The UserProfile still has an about attribute, but it's a reference to pre-existing content and can be switched without a search of the database and it prevents duplication; where since Post already contains the necessary attributes for a good About page it makes sense to leverage it.

Idea 2 - Using a tag for an About Page

This one also utilises Posts, but with a slight twist. Instead of elevating a single Post to become an About page, what if we simply used a Tag? That way, the user could add content to their about page on-the-fly simply by tagging a Post with an about tag?

I don't think this is without issues -- for example how do you order things? What about reordering things on the page? How about editing posts, you have to hunt them down (admittedly just a search for the tag about…)? There's also the issue of the header rendering the /about link from earlier -- this means every controller needs to do a search for Posts tagged with about and check the length of that result, to decide.

I'm sure there's a way around this, and I really like the idea of a cumulative About page which can be made up of otherwise disparate content, for now I'm going to try out Idea 1 and see how that goes.

development brimstone minimalism php minimalist design design patterns web design

Feature Creep, and Doing.

I have always had a problem with the dreaded Feature Creep. Not only with software development, but in life generally. I take a lot of pleasure in the doing of something, and when I stumble across something that I feel I may enjoy doing I get incredibly excited at the prospect of its doing. If that made sense :-/

I experienced this quite early on in my strength training journey -- attempting to integrate a full Calisthenics system with a Power Lifting one. When I finally dropped my Power Lifts to focus on Calisthenics, instead of relishing the extra time and simplicity I instantly started trying to do various different forms of calisthenics training (my foundation was always Convict Conditioning, but I was attempting to Grease the Groove on quite a lot of things too, and was rushing the addition of extra exercise progressions).

I've most recently experienced this with Brimstone, my little indie blog project. I've only recently gotten around to actually fixing the main feed, and integrating everything together. Mainly, features creep in and keep me awake via RSS feeds (it's getting shinier back here, btw). The same can be said with my PhD. People keep trying to introduce 'features', or aspects of the research. For the most part I welcome it, and their interest in it is exciting (if pressuring). But there's only so much I can do.

The most dangerous feature creep I've experienced is that which I indicated right at the start of this post. The doing features of my life. I take a real, carnal, pleasure in doing things, taking things in, and being part of things. Throughout high school and 6th Form (college) I was involved in a local theatre group. When I got a job making pizzas, I found it difficult to manage acting alongside 6th Form, the job, and a new girlfriend (oh myyy). So acting was dropped. I managed to get by in 6th Form without too much feature creep. My Open-Sourceness became more pronounced, so I suppose that was one thing I was doing, but otherwise I was pretty simple. I watched a lot of TV shows.

When I came to Uni, the acting came back in and I am ashamed to say that I let some good friends (and splendid talent) down by dropping out in the most heinous way possibe: ceasing to show up. I was busy being a Computer Science student, an active Satanist, a fledgling executive member of Rocksoc, and I had a new girlfriend (this one was a model! ohhh errr). I also still had my job slinging pizzas (in a different shop), and my social life was abuzz with clubbing and friends. Also now I had to cook for myself!

Years later, things are looking tamer; but I worry about feature creep still. The things I like to do keep growing. Every time I enjoy cooking something, especially if it takes effort, I long for a ritual of doing it daily or weekly. My Strength Training is so ingrained in me now that I can't help but do it -- but it remains something that I do so it affects my day significantly. I enjoy doing maintenance on clothes and boots. I enjoy doing reading, and writing. I enjoy doing development, especially adding new features to software. I've recently took up a light practice of making, which is absolutely rife with doing things -- lots of things! Also carving, if there ever was something that was doing; carving is it. Since developing an interest in Politcal Economy, and being awakened as a Feminist (or ally) I've being doing those things. Oh, and after a nice long spell of being out of the habit of doing being a Satanist; I'm being enticed back in by a new and sexy UK community.

I don't know what to make of all this. Juxtaposing the desire to experience rich variety against the desire to not feel bad for not doing something is becoming tougher every day. Is it wrong to love drowning in it?

calisthenics diary development reflections brimstone life

Quick Evaluation of Brimstone CMS and my Silo Use

I have a bit of a weird relationship with the Indieweb. I'm not really sure where I stand in that nexus as I've made no attempts to connect with the community, but draw inspiration heavily from Indieweb user Rhiaro and often look on the wiki when I've got work-paralysis on Brimstone and want to procrastinate by adding another half-finished feature and not fix muh bugs. Anyway, from the Indieweb I learned of the term "Silo". Defined as

A silo, or web content hosting silo, in the context of the IndieWeb, is a centralized web site typically owned by a for-profit corporation that stakes some claim to content contributed to it and restricts access in some way (has walls).

They share characteristics such as preventing easy export of content in standard formats, and requiring you to use an identity exclusive to that site (ie your Facebook account. Since I recently underwent evaluations of my Facebook use, and subsequently began my tactical withdrawal from the platform, I thought I'd evaluate my current state of play. It's coming up a year since I started development over here.

Silo Use

Here's the state-of-play when it comes to my use of Silos

  • I use Twitter a lot, via POSSEing. I still need to sign in to the site to check my notifications. I like microblogging and it's the best way to let others see my content.
  • I've just begun withdrawing from Facebook. I removed all of the photos I could, locked down my privacy settings (I might still be discoverable though), and unfollowed everything in my News Feed to stop drawing me back in.
  • I still use Messenger (Facebook), although only check it in the morning and evening. I haven't received a message via the platform for days. I use Telegram to speak to the people I speak to the most. Mainly some close friends and colleagues.
  • I downloaded all my Facebook data to save my photos but I'm not sure where to put them. I think Google has a few of my photos.
  • I removed my Google Plus account years ago but it was full of images, and I doubt Google actually destroy it.
  • I've got a tumblr and a blogger somewhere but I've never seriously maintained them past maybe two posts from 2011 and 2013 respectively.
  • I've never had a MySpace
  • I have a LinkedIn :-( But that's kinda for just accepting requests from old colleagues. Sort of what it's for I suppose. It gets updated once a year if I get a paper in or medal or something (so rarely).
  • I use Google as my main identity provider for oAuth SSO purposes, and GMail is pretty nifty even though Google are pure evil and I just presume my GMail is open to the capitalist class.

Brimstone CMS

Here's the state-of-the-art when it comes to my indieweb software

  • I auto-POSSE Notes to Twitter.
  • I can write longform blog posts in markdown
  • I can check in to places and can retrodate them.
  • I fixed the bug with datetimes (my ignorance) and now my blog isn't just one stream of notes for readers.
  • I have inline tagging for Notes and tags for Posts.
  • I have an RSS reader which I can create a newsfeed from.
  • I have a control panel which is heavily Bootstrap'd.
  • It draws in Twitter, and renders an aggregated RSS newsfeed in two different tabs.
  • My AJAX is terrible.
  • I can favourite a tweet and it goes to twitter.
  • I am working on favourites over here, for both RSS items and storing Twitter faves.
  • My AJAX is terrible.
  • I can view Twitter profiles up to the 20 or so tweets returned with a single request.
  • I can see all my friends/followers from Twitter, and follow/unfollow them via terrible AJAX
  • My Gravatar profile image and my Twitter account are hardcoded in, and need generalising.
  • The whole CMS needs a set-up screen and a settings page if it's ever to be released.

Features I'd like

  • Images for notes and blog posts. Storing them is more of an issue than the feature itself atm.
  • Track exercise and set goals. I used to use Fitocracy a lot and would also like to digitise some of my old training diaries for posterity.
  • Statistics to run over Notes, Blog Posts, Training sessions etc.
  • Probably should integrate some indieweb H-feed reading.
  • Probably should allow for webmentions, etc. Communicating with others etc.
  • Probably should mark up my feed with microformats
  • Track time invested in various skills, hobbies, and activities. Could be useful for a CV someday but also I could toy around with having a page in the style of an RPG character sheet, which is auto-updated as I invest time points in developing skills.


I'm not too bad in the way of Silo use. There's a lot to do on Brimstone but now I actually have myself a TODO list. Should be a fun year.

brimstone socialmedia indieweb silo todo

Continuing on the theme of dark mode everywhere, I have installed a Dark Reader for Firefox and learned two things:

  • You get used to it scarily quickly. The CSS is really nice, and most websites are compatible. It feels really natural.
  • Brimstone's CSS is so simple it looks really good in Dark Mode. That's kinda neat.

brimstone life health web dark mode eyesight

Just made a cheeky update to Brimstone based on the fact that the default server timezone is now in the Pacific and it was skewing my post times.

brimstone php

Brimstone: Plans and Situated Actions

I've grown a bit restless with Brimstone (the software that's running this site) at the moment. I've been dribbling in features here and there to keep myself occupied, but I think it needs a bit of an overhaul both visually and in the background.


  • Change the CSS and page structure from Bootswatch to Materialize I've never enjoyed doing my own CSS other than a few small bits, so this move is largely just for the visual appeal and a vector for removing JS
  • Remove Admin Section reliance on JavaScript I've never enjoyed writing JavaScript either. During the restructuring I'm going to be changing the admin section to have minimal JavaScript, and elegant rollback. Currently the features that rely on JS are posting Notes and Replies, and favourites. Since this is the bulk of interactions with the software, I think it needs changing a bit. I like some shiny interactive features, but these shouldn't be necessary to create particular forms of content.
  • Condense Notes and Posts into single data structure The bulk of my content is written as Notes, which are a shameless emulation of Tweets and were actually the first type of content I produced. Posts are the longer, blog-post style, pieces of content. There's literally no other reason other than my excitement and stupid categorisation of content that they need to be separate. I'll do content inference instead; pieces with a title get published with an 'Article' template, and those without get a 'Note' template. With a location field, it means I can also infer check-ins as well as add richer data to all posts. This might not work for later content types such as exercise data as they don't share many common fields. Syndication templates can also be produced.
  • Restructure the URLs to content and implement redirects for old Tweet citations
  • Feature to import all tweets between certain dates to create a backlog of content
  • Implement a basic exercise tracker
  • Implement a basic spending tracker
  • Produce summaries of my content (heavily inspired by Rhiaro
  • Implement proper user management to let people 'install' the software themselves, without editing files to create a user.
  • Release the source on Github.

That's a lot to do, and I'm thinking of dedicating an evening a week to the project. We'll see how it goes. For now, you get bonus points if you understand the relationship between the title and the content of this post.

cms brimstone data content