<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Libre Musings - Blog - Libre Musings</title>
    <subtitle>Pondering over FLOSS, code and existence</subtitle>
    <link rel="self" type="application/atom+xml" href="https://libremusings.dev/blog/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://libremusings.dev/blog/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2025-04-26T00:00:00+00:00</updated>
    <id>https://libremusings.dev/blog/atom.xml</id>
    <entry xml:lang="en">
        <title>Metadata Sanitization for Privacy ft. MAT2</title>
        <published>2025-04-26T00:00:00+00:00</published>
        <updated>2025-04-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Keerthana Rajesh Kumar
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://libremusings.dev/blog/metadata-sanitization-for-privacy-ft-mat2/"/>
        <id>https://libremusings.dev/blog/metadata-sanitization-for-privacy-ft-mat2/</id>
        
        <content type="html" xml:base="https://libremusings.dev/blog/metadata-sanitization-for-privacy-ft-mat2/">&lt;p&gt;This is a talk delivered at FOSS United Chennai&#x27;s April 2025 Meetup at Full Creative, Tharamani.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;slides&quot;&gt;Slides&lt;a class=&quot;zola-anchor&quot; href=&quot;#slides&quot; aria-label=&quot;Anchor link for: slides&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;&lt;a href=&quot;&#x2F;files&#x2F;20250426T103628--metadata-sanitization-for-privacy-ft-mat2__talk_foss_privacy.pdf&quot;&gt;&lt;strong&gt;The event slides&lt;&#x2F;strong&gt;&lt;&#x2F;a&gt; are available under Creative Commons Attribution-ShareAlike 4.0 International license&lt;&#x2F;p&gt;
&lt;h1 id=&quot;talk-agenda&quot;&gt;Talk agenda&lt;a class=&quot;zola-anchor&quot; href=&quot;#talk-agenda&quot; aria-label=&quot;Anchor link for: talk-agenda&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;The talk was a brief introduction to importance of metadata sanitization for protecting privacy and covered usage of metadata anonymization toolkit (MAT2) for removal of metadata with alternative software for mobile and web interfaces.&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Structure and components of a digital file&lt;&#x2F;li&gt;
&lt;li&gt;Usefulness of metadata&lt;&#x2F;li&gt;
&lt;li&gt;Problems posed by metadata&lt;&#x2F;li&gt;
&lt;li&gt;Introduction to MAT2 for metadata sanitization including installation and usage&lt;&#x2F;li&gt;
&lt;li&gt;Similar applications for mobile devices and web&lt;&#x2F;li&gt;
&lt;li&gt;Limitations of metadata&lt;&#x2F;li&gt;
&lt;li&gt;Q &amp;amp; A covering the challenges associated with removal of metadata in terms of quality and accessibility&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Self-hosting Ente for preserving those special moments</title>
        <published>2025-04-23T00:00:00+00:00</published>
        <updated>2025-04-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Keerthana Rajesh Kumar
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://libremusings.dev/blog/self-hosting-ente/"/>
        <id>https://libremusings.dev/blog/self-hosting-ente/</id>
        
        <content type="html" xml:base="https://libremusings.dev/blog/self-hosting-ente/">&lt;h1 id=&quot;why-ente&quot;&gt;Why Ente?&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-ente&quot; aria-label=&quot;Anchor link for: why-ente&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;I like it&#x27;s technical architecture. Yes, I am aware of &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;immich.app&quot;&gt;Immich&lt;&#x2F;a&gt; (which I believe is a cool app with great documentation and impressive backstory), but the architecture and modularity of Museum enough to be used in other services like Ente Auth makes it more appealing to my nerdy side.&lt;&#x2F;p&gt;
&lt;p&gt;I am not going to discuss about the privacy features of Ente, or why you should self-host Ente and not use Google Photos or other proprietary applications in this post, saving that for later.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;requirements&quot;&gt;Requirements&lt;a class=&quot;zola-anchor&quot; href=&quot;#requirements&quot; aria-label=&quot;Anchor link for: requirements&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;Ente&#x27;s server (museum) is a lightweight Go binary, thus it requires minimal resources. Thus the following are needed for self-hosting:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A server with minimal requirements (I used &lt;code&gt;t2.small&lt;&#x2F;code&gt; instance on AWS with Debian AMI)&lt;&#x2F;li&gt;
&lt;li&gt;A domain. You need one for your main photos service, whereas you are free to use separate subdomains for the museum (backend of Ente), album (best approach as it provides separation), and storage (you will have to enable CORS)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;nginx&lt;&#x2F;code&gt;, &lt;code&gt;caddy&lt;&#x2F;code&gt; or &lt;code&gt;traefik&lt;&#x2F;code&gt; for the web server&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h1 id=&quot;getting-started&quot;&gt;Getting started&lt;a class=&quot;zola-anchor&quot; href=&quot;#getting-started&quot; aria-label=&quot;Anchor link for: getting-started&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h1&gt;
&lt;h2 id=&quot;installing-dependencies&quot;&gt;Installing dependencies&lt;a class=&quot;zola-anchor&quot; href=&quot;#installing-dependencies&quot; aria-label=&quot;Anchor link for: installing-dependencies&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Ente&#x27;s official documentation recommends usage of Docker Compose for getting started with Ente by using &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;help.ente.io&#x2F;self-hosting&#x2F;&quot;&gt;quickstart.sh&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Installing Docker, Docker Compose and cURL is needed to get started with it.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;docker-and-docker-compose&quot;&gt;Docker and Docker Compose&lt;a class=&quot;zola-anchor&quot; href=&quot;#docker-and-docker-compose&quot; aria-label=&quot;Anchor link for: docker-and-docker-compose&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Setting up the repository and installing the needed package from &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;docs.docker.com&#x2F;engine&#x2F;install&#x2F;debian&#x2F;#install-using-the-repository&quot;&gt;this guide&lt;&#x2F;a&gt; is needed for installing the latest version of Compose, as &lt;code&gt;quickstart.sh&lt;&#x2F;code&gt; needs Compose version to be greater than 2.30&lt;&#x2F;p&gt;
&lt;p&gt;Trying to run the script as a non-root user would require some additional steps, described in the &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;docs.docker.com&#x2F;engine&#x2F;install&#x2F;linux-postinstall&#x2F;&quot;&gt;official documentation&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;setting-up-other-dependencies&quot;&gt;Setting up other dependencies&lt;a class=&quot;zola-anchor&quot; href=&quot;#setting-up-other-dependencies&quot; aria-label=&quot;Anchor link for: setting-up-other-dependencies&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Install them by the following command:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;sudo apt install curl caddy
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Installation of Caddy should automatically generate a &lt;code&gt;Caddyfile&lt;&#x2F;code&gt; used for configuration of services at &lt;code&gt;&#x2F;etc&#x2F;caddy&#x2F;Caddyfile&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;running-quickstart-sh&quot;&gt;Running &lt;code&gt;quickstart.sh&lt;&#x2F;code&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#running-quickstart-sh&quot; aria-label=&quot;Anchor link for: running-quickstart-sh&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;sh -c &amp;quot;$(curl -fsSL https:&amp;#x2F;&amp;#x2F;raw.githubusercontent.com&amp;#x2F;ente-io&amp;#x2F;ente&amp;#x2F;main&amp;#x2F;server&amp;#x2F;quickstart.sh)&amp;quot;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This should retrieve the script, create a folder named &lt;code&gt;my-ente&lt;&#x2F;code&gt; on your working directory and start the containers for the following services:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Service&lt;&#x2F;th&gt;&lt;th&gt;Port&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Web application&lt;&#x2F;td&gt;&lt;td&gt;3000&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Museum (backend)&lt;&#x2F;td&gt;&lt;td&gt;8080&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Minio (S3-compatible storage)&lt;&#x2F;td&gt;&lt;td&gt;3200&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;PostgreSQL (database)&lt;&#x2F;td&gt;&lt;td&gt;5432&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;socat (Helper. Networking in containers)&lt;&#x2F;td&gt;&lt;td&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;configuring-the-web-server-using-caddy&quot;&gt;Configuring the web server using Caddy&lt;a class=&quot;zola-anchor&quot; href=&quot;#configuring-the-web-server-using-caddy&quot; aria-label=&quot;Anchor link for: configuring-the-web-server-using-caddy&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Caddy is an open-source web server which generates SSL&#x2F;TLS certificates automatically for the domains from Let&#x27;s Encrypt, making it more easier to set up than using nginx where you&#x27;re responsible for generation and renewal of certificates.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;domain-configuration&quot;&gt;Domain configuration&lt;a class=&quot;zola-anchor&quot; href=&quot;#domain-configuration&quot; aria-label=&quot;Anchor link for: domain-configuration&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Create an A (or AAAA) record on your subdomain (if you&#x27;re hosting multiple services on different subdomains) or on your domain and enter the IP address of the server. Please note that DNS propagation should take some time.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;edit-caddyfile&quot;&gt;Edit &lt;code&gt;Caddyfile&lt;&#x2F;code&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#edit-caddyfile&quot; aria-label=&quot;Anchor link for: edit-caddyfile&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Once the containers are up and running, edit your &lt;code&gt;Caddyfile&lt;&#x2F;code&gt; to use your prefered subdomain that&#x27;s been configured.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s the configuration that I used:&lt;&#x2F;p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;photos-domain&amp;gt; {
    handle_path &amp;#x2F;api&amp;#x2F;* {
        reverse_proxy localhost:8080 {
            header_up Host photos.example.com
        }
    }
    handle {
        reverse_proxy localhost:3000
    }
    header {
        Host {host}
        X-Forwarded-For {remote_host}
        X-Forwarded-Proto {scheme}
        Access-Control-Allow-Methods &amp;quot;GET, POST, PUT, DELETE&amp;quot;
        Access-Control-Allow-Headers &amp;quot;*&amp;quot;
        Access-Control-Max-Age &amp;quot;3000&amp;quot;
        Access-Control-Expose-Headers &amp;quot;Etag&amp;quot;
    }
}

&amp;lt;album-domain&amp;gt; {
    reverse_proxy localhost:3002
}

&amp;lt;minio-domain&amp;gt; {
    handle {
        reverse_proxy localhost:3200
    }
}
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I have prefixed the backend service with &lt;code&gt;&#x2F;api&lt;&#x2F;code&gt; path in the web service to avoid dealing with another subdomain.&lt;&#x2F;p&gt;
&lt;p&gt;The host header is needed for validation of pre-signed signature.&lt;&#x2F;p&gt;
&lt;p&gt;I have used separate subdomains for the album and the MinIO storage service.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;modify-the-generated-configuration&quot;&gt;Modify the generated configuration&lt;a class=&quot;zola-anchor&quot; href=&quot;#modify-the-generated-configuration&quot; aria-label=&quot;Anchor link for: modify-the-generated-configuration&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;In &lt;code&gt;museum.yaml&lt;&#x2F;code&gt;, modify the following properties to the values below if you&#x27;re going to use a subdomain for storage:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;s3:
    are_local_buckets: false
    use_path_style_urls: true
    b2-eu-cen:
        endpoint: https:&amp;#x2F;&amp;#x2F;yoursubdomain.com
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;code&gt;compose.yaml&lt;&#x2F;code&gt;, uncomment the ports for the services that you&#x27;re going to use, by default, ports &lt;code&gt;3000&lt;&#x2F;code&gt; and &lt;code&gt;3002&lt;&#x2F;code&gt; are open for the photos web application and album respectively.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;In &lt;code&gt;compose.yaml&lt;&#x2F;code&gt;, edit the &lt;code&gt;ENTE_API_ORIGIN&lt;&#x2F;code&gt; and &lt;code&gt;ENTE_ALBUMS_ORIGIN&lt;&#x2F;code&gt; with your endpoints.&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;configure-cors-for-minio&quot;&gt;Configure CORS for MinIO&lt;a class=&quot;zola-anchor&quot; href=&quot;#configure-cors-for-minio&quot; aria-label=&quot;Anchor link for: configure-cors-for-minio&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;While using a subdomain for MinIO, it is required to configure CORS which can be done by using &lt;code&gt;mc&lt;&#x2F;code&gt; (CLI client for MinIO)&lt;&#x2F;p&gt;
&lt;p&gt;Ensure the service is running and assuming your MinIO container is named &lt;code&gt;my-ente-minio-1&lt;&#x2F;code&gt;, set an alias for your storage bucket. Do this for the bucket named &lt;code&gt;b2-eu-cen&lt;&#x2F;code&gt; since that is the one used as a primary (hot) storage.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;docker exec -it my-ente-minio-1 sh -c &amp;#x27;mc alias set &amp;lt;storage-alias-name&amp;gt; &amp;lt;minio-endpoint&amp;gt; &amp;lt;minio-key&amp;gt; &amp;lt;minio-secret&amp;gt;&amp;#x27;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Now allow specific origins or all using wildcard (&lt;code&gt;*&lt;&#x2F;code&gt;) by this command:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;docker exec -it my-ente-minio-1 sh -c &amp;#x27;mc cors set ente-storage&amp;#x2F;b2-eu-cen api cors_allow_origin=&amp;quot;*&amp;quot;&amp;#x27;
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;test-the-setup&quot;&gt;Test the setup&lt;a class=&quot;zola-anchor&quot; href=&quot;#test-the-setup&quot; aria-label=&quot;Anchor link for: test-the-setup&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Once everything has been done, test your setup by reloading or restarting Caddy.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;sudo systemctl reload caddy
sudo systemctl restart caddy
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You should be able to access Ente in your configured domain. Create a new account, the first account is considered as the admin user who can manage the platform.&lt;&#x2F;p&gt;
&lt;p&gt;It should ask for a verification code which is present in compose logs that can be accessed by&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;sudo docker compose logs
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;You should be able to upload photos and create albums. Happy preserving!&lt;&#x2F;p&gt;
&lt;h1 id=&quot;post-setup&quot;&gt;Post-setup&lt;a class=&quot;zola-anchor&quot; href=&quot;#post-setup&quot; aria-label=&quot;Anchor link for: post-setup&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;There are some things that can be done to safeguard your installation and gain maximum value out of your self-hosted instance.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;increasing-the-storage-quota&quot;&gt;Increasing the storage quota&lt;a class=&quot;zola-anchor&quot; href=&quot;#increasing-the-storage-quota&quot; aria-label=&quot;Anchor link for: increasing-the-storage-quota&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;This is to be done by using Ente CLI. Configure your endpoint using the &lt;code&gt;config.yaml&lt;&#x2F;code&gt; after downloading the binary from their releases using cURL.&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;endpoint:
    api: http:&amp;#x2F;&amp;#x2F;localhost:8080
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Assuming you&#x27;ve aliased the binary, add an account. It should prompt for your credentials. Set the environment variable &lt;code&gt;ENTE_CLI_SECRETS_PATH&lt;&#x2F;code&gt; to &lt;code&gt;.&#x2F;secrets.txt&lt;&#x2F;code&gt; (assuming the file is in same directory as the binary, or use &lt;code&gt;ENTE_CLI_CONFIG_DIR&lt;&#x2F;code&gt; for setting the directory)&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;ente account add
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Update your subscription by adding the admin&#x27;s ID by checking for the ID using the following command:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;ente account list # Get ID. Add this to internal.admin in museum.yaml
ente admin update-subscription -u email@example.com --no-limit True -a email@example.com
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;disabling-new-registrations&quot;&gt;Disabling new registrations&lt;a class=&quot;zola-anchor&quot; href=&quot;#disabling-new-registrations&quot; aria-label=&quot;Anchor link for: disabling-new-registrations&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;In &lt;code&gt;museum.yaml&lt;&#x2F;code&gt;, add this configuration:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;yaml&quot; class=&quot;language-yaml &quot;&gt;&lt;code class=&quot;language-yaml&quot; data-lang=&quot;yaml&quot;&gt;internal:
    disable-registration: true
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;migrate-to-backblaze-or-other-s3-compatible-storage-service&quot;&gt;Migrate to Backblaze or other S3-compatible storage service&lt;a class=&quot;zola-anchor&quot; href=&quot;#migrate-to-backblaze-or-other-s3-compatible-storage-service&quot; aria-label=&quot;Anchor link for: migrate-to-backblaze-or-other-s3-compatible-storage-service&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;If you want more reliability and backups, enable cold storage via the configuration file and use other external services such as Backblaze or Wasabi or AWS S3 for storing your files.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Hello World</title>
        <published>2023-01-18T00:00:00+00:00</published>
        <updated>2023-01-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Keerthana Rajesh Kumar
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://libremusings.dev/blog/hello-world/"/>
        <id>https://libremusings.dev/blog/hello-world/</id>
        
        <content type="html" xml:base="https://libremusings.dev/blog/hello-world/">&lt;p&gt;Obligatory &#x27;Hello world&#x27; to my fellow humans!&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;c&quot; class=&quot;language-c &quot;&gt;&lt;code class=&quot;language-c&quot; data-lang=&quot;c&quot;&gt;printf(&amp;quot;Hello world&amp;quot;);
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;rust&quot; class=&quot;language-rust &quot;&gt;&lt;code class=&quot;language-rust&quot; data-lang=&quot;rust&quot;&gt;println!(&amp;quot;Hello world&amp;quot;);
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;go&quot; class=&quot;language-go &quot;&gt;&lt;code class=&quot;language-go&quot; data-lang=&quot;go&quot;&gt;fmt.Println(&amp;quot;Hello world&amp;quot;)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;lisp&quot; class=&quot;language-lisp &quot;&gt;&lt;code class=&quot;language-lisp&quot; data-lang=&quot;lisp&quot;&gt;(message &amp;quot;Hello world&amp;quot;)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;python&quot; class=&quot;language-python &quot;&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;print(&amp;quot;Hello world&amp;quot;)
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;pre data-lang=&quot;ts&quot; class=&quot;language-ts &quot;&gt;&lt;code class=&quot;language-ts&quot; data-lang=&quot;ts&quot;&gt;console.log(&amp;quot;Hello world&amp;quot;);
&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h1 id=&quot;whoami&quot;&gt;&lt;code&gt;whoami&lt;&#x2F;code&gt;&lt;a class=&quot;zola-anchor&quot; href=&quot;#whoami&quot; aria-label=&quot;Anchor link for: whoami&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;An unapologetic free software and DEIA advocate with heightened fear of being a hypocrite, which pushes me to stay true to my words and being devoted towards building and developing anything free and open source: software, hardware, communities. Because, at last, it&#x27;s all about the ecosystem, isn&#x27;t it?&lt;&#x2F;p&gt;
&lt;p&gt;Apart from that, I am a person with a lot of unrelated (or varied?) interests, because that&#x27;s what life is about, enjoying the finer things. Some of them (because I can&#x27;t include all) are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Programming, especially Rust, C, Go, Elisp and other low-level and functional programming languages&lt;&#x2F;li&gt;
&lt;li&gt;Emacs (Vim users, fight me)&lt;&#x2F;li&gt;
&lt;li&gt;OpenBSD and GNU&#x2F;Linux (any FOSS operating system)&lt;&#x2F;li&gt;
&lt;li&gt;Security and privacy&lt;&#x2F;li&gt;
&lt;li&gt;Books on history, futuristic themes, fiction, any genre&lt;&#x2F;li&gt;
&lt;li&gt;Free software community and ecosystem&lt;&#x2F;li&gt;
&lt;li&gt;Accessibility and user experience&lt;&#x2F;li&gt;
&lt;li&gt;Music, especially playing keyboard&lt;&#x2F;li&gt;
&lt;li&gt;Ancient Indian history and literature&lt;&#x2F;li&gt;
&lt;li&gt;Languages (it&#x27;s fun to learn, mental exercise)&lt;&#x2F;li&gt;
&lt;li&gt;Medical systems&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>What&#x27;s in a name?</title>
        <published>2023-01-18T00:00:00+00:00</published>
        <updated>2023-01-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Keerthana Rajesh Kumar
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://libremusings.dev/blog/whats-in-a-name/"/>
        <id>https://libremusings.dev/blog/whats-in-a-name/</id>
        
        <content type="html" xml:base="https://libremusings.dev/blog/whats-in-a-name/">&lt;h1 id=&quot;gritty-puffy-grittypuffy&quot;&gt;gritty + puffy = grittypuffy&lt;a class=&quot;zola-anchor&quot; href=&quot;#gritty-puffy-grittypuffy&quot; aria-label=&quot;Anchor link for: gritty-puffy-grittypuffy&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&#x27;gritty&#x27;&lt;&#x2F;strong&gt; as we all know equates to grit, refering to relentless efforts needed for making FOSS accessible to everyone while ensuring you don&#x27;t burn out as it&#x27;s a thankless job.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&#x27;puffy&#x27;&lt;&#x2F;strong&gt; refers to the mascot of OpenBSD (love it!) and since I am an OpenBSD user and was absolutely intrigued and mesmerized by the simplicity, stability and security (two remote holes, in heck of a long time never fails to amaze me) when I first started using it. As a cybersecurity undergraduate, this is something I need to live a sane life and not get sucked by bloat and complex design patterns.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It&#x27;s a reminder to myself to never lose the vision or grit I set for myself way before entering the college and a year after learning about free software: Making FOSS and security accessible (with some selfish desires to make a startup out of it and cherish my loved ones)&lt;&#x2F;p&gt;
&lt;p&gt;Hoping that becomes a reality.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;why-kirby-as-profile-picture-if-you-re-a-free-software-advocate&quot;&gt;Why Kirby as profile picture if you&#x27;re a free software advocate?&lt;a class=&quot;zola-anchor&quot; href=&quot;#why-kirby-as-profile-picture-if-you-re-a-free-software-advocate&quot; aria-label=&quot;Anchor link for: why-kirby-as-profile-picture-if-you-re-a-free-software-advocate&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;I know, Kirby is Nintendo&#x27;s trademark, but I can&#x27;t help but adore the cute puffball (you&#x27;re not human if your heart doesn&#x27;t melt when Kirby says &quot;Poyo&quot;, fight me!)&lt;&#x2F;p&gt;
&lt;p&gt;Update [2025-04-30]: I, no longer have Kirby as a profile picture. So this doesn&#x27;t apply.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;what-does-your-profile-picture-mean&quot;&gt;What does your profile picture mean?&lt;a class=&quot;zola-anchor&quot; href=&quot;#what-does-your-profile-picture-mean&quot; aria-label=&quot;Anchor link for: what-does-your-profile-picture-mean&quot; style=&quot;visibility: hidden;&quot;&gt;&lt;&#x2F;a&gt;
&lt;&#x2F;h1&gt;
&lt;p&gt;The girl from my profile picture is from a Manhwa named &quot;I Have Something to Tell You&quot;. Her name is Ga-ram (pronounced Garam), a child born out of resilience of a mother who went through a tragic accident that caused her to die after her birth. The profile picture captures her last words (better to tell it as thoughts, since she&#x27;s mute from birth) -- &quot;I love you&quot; (well, I am not going to spoil the Manhwa, give it a read, it&#x27;s awesome!) to her estranged twin she&#x27;s reconciled with before she&#x27;s stabbed out of a misunderstanding.&lt;&#x2F;p&gt;
&lt;p&gt;The way she interacted with her long lost twin, her resilience and optimism are contagious.&lt;&#x2F;p&gt;
&lt;p&gt;The beauty of the Manhwa is, I read this exactly a year before (April 28, 2024) Mounam was conceptualized in the summer of 2025, the open-access Indian Sign Language directory that I am working on under &lt;a rel=&quot;nofollow noreferrer&quot; href=&quot;https:&#x2F;&#x2F;fossia.org&quot;&gt;FOSSIA&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
