_______   __         ______    ______
/       \ /  |       /      \  /      \
$$$$$$$  |$$ |      /$$$$$$  |/$$$$$$  |
$$ |__$$ |$$ |      $$ |  $$ |$$ | _$$/
$$    $$< $$ |      $$ |  $$ |$$ |/    |
$$$$$$$  |$$ |      $$ |  $$ |$$ |$$$$ |
$$ |__$$ |$$ |_____ $$ \__$$ |$$ \__$$ |
$$    $$/ $$       |$$    $$/ $$    $$/
$$$$$$$/  $$$$$$$$/  $$$$$$/   $$$$$$/
Hello World

18.10.2025 03:28

This is my first blog post.

It looks like an old computer, but it is supposed to be minimalistic, so that is how it will look, maybe with a few improvements later.

To add a post, copy the previous post section below and edit the content.

This machine does not have PHP, and it never will.

Everything is based on HTML, CSS, and JavaScript to keep it lightweight.

Welcome back

24.12.2025 02:23

I am back after a short break to switch to a new domain, update my SSL certificate, and perform system updates and maintenance.

I would also like to wish you a Merry Christmas and a Happy New Year.

After the New Year, I will definitely find time to finish my todo list, but I also have other cool ideas, like my own search engine based on YaCY.

IPFS Support Enabled

10.01.2026 07:04

The server now supports IPFS.

Current CID:
bafybeifdgvgxkkno2evfdrihox3z3a7tifcx5zlvybs7uj7hcrzfbehlle

Public gateway:
https://ipfs.io


Archived CID:
bafybeidzz7pjuebcccrnoleqq5uyhaup3jl3yloqzc4wsvzeql5byn6f6i

Archived version gateway:
https://ipfs.io

This setup improves resilience, decentralization, and independence from traditional hosting paths. More experiments coming soon.

Main Site Hosting & Backups

10.01.2026 07:22

The main website is currently hosted on Cloudflare Pages. This setup is temporary, but it works well for now: fast, globally distributed, and easy to deploy.

I also created additional backups of the site on another server and synced a copy to Dropbox. This ensures that even if something breaks, the content can be restored instantly.

I have also finished the remaining tasks from my TODO list. More improvements are coming as I continue refining the whole infrastructure.

Restoring the Terminal: Website and Tor Address Back Online

10.05.2026 00:20

The terminal website has been restored and moved back to a local Debian server.

The previous server finally died of old age, so Adrian from heterodyna.pl funded a new machine to bring the terminal back online and keep this small self-hosted infrastructure alive.

The static HTML files are now served directly from the computer again. Nginx handles the local website, while Cloudflare Tunnel exposes the public address.

I also restored the old Tor onion service from backup keys, so the previous Onion address is active again.

The current setup uses a lightweight stack: static HTML, Nginx, Cloudflare Tunnel, Tor Onion service, and Tailscale/WireGuard for private access.

No PHP. No database. No heavy CMS. Just simple files, backups, and services that can be restored quickly when something breaks.

This is exactly the kind of infrastructure I like: small, understandable, independent, and easy to rebuild.

Public Status Page Added

10.05.2026 00:45

I have added a public status page for the infrastructure.

The status page shows the current availability of selected services related to the project, including the public terminal website and other important endpoints.

This is useful because the status page is hosted outside of the main server. If the terminal server goes down, the status page can still show that something is wrong instead of disappearing together with the monitored machine.

A small status badge has also been added to the main page, so visitors can quickly check whether the services are operational.

New Cleanup

17.05.2026

I cleaned up a few things on the server.

I added an Invidious client, which is an alternative YouTube frontend without ads, and I also set up an admin panel that is available only to me through VPN access.

Pi-hole is filtering network traffic, and the firewall blocks malicious hosts.

I am still waiting for the temperature sensor. When it arrives, it will be possible to check the temperature in my room again.

A ten-gigabit network switch is also on the way, so the real fun will begin soon.


The Invidious instance works as my private YouTube player without ads. I do not plan to pay a corporation that already earns billions - not because I am cheap, but because I simply do not agree with their policy.

I do not give out shell accounts, so please do not message me asking for one. If you want a cheap shell or VPS for your own experiments, I recommend:
frog.mikr.us

Building a Private Google Photos Replacement with Immich and Syncthing

12.06.2026

I recently built a private photo backup and synchronization setup using Immich and Syncthing. The goal was to replace a cloud photo service with something self-hosted, private, and accessible only from trusted networks.

The setup combines automatic phone photo synchronization, a web photo gallery, private DNS, HTTPS certificates, and a reverse proxy in front of the web panels. No real domains, private addresses, or internal paths are included here - only the general technical design.

Architecture

The system is split into clear parts:

Phone
  |
  | Syncthing sync
  v
Self-hosted server
  |
  | Synced photo folder
  v
Immich external library
  |
  | HTTPS through Nginx
  v
Private photo web interface

Private service access

The web panels are available through private hostnames. They are not public service endpoints. They are resolved by local DNS and are meant to work only from LAN or a private VPN.

<private-photo-panel>
<private-sync-panel>

A simplified private DNS layout looks like this:

<private-photo-panel> -> <local-server>
<private-sync-panel>  -> <local-server>

This keeps the setup convenient without exposing the panels directly to the public internet.

Syncthing folder design

Syncthing handles the phone-to-server photo transfer. For photos, the safer mode is:

Phone:  Send Only
Server: Receive Only

This prevents the server from acting like a two-way editor of the phone gallery. The phone sends photos, and the server receives them as a backup target.

Before syncing the real photo directory, I tested the connection with a small test folder. After confirming file creation, deletion, and synchronization worked correctly, I moved the real photo folder into the setup.

Immich external library

The synchronized photo folder is mounted into the Immich container as a read-only external library.

/mnt/phone-photos

The read-only mount is intentional. Immich can scan, index, generate thumbnails, and display the media, but it cannot modify or delete the original synchronized files.

Nginx reverse proxy

Nginx sits in front of both panels:

<private-photo-panel> -> Nginx -> Immich
<private-sync-panel>  -> Nginx -> Syncthing GUI

The reverse proxy provides:

The services remain private, but they still use normal HTTPS certificates.

SSL certificates

Certificates are issued using DNS validation. This makes it possible to use valid HTTPS certificates without exposing the web panels publicly.

Valid HTTPS certificate
Private DNS access
No direct public exposure of admin panels

Fail2ban adjustments

Fail2ban remains active for suspicious traffic and bot-like requests. Trusted LAN and private VPN ranges are excluded from bans to prevent accidental lockouts during testing.

This keeps the protection active while avoiding bans of trusted devices.

Backup and working state

After the setup was confirmed working, I created a working-state backup containing:

This gives me a safe restore point before making future changes.

Final result

Phone photo sync:        working
Syncthing pairing:       working
Immich external library: working
HTTPS access:            working
LAN/VPN-only access:     working
Working backup:          created

This is now a practical private Google Photos replacement: photos are synchronized from the phone, stored on my own server, indexed by Immich, and accessed through private endpoints.

Temperature Sensor Restored

07.07.2026

The room temperature and humidity sensor is back online.

After a sensor failure in May, the temperature page stopped working and stayed offline for a while. The replacement sensor finally arrived, so I restored the Arduino-based telemetry setup and brought the readings back.

The new sensor is now connected, the local status page is working again, and the data is also being sent to ThingSpeak with a safe update interval.

Live sensor page:
https://terminal.myselfhosted.online/temperature/

[ TOP ]