Hacking on Indiekit to customize my blog


Lately, I have been investing a significant part of my free time into extending my Indiekit fork with features I personally needed. What started as a few tweaks progressively evolved into a broader effort to rethink parts of the backend UI and to build a growing ecosystem of custom plugins.

You can explore the full development log here, but below is a structured overview of the main changes and additions.


Welcome view

The default horizontal navigation in the Indiekit backend started to feel limiting as the number of features increased.

Before

After

I redesigned the layout into a vertical sidebar navigation. This makes the interface more scalable and far easier to use as the plugin count grows.


Editor view

While writing longer posts, constantly scrolling back to the top toolbar became frustrating. To improve the writing experience, I forked the Indiekit frontend package and implemented a contextual floating toolbar inspired by Medium. It appears when selecting text, making formatting much more fluid.

In addition, I integrated a file browser directly inside the Markdown editor, allowing previously uploaded media to be inserted anywhere in the post without leaving the editor.

You’ll also notice the target syndication section. The site is configured to POSSE by default to Bluesky and Mastodon, with LinkedIn available on demand, and IndieNews selectable as an “Elsewhere” target when relevant.

I may revisit the IndieNews syndicator logic, as Likes containing an IndieNews URL should not automatically be pushed to the aggregator.


Posts view

The default post listing in Indiekit is intentionally minimal. However, once content grows, discoverability becomes critical.

I forked the posts endpoint and reworked the interface to support:

  • Full-text search
  • Filtering by content type
  • Date-based filtering
  • Better navigation

This leverages the MongoDB connection to make content management significantly more efficient.


Homepage Builder

This became an entirely new plugin.

I wanted complete control over my root landing page — not just a blog index, but something hybrid: CV elements, recent posts, widgets, and modular sections that I can rearrange freely.

The Homepage Builder allows configuration of:

  • The homepage layout
  • Sidebar content for the homepage
  • Sidebars per post type
  • Sidebars for individual posts


CV editor view

Serving my CV directly from the same site felt like a natural step. I built a dedicated CV plugin to manage structured CV data and expose it both on /cv/ and optionally on the homepage.

Below is the project input interface, which feeds the cv.json file used during the Eleventy build process.


Blogroll

Manually maintaining blogroll links is tedious. I wanted automation.

This plugin allows the blogroll to be powered by:

  • A dynamic OPML feed
  • A static OPML file

Supported OPML sources include:

  • FreshRSS
  • FeedLand
  • Any direct OPML URL

Users can also add blogs manually via a clean form interface. The system includes automatic RSS/Atom/JSON feed discovery.


Podroll

The /podroll page emerged as a natural extension of the blogroll.

I wanted to:

  • Showcase the podcasts I follow
  • Consume them directly from my site

The system uses:

  • A dynamic FreshRSS OPML feed
  • A FreshRSS JSON feed

The JSON feed powers the frontend listing, while the OPML feed populates the sidebar widget.


Webmentions

I developed a webmentions-sender plugin that runs as a recurring job inside the Indiekit Cloudron container. It monitors outbound mentions and sends them to their respective targets.

Here is the interface displaying inbound webmentions. These can be surfaced in frontend widgets or on a dedicated /interactions page.


Microsub

This is one of the more ambitious plugins.

Built with assistance from Claude Code and inspired by projects like Ekster, Aperture, and Monocle, this plugin implements a Microsub server inside Indiekit.

Channels act as containers for RSS/Atom/JSON/H-feeds.

There is also a native reader view inside the backend, allowing interaction directly from Indiekit (provided target blogs support IndieWeb protocols).

Channels can be fine-tuned to reduce noise and refine the feed experience.

Feeds inside a channel:

Feed editing interface with auto-discovery of feed properties:


RSS Reader

Although I already rely on FreshRSS daily, I wanted a lightweight RSS page directly integrated into Indiekit.

This plugin allows curated feeds to power the /news page on the frontend.

It overlaps with FreshRSS, but it strengthens Indiekit as a self-contained publishing and consumption platform.


Youtube

This plugin integrates YouTube API data, allowing multiple channels to be configured and displayed either as widgets or on a dedicated page.


LastFM

To power my /listening page and sidebar widget, I built a plugin that fetches LastFM activity and integrates it into the backend.


Funkwhale

This plugin extends the listening ecosystem by integrating Funkwhale activity alongside LastFM.


Github

I wanted my development activity to be visible directly on my site. This plugin pulls:

  • Starred repositories
  • Commits
  • Pull requests

It also powers the /changelog page.


Linkedin Syndicator OAuth

Finally, I built a LinkedIn syndication plugin using OAuth, allowing selective publishing of posts to LinkedIn.


Closing thoughts

the Code for all these plugins, fork and deployment are publicly available.

Send a Webmention

Have you written a response to this post? Send a webmention by entering your post URL below.