$❯ CrowderSoup

A website about programming, technology, and life.

Tag: site-updates

Body Doubling Night

by Aaron Crowder on

My girlfriend Azure and I sometimes do body doubling night where we each take part in our own hobbies in the same room as each other. It's a great way to spend time together and still have our own interests.

Azure

Art

Azure's been working on her alcohol ink art. She's getting really good! I love watching her create art.

Aaron

Aaron

I've been working on my blog (of course lol). I created a workable posting interface from the front-end of this blog. It's what I'm using to write this post (mostly as a test).

Post Editor

The post editor allows me to select the post type:

Post type selector

It allows me to enter a title and edit content. It even includes a markdown preview!

Editor title and content

I can then select tags...

Tag selector

And finally upload images:

Image uploader

This interface is going to make posting here so much easier and more enjoyable. I'm excited about what features I'll be building next!

  1. screenshot of this page
    A screenshot of the post editor page on mobile.

Created a post editor UI that works on mobile!

It’s a PWA so it can be added to your Home Screen on your phone. This will make it much easier for me to post here.

by Aaron Crowder

IndieWeb Foundations

by Aaron Crowder on

I have been fascinated by the IndieWeb community for years. I have participated on and off as well, using this URL even. But my website has gone through so many iterations over the years that I've long since lost all that content.

This iteration of my blog is designed to be the start of my IndieWeb comeback story. It's a project, which always seems to help keep me engaged. Like all software, it will never be "done", and thus will always give me something to work on when I have time to work on something fun.

Foundations

I gave it away in the title but the point of this post is to talk about some of the things I've been doing to give myself a solid foundation to build from. The basics that I hope will let me keep building and joining more in the IndieWeb space.

Micropub

Micropub is an open web standard (W3C Recommendation) and API for creating, editing, and deleting posts on websites, like on your own domain, supported by numerous third-party clients, CMSs, and social readers.

The most recent thing I've added to this blog is a Micropub endpoint. This endpoint allows me to create posts from a Micropub client. I do have a decent post editing interface on this blog (thanks to the Django admin), but a Micropub endpoint allows me to use a Microsub client to read posts from other blogs I'm subscribed to and send them "likes" or replies by posting them to my own website. You can see an (poorly styled) example of a "like" I sent to Aaron Parecki here: https://crowdersoup.com/blog/post/page/.

Webmention

Webmention is an open web standard (W3C Recommendation) for conversations and interactions across the web, a powerful building block used for a growing distributed network of peer-to-peer comments, likes, reposts, and other responses across the web.

Webmentions are how I actually "send" a reply or "like" of a post on someone else's website. The Micropub endpoint accepts a post (which can be a like, reply, article, note, or photo), and if it's a like or reply it sends a "Webmention" to the other persons website / blog.

It's also how I recieve interactions from others. If someone sends my site a webmention it's saved and can then be displayed as interactions on my post. Right now I'm simply saving them. Eventually though, you'll be able to look at my posts and see the various webmentions they've recieved.

IndieAuth

IndieAuth is a federated login protocol for Web sign-in, enabling users to use their own domain to sign in to other sites and services. IndieAuth can be used to implement OAuth2 login AKA OAuth-based login.

I'm using the IndieAuth service IndieAuth.com right now. I plan to implement IndieAuth with my own token endpoint on this site later. For now though, using IndieAuth.com will work. This is how Micropub and Microsub servers authenticate me with my website, and my website validates the token it recieves from them against the IndieAuth.com token endpoint.

The Future

My ideal future for this website is that it becomes the hub of my digital life. That's the whole ideal behind IndieWeb. I won't stop posting on silos (Twitter/X, Instagram, etc.) but I will stop posting there first. Eventually I will implement syndication to silos from here so that things I post here will automatically be posted in those places.

Until then? I suppose you'll just have to keep following to find out!

This is my first post created using my new micropub endpoint! Super excited to flesh out more IndieWeb functionality for my blog.

Going to be using micropub.rocks to make sure I fully and correctly implement the micropub spec.

by Aaron Crowder

Blog Refresh: Django

by Aaron Crowder on

I have tinkered with this blog on and off for years. In fact, I've had a blog at some URL in some form going back over two decades. My inability to stick with a single URL or publishing platform should be documented and studied.

Nevertheless here I am writing about yet another blog refresh. I won't say this will be the last, nor will I pontificate about how this platform was custom built for me by me to grow with me. I will simply continue to write here or I won't. Only time will tell.

If you would like to know more about this blog and the technology used to develop and deploy it read on!

Code

This blog is built using Django. I have a few things I want to build into this blog and a web framework like Django will make that easier. The Django admin interface is also a nice addition.

I decided to try uv for this project instead of pip. UV is a python package and project manager written in Rust. UV significantly improved the workflow I remember from last time I used Django (at Teem).

Infrastructure

I decided to host this on Digital Ocean using their app platform. It's connected to a GitHub repository and deploys any time I push to the main branch. Digital Ocean's app platform can deploy all kinds of different apps but to make it easier and give me more control I added a Dockerfile to the repository.

# Dockerfile
FROM python:3.14-alpine

# Python runtime tweaks
ENV PYTHONDONTWRITEBYTECODE=1 \
  PYTHONUNBUFFERED=1 \
  PATH="/app/.venv/bin:${PATH}" \
  UV_NO_DEV=1

WORKDIR /app

# Install uv once, no pip cache left behind
RUN pip install --no-cache-dir uv

# Copy project metadata first to leverage layer caching
COPY pyproject.toml uv.lock* ./

# Install only prod deps into a local .venv
RUN uv sync --no-dev --group prod && \
  rm -rf /root/.cache

# Copy the rest of your app
COPY . .

# Non root user
RUN addgroup -S app && adduser -S -G app app
USER app

EXPOSE 8000

# Run migrations on every start, then launch gunicorn
CMD ["sh", "-c", "uv run manage.py migrate && gunicorn config.wsgi:application -b 0.0.0.0:8000"]

The most import part here is the CMD at the end. It's running migrations (uv run manage.py migrate) on every startup. This ensures that my prod environment always has the latest database schema.

Future Plans

Going forward I plan to add a number of things to this blog like:

  • Posting using Micropub
  • Webmentions to interact with other blogs
  • POSSE so I can post here and have those posts automatically published to other channels.

and lots more! But for now... let's just see if I can keep writing here consistently.