2025-10-04 13:48:53
This post is an attempt to navel-gaze on the finer points of self-hosting your own sites & services. I’m going to put down some of the important but easily over-looked considerations that can really make a big difference. The goal is to help plan to make the most of the hardware you have access to without breaking the bank. There won’t be too much in-depth technical details, but more of an overview of things to think about to guide decision-making. If you’re looking for specific instructions, Reclaiming Territory in Cyberspace is a good place to start. I’m also writing this as a reference to myself for any future server-side projects I intend to build.
I dream of a future where ordinary people express themselves from social web sites & systems that are wholly their own. This requires a bit more than mere static sites. If speed was the only consideration, we could all simply put our data on a rented cloud servers leveraging high-performance SSDs and memory. This has two major problems; cost, and lack of independence. For significant amounts of data this would cost quite a bit, effectively filtering out anyone interested in sharing non-trivial amounts of multimedia content. Realistically, if we want a vibrant open web, people are going to want fast sites & services without too much overhead.
The good news is that local storage and compute is relatively cheap. Self-hosting in 2025 means that your largest constraints are bandwidth and latency. With some clever techniques, you can intelligently leverage limited cloud resources to make the best of your personal systems. By optimizing your setup, you can make the most out of even relatively trivial computing resources. Today the bar is quite low to be able to broadcast so much to the world.
Speed is relative. Some systems and services are inherently faster than others. Static sites are king when it comes to speed on the web, but with proper care other systems can be relatively close. In addition to the privacy risks, serving sites and media from your home is generally not advisable. Your home internet connection won’t be able to handle any non-trivial amount of burst traffic, and will likely leave your visitors waiting to load any media. This gets much worse in situations where residential users only have access to so much bandwidth during a given month.
With enough of the big picture out of the way, let’s consider practical steps. Regardless of what systems and services we choose to run, we have to contend with physics and real-world costs. Hardware can only work so hard and data can only move so fast. The goal is to make the best use of available resources by contending with their limitations. In some situations it may make sense to be extremely selective, but in others it may make sense to take advantage of everything that is available.
Consider the following table, outlining the trade-offs of retrieving data from various methods:
Type | Retrieval Scheme | Cost | Speed | Throughput | Independence |
---|---|---|---|---|---|
Network | Enterprise ISP | Extreme 💰 | High | Extreme 🌊 | ? |
Network | Residential ISP | Moderate | Slow 🐢 | Low 💧 | Low |
Network | Mobile ISP | High | Slow 🐢 | Low | None 🔇 |
Network | Sneakernet | Moderate | Varied 🤷 | Varied 🤷 | Perfect 💎 |
Network | Postage | Cheap 🫰 | Glacial 🥶 | Varied 🤷 | High |
File access | Memory (Cloud) | Extreme 💰 | Extreme ⚡ | Extreme 🌊 | None 🔇 |
File access | Memory (Local) | Low | High | High | Perfect 💎 |
File access | File System (Cloud) | Moderate | High | High | None 🔇 |
File access | File System (Local) | Slow | High | High | Perfect 💎 |
File access | Object Storage (Cloud) | Low | Extreme ⚡ | High | None 🔇 |
File 🤡 | Generative AI (Cloud) | Absurd 💸 | Fast | High | None 🔇 |
File 🤡 | Generative AI (Local) | High | Slow 🐢 | Low 💧 | High |
The point of this chart is to point out that there are inherent trade-offs when it comes to leveraging particular resources. You can specialize by focusing on a few, or handle the complexity of trying to ‘have your cake and eat it too’. By understanding this, you can understand that there are opportunities to leverage (but not necessarily depend on) particular tools to help enhance your systems.
The main point of self-hosting is to keep your data under your control. This is best done with your data on machines you control, rather than cloud providers. This has another significant advantage, storage devices themselves are often relatively cheap. You can store your data on high-end SSDs, and make what you want accessible to either your network or even the public. This can be a LOT cheaper than buying large amounts of cloud storage at the price of some initial cost. That said, if you intend to serve a large volume of data, or to a large audience, trade-offs may have to be considered.
Just like cloud storage, cloud compute can become expensive quite quickly for demanding tasks. By self-hosting you can pay up-front for your compute needs which often saves you money in the long run. An example of this would be using powerful machines at home as remote runners for a PeerTube instance running on an inexpensive VPS. This would allow you to speed up processing videos without sacrificing on availability to the public Internet. Also similarly to storage, there are serious privacy & security benefits of doing the majority of compute tasks on your own machines.
For small or simple sites and services, redundant mirrors can allow your setup to exist across multiple networks (such as darknets) but a ’thin-cache’ is a simple way of achieving the same goal. By having the external facing server (such as a cheap VPS or mini-pc running a darknet daemon) operate as a server-side cache, you can still reduce the latency penalty of self-hosting. This allows your media to be highly available despite having a relatively modest setup.
Since you’re likely dealing with constrained resources, or at least a ‘shoe-string’ budget, it makes sense to optimize things however you can. Even if you’re not aiming to be on the 512KB club, it is absolutely worth your time to consider how you can save your guests time, and yourself resources.
Content: Text is king
It may be worth applying the logic of “this meeting could have been an e-mail” to your own content. If a visual medium isn’t entirely necessary, text may suffice. At minimum, treating text content as a first-class format is critical. Text is universally accessible, and plays nice with text-to-speech systems as well as translation. This also applies to file formats, plain-text data such as html tables and svg images can often be much lighter than images for simple information. With some creativity, a great deal of information can be presented with hardly any bandwidth at all.
Compression: Minimize all the things
Hosting media files can be the biggest challenge for small self-hosting setups. If you’re not familiar with how to compress audio & video files you may be unnecessarily using up loads of bandwidth and storage. For a great deal of content it’s not entirely likely that you need full 4K resolution to get your ideas across. The smaller your media files are the easier it is to mirror them and the faster they load for slow connections. FFmpeg is my go-to for compressing audio & video. Remember that you can always keep your full-quality copies for local use!
Client-side: Make it their problem
With some careful consideration, it can be effective to optimize your setup to have much of the work done on the client-side. At minimum you’re going to want to make intelligent use of client-side caching to reduce load on your services. Another valuable pattern is to lazy load media files on your pages. These simple but effective optimizations can make a big difference on constrained networks.
Since the optimal strategy is to divide tasks between at least two machines, it makes sense to make use of tools like SSH tunnels and VPNs to provide a secure ‘backbone’ for them to communicate. It can be useful to use a cheap VPS to act as the public cache/mirror for your sites & services rather than just purchasing a tunnel to the Internet directly. Ultimately it will depend on your bandwidth and latency as well as the nature and volume of media you’re sharing. The cool thing is that with a deliberately distributed setup, you can make your systems available not only for the ‘clearnet’ but darknets or even nearby networks as well. With enough flexibility the options are truly endless.
I am always excited to see more people get into self-hosting and I’m hoping that people find this helpful. In an ideal world, the web would be small and filled with ordinary people expressing themselves easily and seamlessly. I believe that achieving that dream requires for there to be more resources and tools for people to not just self-host but self-host well and effectively. If nothing else I hope that this minor overview can be a small contribution towards that.
I’ve really just scratched the surface of this topic, but there is certainly more to cover.
Any feedback you may have would be greatly appreciated if I’ve missed some major blind-spots.
Thank you for reading this through RSS 📡
Your thoughts and feedback are both very important to me.
Get in touch!
2025-10-03 06:17:24
In this off-the-cuff recording I celebrate being back on the downtrend, and spend time reflecting on my concerns related to the politicization of health. It seems that novel therapeutics and the end of the ‘monopoly on medicine’ may create unique challenges for biological human rights in the future.
I am experimenting with using libre audio & video formats in this post, so please let me know if anything isn’t working.
I am thrilled to report that I’ve managed to hit a new low again, confirming that I am already back on the downtrend. It is comforting to overcome being disrupted by pain as well as become slightly more comfortable with making mistakes. I have to admit that I’m at kind of a weight point in my journey. Having made so much progress since the high of over 570, I’m struggling to comprehend how much better I can feel as I approach a healthy body weight. As strange as it may sound, I am now near the lowest I’ve been for most of my adult life, so I feel the best I have been acclimated to in a long time. That said, I’m very much looking forward to biking in the spring time, and many other activities that open up as I change.
To satisfy my insatiable curiosity, I’ve recently been absorbing discussions around anabolic steroid use, as well as experimental peptides. In reflecting on these issues I’ve wondered to myself if losing weight (or building muscle) ’naturally’ matters much. I have not / will not be taking any weight loss or performance enhancing drugs, but I am very fascinated by the broader discussion around these things. The implications seem to be directly related to broader trends in healthcare and human rights in our time.
To spoil the rant a bit, I am concerned that the combination of unique therapeutics, social pressure, and public health initiatives can politicize health on a level previously unthinkable. This is especially concerning in light of governments and Big Tech taking control of people’s health data, and potentially weaponizing it against the public. I wholly expect that a combination of debilitating austerity and the digitization of health information can create a terrifying form of automated bio-tyranny.
I wholeheartedly believe that natural (and healthy!) body change is an act of defiance and rebellion from some of the most insidious forces at play in our time. However, I think it is important to have the humility and understanding to recognize the forces that drive people to consider potentially self-destructive ’enhancements’. So I would say, how we approach weight loss or other body change does definitely matter. The challenge is that these novel advancements seem to ultimately raise the stakes of our responsibility to care for those around us in the face of very insidious challenges.
Thank you for reading this through RSS 📡
Your thoughts and feedback are both very important to me.
Get in touch!
2025-09-25 19:30:13
The last week has been a bit of a disaster. I was very excited to continue pushing towards the low 300s, but unfortunately I’ve hit a major setback. I have a wicked ear infection that has been causing me extreme amounts of pain. As such, I’ve essentially lost nearly all control over my eating habits. In a fit of restlessness, I recorded this update while coming up with a plan to bounce back from this. It is frustrating to lose all of September’s progress to this, but I’m taking it as a lesson in patience and perseverance.
Thank you for reading this through RSS 📡
Your thoughts and feedback are both very important to me.
Get in touch!
2025-09-18 06:43:57
I’m thrilled to report that I’m comfortably below 350lbs. Coming from a high of over 570lbs not that long ago, it is quite astonishing what has changed. I’m finally beginning to fit into 2XL clothes, (down from 6XL!) taking on a wider variety of exercises, and getting a lot of positive feedback from people online and IRL. As you can see a great deal of weight has been lifted off of me, in ways beyond just physical. So many simple things are much easier, and I’m really excited for what’s ahead. If you don’t mind me getting a bit sappy, you might find this update worth listening to.
Since ~350lbs is the maximum weight capacity for a variety of cardio machines, being below it expands my options quite a bit. I’ve begun to use the elliptical and stationary bike to really try to push myself to the limit. I’ve mentioned before that changes to your body composition have huge impacts on the sensation of swimming. I am definitely going to miss being able to float on the water effortlessly, but I’ve unlocked a fun new thing. I can now much easier stay underwater while swimming, which is super fun and cool.
I’m eager to push ahead on a wide variety of fitness goals. As my body begins to restrain me less, I am eager to do more and more. It has been incredibly gratifying to take this opportunity to push myself to be familiar with so many things I hadn’t ever tried before. Going from struggling with even basic mobility to trying to become highly active has been equal parts fun and gratifying. One of the adventures I’m on in this regard is learning how to actually train hard while weightlifting. With some honest reflection, it’s clear to me that I very much struggle to really push hard against the weight when it begins to get tough. I am really appreciating what I am learning in improving both my strength and cardiovascular capacity.
Thank you for reading this through RSS 📡
Your thoughts and feedback are both very important to me.
Get in touch!
2025-08-27 19:01:54
Things have been challenging lately. I’ve been working hard to start counting calories again as well as taking another stab at kicking my caffeine habit. Pressure has been mounting and so have frustrations, but I’ve been doing well to regain momentum. I still struggle to learn to properly pace myself and truly prioritize recovery, so I’m taking time to take on those challenges head-on. Recently I was able to go for a swim and it did me quite a bit of good. I hope you’ll enjoy this off-the-cuff stream of consciousness about my weight loss journey.
The great news is that I’ve hit a new low of 353.4! I’m very close to the below 350 milestone. I’m really looking forward to getting a dexa scan, and using more cardio machines at the gym! The hope is that I can be very comfortable cycling before I even get on the bike! I’m eagerly looking forward to being able to fit into 2xl clothes, which radically opens up more options for me. I can put them on, but they don’t fit quite yet. What is funny to me is that compared to the 6xl clothes that I started this with, 2xl feels downright TINY. With optimism returning, I’m looking forward to hopefully being below 300 by the end of the year!
Over the last year of lifting I’ve gotten a few InBody snapshots. While these kinds of measurements have to be taken with a grain of salt it’s nice to have something to compare against. According to my latest scan I only have 144lbs left to lose, which would mean I’m way more than halfway done! According to the scans I’ve gone from a BMI of 80 to 53.
Segmental Lean Analysis: Allegedly 100% is supposed to be what’s normal for your size, so I’m thrilled to at least be pushing over 110% in many limbs! I can definitely say I would love to see over 120% on multiple limbs as I continue along.
Body Part | Sept 24 | Jan 25 | Aug 25 | Total Change |
---|---|---|---|---|
Arm (R) | 109.% | 111.5% | 116.6% | +6.8% |
Arm (L) | 111% | 110.4% | 118.7% | +7.7% |
Core | 101.4% | 102.5% | 106.5 | +5.1% |
Leg (R) | 95.9% | 97.6% | 110.1% | +14.2 |
Leg (L) | 96% | 94.5% | 106.5% | +10.5 |
Thank you for reading this through RSS 📡
Your thoughts and feedback are both very important to me.
Get in touch!
2025-08-05 05:28:40
The long awaited Ghost 6.0 is OUT! This version is the much-anticipated update that allows self-hosters to use “the social web” with their Ghost websites. This is pretty good news, but for me it was quite a headache. I had already migrated one of my websites Canadian Cyber Freedom to Ghost in anticipation for this particular update. It seems that Ghost didn’t integrate activitypub support into ghost directly (which seems like an odd choice) but instead requires two new containers (and multiple others for their analytics support).
Unfortunately, none of this is clear when you just upgrade your Ghost container to version 6. Social web support will appear to be on, but it won’t actually work. I immediately checked the documentation and it says you just need to update your environment variables. Which lead me to realizing that I needed to configure additional containers by checking the new docker-compose.yaml file. Counter to the official recommendation I’m running Mariadb instead of mysql, this is a HARD STOP for the activitypub-migrate
container, so if you’re doing that too you’ll need to setup a new mysql container just for activitypub support.
I hope people who are stuck on trying to get federation via Ghost might find this post helpful. Once you’re setting this up, it’s important to clear cache & cookies regularly until you’ve confirmed it’s working. If you can load the new parts of Ghost after logging in to an incognito tab, you’ve configured everything correctly.
You’re going to need to make sure fediverse requests are handled by the activitypub
container. The port I chose was arbitrary, but you can configure your own in the compose file.
Here are my settings:
location ~ /.ghost/activitypub/* {
proxy_pass http://localhost:2369;
proxy_set_header X-Forwarded-For $remote_addr;
add_header Access-Control-Allow-Origin *;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
}
location ~ /.well-known/(webfinger|nodeinfo) {
proxy_pass http://localhost:2369;
proxy_set_header X-Forwarded-For $remote_addr;
add_header Access-Control-Allow-Origin *;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto https;
}
X-Forwarded-Proto
cause of this issue
You need to add the two new containers to your docker-compose.yaml and configure the correct DB. activitypub-migrate
just needs to do its work, so you can just re-launch it with docker-compose up
or docker-compose restart activitypub-migrate
when needed.
activitypub:
image: ghcr.io/tryghost/activitypub:edge
restart: always
volumes:
- ./ap_uploads:/opt/activitypub/content
ports:
- 2369:2369
environment:
PORT: 2369
NODE_ENV: production
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: YOUR_PASSWORD_HERE
MYSQL_DATABASE: activitypub
LOCAL_STORAGE_PATH: /opt/activitypub/content/images/activitypub
LOCAL_STORAGE_HOSTING_URL: https://YOUR_WEBSITE/content/images/activitypub
depends_on:
- mysql
activitypub-migrate:
image: ghcr.io/tryghost/activitypub-migrations:edge
environment:
MYSQL_DB: mysql://root:YOUR_PASSWORD_HERE@tcp(mysql:3306)/activitypub
depends_on:
- mysql
Any website served by ghosts hosted service should already be accessible. You can now follow these sites via the fediverse by their @[email protected]
handle. But I’m concerned that self-hosted set-ups will run into the issues that I did.
I noticed that @[email protected] works great, but @[email protected] sadly doesn’t.
You can test if the self-hosted ghost instance has activitypub configured by going to example.com/.ghost/activitypub/users/index/
and seeing if you get a reply or an error.
Thank you for reading this through RSS 📡
Your thoughts and feedback are both very important to me.
Get in touch!