My Life

Top-level Files of tip

Top-level Files of tip

Files in the top-level directory from the latest check-in


My Life. On the Web. In your RSS reader.

Source code hosting

The canonical location for this project's source code is


If you'd like to chat about this project, you can contact me various ways that are listed on my website (powered by this project!):



lein run


Run lein fulltest to check everything. This command is also executed as part of the podman image build (see below).

To get into a continuous unit testing mode, run lein test-refresh.

The SSL test is really slow. If you aren't working with it, you can run SKIP_SSL=true lein test-refresh.


I host mylife and its supporting infrastructure (source code, etc.) alongside a few other toy projects in two different places:

mylife is hosted all by itself on a remote server running alpine, since it is completely self-sufficient. I used bin/provision to set it up and bin/update-mylife to start it up. Since I already had a database I first copied the database files over to that machine.

The server is the smallest I could get. Costs $5/mo.

Every time I publish new code I can just run bin/update-mylife to upload and start the latest podman image that I build locally using bin/package. This also packages up a custom-built fossil binary that I host on my local server.

I run nginx, fossil, and some other toy projects that have their own package scripts (you can find them in the fossil repo) using bin/start

There are a couple of files I need in my home directory before running anything above. I set them up this way:

cp infra-env.template ~/.infra-env
cp mylife-env.template ~/.mylife-env

Then I edited those files and updated appropriate domain names and IP addresses.

I also backup my blog database and everything else using a cron job that runs bin/backup-mylife-db

One more thing.. SSL. I wrote a script called bin/run-certbot that I used to set up SSL. The first time you startup nginx it will check for SSL certs in $HOME/.certbot/letsencrypt and, if it finds them, it will wire up the fossil and coffeetime servers to use SSL. Otherwise it'll just setup the .well-known/acme-challenge stuff so you can then run the bin/run-certbot script.

It defaults to doing a dry run. If the dry run succeeds, you can follow the instructions the script gives you to generate the scripts for real.

Then run bin/start-nginx

I also have a cron job that basically runs bin/run-certbot and bin/start-nginx once a day.

If you know/like Docker, it should also work. The Containerfile at the root of the project drives container construction.

Podman idiosyncrasies


I have had no serious issues with using the default Podman installation in linux (PopOS). Though, I did have to edit /etc/containers/registries.conf to add this:

unqualified-search-registries = [""]
This wasn't necessary on the default installation of Alpine.


I haven't figured out how to make this work. If you want to use Mac OS as a container host, you'll likely need to use Docker.


I don't make any attempts to maintain backwards compatibility because I'm the only person I know of using this software. If you are running this thing in production, please let me know so I can change my workflow to pay attention to your needs!


Copyright © 2023 Stephen Starkey

This program is free software: you can redistribute it and/or modify it 
under the terms of the GNU Affero General Public License as published by 
the Free Software Foundation, either version 3 of the License, or (at your 
option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT 
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License 
for more details.

You should have received a copy of the GNU Affero General Public License 
along with this program. If not, see <>.