monkinetic the blog

Posts tagged with 'Goldfrog' (43 posts)

A Bit Of Blog Complaining

Guess it’s time to revisit the blog engine here. I wrote Goldfrog a few years ago and it’s been chugging along on this Digital Ocean instance fairly well, but at the time I had in mind a two-way sync between gitlab, where I maintain a separate repository of my archived content, and the filesystem/db in Goldfrog.

It worked, sort of, for a while, but the deployment on DO is NOT simple to remember, uses Ansible and code from 2 different git repos to set up or update the server, and was just 3 times more clever than it should have been.

I also implemented a flexible/configurable POSSE feature that is supposed to send updates to my mastodon account but … isn’t right now? And the logging setup on the site is abysmal.

I still like parts of my system. If I did it again, I’d still want:

  • My custom posting UI that works like the ancient Radio Userland sites did: post form at the top of the home page list of posts:

And my version in Goldfrog: 2024-04-11 at 11.39.49 AM.png

  • A small web app - not a static site generator
  • Content stored ultimately as markdown files so they can be stored in git or similar
  • Content indexed in sqlite for searching. serving various archive pages (tags, etc)

UPDATE: As long as I’m dreaming, I wish it was easier to run a small web app like this off a container. I probably could with Digital Ocean’s app platform, I haven’t looked into it lately, and I’d still have to solve the “index in a sqlite db file” problem.

#blogging #goldfrog #userlandfrontier

Update on Goldfrog

Over on Mastodon, @[email protected] said:

I’ll be excited to beta test another blogging platform. (Still a Tumblr nerd at heart.)

Unfortunately I’m not sure I’d inflict Goldfrog on anyone at this point. 🤣 However, it’s still fun to hack on, so here are some salient points:

My favorite features:

  • A Twitter-sized posting form right at the top of the home page for posting short notes, supports Markdown, has a character counter for fun
  • Posts support tags, and #hashtags in posts are auto-linked for searching by tag on the site
  • I have a separate posting form I can use for longer posts
  • Posts can be syndicated to Mastodon, POSSE-style

As for running Goldfrog, it’s just a Go binary running off a config file, a theme directory, and a directory of content. There’s a separate tool for indexing posts from the filesystem into sqlite (usually only done when installing or updating from git).

  • Runs on a DO droplet, currently deployed with ansible
  • The only “admin” functionality is posting and editing posts, everything else is editing a config in git. “Admin” is based on a security-through-obscurity login url and a hardcoded user and password in the configs. This is dumb ;) and I’m experimenting with supporting Gitlab OAUth for login.
  • Posts are stored in git as Markdown files with yaml headers
  • posts are read into a SQLite db for serving and searching

I enjoy hacking on Goldfrog, and sure I’d like it if someone had a barebones product like it, but I have no interest in supporting either an actual open-source product, or running an entire damn “platform”. 💜

#goldfrog #blogging #mastodon #indieweb #hashtags

Steve Ivy

Posting to via Drafts (I want to support something like this in the next version of my own blog software, via some kind of API)

~ # 12:44 ~

Time for bi-yearly web presence maintenance

What with Twitter (aka birdsite, hellsite, muskosite) flailing in the clammy hands of Dr. No, and interest in the federated web re-emerging, I figured it was time to review my own web presence and see what was the situation.

Dear reader, it was Not Good.

Warning one was hitting this site from my work network and getting a BitDefender screen of doom saying the site was serving a keylogger. NOT GOOD.

Then the site - which was hosted on Linode and runs my own homegrown blog software, Goldfrog - went completely down. After some “where did those ssh keys get to, where is this thing anyway” I got logged in and figured out that my server had been hacked in some way, TLS and letsencrypt removed. I haven’t had time to troll the logs for evidence as to how the server was accessed, but I downloaded them and have them set aside to look later.

We Can Rebuild It

Thus entered a week of figuring out once again how the heck Monkinetic is built and deployed, migrating the code from Github to Gitlab (which I’m more familiar with due to $dayjob), and refactoring the Ansible code that builds the server and deploys the blog/content.

Finally today I got it 85% done, which is pretty good for a full migration between hosting providers (I also moved from Linode to Digital Ocean where I already have some other services).


With the insanity on Twitter, I logged back into my Mastodon account on and enjoyed the huge stream of new folks migrating from Twitter to federated platforms (mostly to since that’s the first/largest instance, but folks are making their way from there to smaller instances as they get more comfortable).

Apparently Mastodon 4.0 is out (release candidate) and they’ve changed the annoying-until-it-was-gone “Toot” to “Publish”. I’d have preferred “Post” myself, but 🤷‍♀️.

Maybe servers should just change it to suit their audience?

#devops #blogging #socialmedia #federation #mastodon #goldfrog

Steve Ivy

Stopping work to relax and celebrate my birthday and a late father’s day. Left a Sticky for myself so I remember what my next steps are with #goldfrog

~ # 23:05 ~

Steve Ivy

There a LOT of error cases when writing a #webmention server implementation #indieweb #goldfrog

~ # 19:57 ~

Steve Ivy

Working on timezone code for #goldfrog, still the worst

~ # 20:21 ~

Steve Ivy

TFW your home-rolled blog application hit the 8020 mark, well, but you need a feature in the missing 20% 🤦🏻‍♂️ #goldfrog

~ # 23:57 ~

Steve Ivy

Repaired some stuff in #goldfrog around #webmention handling on weird responses (hello amzn redirects)

~ # 17:21 ~

Steve Ivy

Fixed a couple of little bugs in #goldfrog - made it so that the webmention code doesn’t barf on servers with non-verifiable SSL certs, and updated the permashortid code so that Twitter doesn’t always link to the site for Notes

~ # 17:53 ~

Steve Ivy

Ok, I’m tired of putting off writing about what I’m reading just because I don’t have custom “read”-handling code in #goldfrog yet. So I’m posting links to books I’ve read since March 4, 2020…

~ # 19:32 ~

Steve Ivy

I’m this close (pinches fingers together) to committing media uploads for Twitter to #goldfrog

~ # 19:17 ~

Steve Ivy

Obviously I need to add media uploading to my syndication code #indieweb #goldfrog

~ # 20:15 ~

Steve Ivy

Posting UI #experiment #goldfrog

~ # 20:23 ~

New Posting UI on Goldfrog

I’ve started messing around a bit with javascript-enhanced UIs for #goldfrog. Rather than use all of JQuery, I decided on a small subset of Jquery’s functionality as implemented by Sprint.JS.

  1. I only load the JS for me, since I’m logged in.
  2. It’s only used on the home page to power the new switchable post form, and
  3. It powers a character-counter for the note UI.

Here’s the new posting UI:

I’m trying to implement some basic progressive enhancement - the forms work as is without javascript, but the switcher and the counter are niceties for me, the author.

#webdevelopment #progressiveenhancement #goldfrog

Learning Can Be... Boring?

Ran into a friend today at church and he asked me “hey I’m trying to learn Python, do you have any good sites or books to recommend? I’m kinda… bored.”

Now some of us geeks can’t imagine being bored learning something new, but I went through this when I first started learning Go. I had decided I wanted to learn a new programming language, and Rust was way too… Rust, so I picked Go and started building a small o-nothing web app. I got part way in an realized that I had no interest in what I was doing, and it (and some bits of Go that hadn’t matured) was killing my fun. So I put it down.

Fast forward to this year. I was ready to pick up Go again, but this time I also knew that I wanted to start writing again, and that the friction in my blogging process was killing my joy there, too. So I decided to write my own blog software (see #goldfrog), and I was going to write it in Go.

Suddenly I was energized to learn, because I had all these feature ideas for the site, and I had to learn the #golang techniques for tasks I’d only one in #python before. Also, it got me into the golang newbies Slack, and connecting with a community - for me at least - helps.

So my advice to my friend was:

  • Find a project you’re passionate about, or at least really interested in
  • Be willing to re-learn things you think you already know
  • Find a #community!

#goldfrog #golang #python #community

Steve Ivy

Looks like I need a #bookmark feature in #Goldfrog now: “Agile as Trauma”

~ # 15:13 ~

Steve Ivy

Yesterday I imported 7800+ tweets into Goldfrog, my blog/cms, as part of owning my own content. Tweets (or Notes) will be published on and be syndicated to Twitter. See my archive page (20 years worth), blue are posts and pink are notes

~ # 23:31 ~

Goldfrog updates: syndication

If you follow me on social media - Twitter or Mastodon - you may have seen lots of nonsense posts go by recently… Shot 2020-02-06 at 8.19.51 PM.png

I’ve been working on improving my POSSE features here, which meant not only composing my posts and notes locally, and then publishing them to Twitter et al, but also being able to track where they “landed” (ids and links) and make it easy for users to find my content on the syndicated site.

So I dug back into my syndication code, rewrote it several times, learned some things about goroutines, learned how not to do some things with goroutines, and settled on a way that worked. With luck, this post and any other that is also published on Twitter or Mastodon will have links to those sites along with the post, and (at least for Twitter right now) have links to reply, favorite, or retweet the post.

As Dave used to be fond of saying:

Still digging!

#blogging #goldfrog #indieweb

Steve Ivy
Steve Ivy

Finished #webmention discovery in #goldfrog, all 23 discovery tests on pass. :)

~ # 02:14 ~

Steve Ivy

For my next #indieweb trick: I’m working on adding support for Webmention in #goldfrog.


  • Endpoint discovery (header, link, a)
  • Send basic webmentions
  • Send “special” webmentions (ie Likes)


  • Provide discovery (header, link, a)
  • Receive basic webmentions
  • Receive “special” webmentions (ie Likes)

Ultimately I’d like to break out my webmention code into a releasable #golang module that can provide reusable http.Handler functions that can be plugged into any Go mux that supports them.

~ # 00:00 ~

Steve Ivy

I’ve added POSSE-style notes to #goldfrog.

~ # 10:25 ~

Steve Ivy

Golang Templates Cheatsheet

This resource really helped as I’ve been building #goldfrog.

Golang Templates Cheatsheet


~ # 21:19 ~

Steve Ivy

Goldfrog: cross-posting to Mastodon works

Ooooooh, yeah #goldfrog #mastodon

~ # 21:13 ~

Steve Ivy

Twitter cross-posting for #goldfrog is technically working, but the templates are not yet rendering the twitter metadata properly, so links are not showing up as nicely as I wish they would.

Next up will be mastodon posting.

~ # 02:45 ~

Steve Ivy

This resource really helped as I’ve been building #goldfrog.

Golang Templates Cheatsheet

Go’s template system is rich and powerful, and not much at all like systems in #Python, which is why it’s been breaking my brain.

~ # 00:00 ~

Steve Ivy

Ooooooh, yeah #goldfrog #mastodon Shot 2020-01-09 at 11.47.08 AM.png

Thanks to go-mastodon this was super easy.

~ # 00:00 ~

Steve Ivy

@bitprophet That was one of the motivations for #goldfrog - needed a positive direction for my brain to go

~ # 02:00 ~

Steve Ivy

Another aspect to creating my own blogging software: I can finally start implementing some of #indieweb principles I’ve been watching for a while.

One of those is POSSE (Publish Own Site, Syndicate Everywhere) - which means everything you write starts on your own site, and content is syndicated to the appropriate kinds of sites as desired. This could include things like:

  • Articles are syndicated via RSS (done, no brainer)
  • Short posts (notes) are automatically or optionally published whole to Twitter, Mastodon, or the microblog of your choice
  • Articles are automatically or optionally shared to a microblog site with a link back to your own site

Goldfrog + Twitter

While I generally find Twitter overwhelming and frustrating (not nearly as much so as the less-privileged do), I just finished adding a Twitter cross-poster to #goldfrog. I’ll be implementing a Mastodon cross-poster in the next few days (/me waves @, now that I’ve figured out and implemented the pattern.

The Twitter cross poster will send the title, some text, and a link back to the post. So, let’s see if deploying the new feature worked. :D

~ # 00:00 ~

Steve Ivy

A late feature I added to #goldfrog that I was really happy about: hashtags! I love them on social media, and since I included a tags fields in the blog schema… so I added some code that parses hashtags when posts are saved, and adds them to the post tags. I also added a tag search to the site, and I have a filter that auto-links hashtags to the tag search.

So be prepared to see lots of #hashtags in my posts now :)

~ # 00:00 ~

Steve Ivy

What is the difference between this:

/static/images/Screen Shot 2020-01-08 at 1.17.44 PM.png

Posted by Dave Winer with a link, and this:

/static/images/Screen Shot 2020-01-08 at 1.17.59 PM.png

Posted by #goldfrog via the Twitter API with a link to this site?

~ # 00:00 ~

Write The Web, 2020

For 2020, I’m writing a new blog app. It’s just for myself, a toy to remind me why I love the web. It’s called Goldfrog, and it sounds a bit like “Go, blog!”

Why in the hack, in this day and age, would I spend time writing my own #blogging software, when you can’t sign up for a VPS anywhere without tripping over offers to help you set up Wordpress, or Ghost, or what have you?

A few reasons.

New Year, New You

2019 was shite-filled, and due to politics, the tech trashfire, and the friction of blogging through several variations of static, git-powered versions of this site, I simply stopped blogging. I’ve wanted to, but the effort killed the motivation before I could get some words out.

So I finally decided to write something myself, that did just the things I wanted. #goldfrog is written in Go, because while I will love Python to my dying day, my brain needed a kick in the pants this year, which relates to my next point.

The Builder’s High

Rands writes eloquently on the builder’s high. With family engagements and work over the last few years my hobby coding has dropped to almost nil (None if I were writing Python).

I needed something to reboot my creative juices, and trying to write something I really wanted, that thought would be quick, in a new language, seemed like a good way to go (I did want it, it wasn’t easy, and Go hates me. But I’m learning and that feels great!)


/static/images/Screen Shot 2020-01-07 at 4.51.44 PM.png

A bit more about Goldfrog: the single feature I wanted was a posting form on the home page, right up front. Various Userland products had had this, and it always felt right.

Second to this was an “Edit” link next to every post, wherever it was found on the site.

Finally, my main technical “innovation”: My content is still stored on the filesystem as Jekyll-compatible Markdown files. However, build times via Jekyll or Hugo are fairly slow for my 2800+ posts (since 2000, baby) and I hate that. So #goldfrog indexes all posts in a sqlite database on disk. Post creation and edits go to the DB and to the filesystem, so I can still periodically sync the changes to the git repo I have checked out there. But all the list views, archives, tag pages, and search functionality go to the DB, and are really fast.

The Setup

This is really the app I’ve wanted for a long time.

  • It’s hosted on a Linode “nano”
  • The app builds on CircleCI and the binary is pushed to an S3 bucket.
  • I’ve got ansible playbooks that setup the VPS pretty much from scratch with Nginx fronting Goldfrog.


I really need to get my logging story fixed, and I’ve got some idea on adding basic metric tracking to the app.

#blogging #goldfrog

Steve Ivy

#goldfrog is coming along - archive pages done and image uploading works. I think the image upload feature is a nice addition and doesn’t add a lot of complexity

~ # 22:04 ~

Steve Ivy

Got #circleci working better than Travis, also added a new feature to #goldfrog today that worked first time, so of course my server setup is like a flaming turd

~ # 20:46 ~

Steve Ivy

@travisci #goldfrog #blogging taking a code break to fiddle with ansible and make pretty pictures

~ # 03:04 ~

Steve Ivy

Progress today: post editing and deleting, many template updates.

I managed NOT to throw the laptop across the room when figuring out golang html/template :win:

Working on a @TravisCI build pipeline, here’s to again not throwing my laptop

#goldfrog #blogging #writetheweb

~ # 23:16 ~

Steve Ivy

This is one reason I’m building #goldfrog

~ # 16:39 ~

Steve Ivy

I’m not sure, but I think Userland Manila was the first blog software I used that had the new post form integrated right into the front page. Tonight I got #goldfrog doing the same, and I am SO excited. #writefortheweb

~ # 06:44 ~