<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>@lcmartinsfilho’s Luiz's Blog - Tags</title><link>https://luizmartins.dev/https://luizmartins.dev/en/tags/</link><description>All entries in Tags on Luiz's Blog</description><generator>Hugo -- gohugo.io</generator><language>en-US</language><lastBuildDate>Thu, 10 Sep 2026 23:23:00 +0000</lastBuildDate><atom:link href="https://luizmartins.dev/en/tags/" rel="self" type="application/rss+xml"/><item><title>Testing post creation on the iPad (second time)</title><link>https://luizmartins.dev/en/post/second-ipad-post/</link><pubDate>Thu, 10 Sep 2026 23:23:00 +0000</pubDate><author>Luiz Carlos Martins Filho</author><guid>https://luizmartins.dev/en/post/second-ipad-post/</guid><description>&lt;p&gt;This time I cloned my Github Pages repo inside iSH and edited the file directly in the terminal with neovim, committed it, and pushed it to the repo. It felt much more ergonomic and practical than using the Github interface, not to mention it works completely offline.&lt;/p&gt;</description></item><item><title>Testing post creation on the iPad</title><link>https://luizmartins.dev/en/post/posting-from-ipad/</link><pubDate>Thu, 10 Sep 2026 23:00:00 +0000</pubDate><author>Luiz Carlos Martins Filho</author><guid>https://luizmartins.dev/en/post/posting-from-ipad/</guid><description>&lt;p&gt;I&amp;rsquo;m at the gym, at a café near the entrance, testing the feasibility of creating posts on my blog using the iPad with a keyboard. If the Github app doesn&amp;rsquo;t work or isn&amp;rsquo;t ergonomic enough, I can still try iSH or something similar to make local modifications. Actually, I think cloning the blog&amp;rsquo;s repository there and using neovim might be the most interesting alternative.&lt;/p&gt;
&lt;p&gt;I wrote this post inside the Github app itself, creating the file directly there and committing straight to main.&lt;/p&gt;</description></item><item><title>Text correction with Harper</title><link>https://luizmartins.dev/en/post/correcao-de-texto-com-harper/</link><pubDate>Sun, 18 Jan 2026 00:00:00 +0000</pubDate><author>Luiz Carlos Martins Filho</author><guid>https://luizmartins.dev/en/post/correcao-de-texto-com-harper/</guid><description>&lt;p&gt;Luiz recently received a recommendation about &lt;a href="https://writewithharper.com/"&gt;Harper&lt;/a&gt;, a new grammar checking tool developed by &lt;a href="https://automattic.com/"&gt;Automattic&lt;/a&gt; using Rust.&lt;/p&gt;
&lt;p&gt;The project&amp;rsquo;s repository describes Harper as meeting the developer&amp;rsquo;s specific requirements: it is the grammar checker that meets your needs, analyzing documents in milliseconds with minimal memory usage.&lt;/p&gt;
&lt;h2 id="key-features"&gt;Key features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fast performance:&lt;/strong&gt; millisecond-level analysis&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Low memory usage:&lt;/strong&gt; less than 1/50 of LanguageTool&amp;rsquo;s usage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complete privacy:&lt;/strong&gt; runs locally, without sending data to servers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebAssembly compatibility:&lt;/strong&gt; can run on multiple platforms&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/en/post/correcao-de-texto-com-harper/image-1.png" alt="Harper Interface"&gt;&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;Installation is simple through the extension stores for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web browsers&lt;/li&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;li&gt;Obsidian&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For other platforms, comprehensive documentation is available at &lt;a href="https://writewithharper.com/docs/about"&gt;writewithharper.com/docs/about&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/en/post/correcao-de-texto-com-harper/screenshot.png" alt="Available Platforms"&gt;&lt;/p&gt;
&lt;h2 id="useful-links"&gt;Useful links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://writewithharper.com/"&gt;Official Site - Harper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Automattic/harper"&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://writewithharper.com/docs/about"&gt;Official Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Syncing your Obsidian</title><link>https://luizmartins.dev/en/post/instalando-obsidian-sync/</link><pubDate>Sat, 17 Jan 2026 14:15:00 +0000</pubDate><author>Luiz Carlos Martins Filho</author><guid>https://luizmartins.dev/en/post/instalando-obsidian-sync/</guid><description>&lt;p&gt;There are several ways to sync Obsidian, but I decided to document the method I chose, both so I don&amp;rsquo;t forget the details in the future and to help anyone else looking for their own sync solution.&lt;/p&gt;
&lt;p&gt;For this project, we&amp;rsquo;ll use the Obsidian LiveSync plugin:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/vrtmrz/obsidian-livesync"&gt;vrtmrz/obsidian-livesync&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="creating-a-vps-on-magalucloud"&gt;Creating a VPS on MagaluCloud&lt;/h2&gt;
&lt;p&gt;For the server, I&amp;rsquo;ll create a VPS on &lt;a href="https://magalu.cloud/?ref=luizmartins.dev"&gt;MagaluCloud&lt;/a&gt;. I&amp;rsquo;ll do the whole process manually, through the console, but it&amp;rsquo;s possible to do everything using the &lt;code&gt;mgc&lt;/code&gt; (MagaluCloud &lt;em&gt;cli&lt;/em&gt;).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://console.magalu.cloud/?ref=luizmartins.dev"&gt;console&lt;/a&gt;. To create a new virtual machine, click on &lt;a href="https://console.magalu.cloud/virtual-machine?ref=luizmartins.dev"&gt;Virtual Machines&lt;/a&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/en/post/instalando-obsidian-sync/1-abrindo-vm.png" alt="Opening Virtual Machines in the console"&gt;&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;On the &lt;a href="https://console.magalu.cloud/virtual-machine?ref=luizmartins.dev"&gt;Virtual Machines&lt;/a&gt; page, click &lt;strong&gt;Create Instance&lt;/strong&gt;:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/en/post/instalando-obsidian-sync/2-criar-instancia.png" alt="Clicking Create Instance"&gt;&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Select the desired Availability Zone (in this example, I chose br-se1-a) and also the Operating System. Here I&amp;rsquo;ll go with Debian 13 LTS:&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/en/post/instalando-obsidian-sync/3-zona-distro.png" alt="Selecting zone and operating system"&gt;&lt;/p&gt;
&lt;p&gt;For the server, we can go with the cheapest option! I chose the instance with 1 vCPU and 1 GB of RAM (BV1-1-20). The only detail is storage; for safety, I chose a 20 GB local disk.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/en/post/instalando-obsidian-sync/4-dimensionamento-maquina.png" alt="Sizing and configuring the machine"&gt;&lt;/p&gt;
&lt;p&gt;Don&amp;rsquo;t forget to leave the option checked to assign a public IPv4 address to the instance. To access the machine, select an existing SSH key (if you already have one). Otherwise, add a new public key. If you don&amp;rsquo;t have one yet, the documentation can help. Keep the generated keys safe, because losing them will prevent access to the machine! Finally, give the instance a descriptive name and click Create instance.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://luizmartins.dev/en/post/instalando-obsidian-sync/5-ip-nomeia-maquina.png" alt="Configuring IP and naming the machine"&gt;&lt;/p&gt;
&lt;h2 id="configuring-the-server"&gt;Configuring the server&lt;/h2&gt;
&lt;p&gt;Access the newly created server with ssh:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh debian@your-ip-here.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For this project, we&amp;rsquo;ll need Docker installed. The installation steps were taken from the project&amp;rsquo;s documentation. Run each command below individually to add Docker&amp;rsquo;s repository to your server:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add Docker&amp;#39;s official GPG key:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ca-certificates curl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo install -m &lt;span class="m"&gt;0755&lt;/span&gt; -d /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod a+r /etc/apt/keyrings/docker.asc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Add the repository to Apt sources:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tee /etc/apt/sources.list.d/docker.sources &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Types: deb
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;URIs: https://download.docker.com/linux/debian
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Suites: $(. /etc/os-release &amp;amp;&amp;amp; echo &amp;#34;$VERSION_CODENAME&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Components: stable
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Signed-By: /etc/apt/keyrings/docker.asc
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After adding Docker&amp;rsquo;s official repository with the commands above, install the necessary tools:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With Docker installed, create a directory to separate your data and configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p ~/obsidian-livesync/&lt;span class="o"&gt;{&lt;/span&gt;couchdb-data,config&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/obsidian-livesync
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create the file &lt;code&gt;~/obsidian-livesync/config/local.ini&lt;/code&gt; and add the following configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[couchdb]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;single_node&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;max_document_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;50000000 ; 50MB (Adjust based on your note size needs)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[chttpd]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;require_valid_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;max_http_request_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;4294967296 ; 4GB (Necessary for large sync batches)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;enable_cors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[chttpd_auth]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;require_valid_user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;authentication_redirect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/_utils/session.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[httpd]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;WWW-Authenticate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Basic realm=&amp;#34;administrator&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;enable_cors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[cors]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;origins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;app://obsidian.md,capacitor://localhost,http://localhost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;accept, authorization, content-type, origin, referer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;methods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;GET, PUT, POST, HEAD, DELETE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;max_age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;3600&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To install CouchDB, we&amp;rsquo;ll use a docker compose:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;3.8&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;couchdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;couchdb:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;livesync-couchdb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;COUCHDB_USER=admin&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;COUCHDB_PASSWORD=YOUR_STRONG_PASSWORD_HERE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./couchdb-data:/opt/couchdb/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./config/local.ini:/opt/couchdb/etc/local.d/local.ini&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;127.0.0.1:5984:5984&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Expose only to localhost, Caddy handles external traffic&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;caddy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;caddy:latest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;container_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;livesync-caddy&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;80:80&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;443:443&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;./Caddyfile:/etc/caddy/Caddyfile&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;caddy_data:/data&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;caddy_config:/config&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;depends_on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;couchdb&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;caddy_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;caddy_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Don&amp;rsquo;t forget to change your database password in the file above. Choose a strong password!&lt;/p&gt;
&lt;p&gt;To handle the reverse proxy and digital certificate, we&amp;rsquo;ll use Caddy. Create the file &lt;code&gt;~/obsidian-livesync/Caddyfile&lt;/code&gt; and add the following configuration, adjusting the domain:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;obsidian.yourdomain.com {
reverse_proxy couchdb:5984
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Bring the stack up with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s create a database called obsidian. You&amp;rsquo;re free to use any name here:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X PUT -u admin http://127.0.0.1:5984/obsidian
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Enter the username and password defined in the file &lt;code&gt;~/obsidian-livesync/config/local.ini&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="configuring-the-client"&gt;Configuring the client&lt;/h2&gt;
&lt;p&gt;Install the Self-hosted LiveSync Plugin after enabling Community Plugins.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setup Wizard:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open the Plugin Settings&lt;/li&gt;
&lt;li&gt;Select Remote Database Configuration&lt;/li&gt;
&lt;li&gt;Configure the following fields:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;URI:&lt;/strong&gt; &lt;a href="https://obsidian.yourdomain.com"&gt;https://obsidian.yourdomain.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Username:&lt;/strong&gt; admin&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Password:&lt;/strong&gt; YOUR_STRONG_PASSWORD_HERE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database Name:&lt;/strong&gt; obsidian&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;End-to-End Encryption:&lt;/strong&gt; Enabled (Recommended! A new password will be used for encryption!)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Test: Click &amp;ldquo;Test Connection&amp;rdquo;. If successful, apply the settings.&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>JavaScript is (too) liberal</title><link>https://luizmartins.dev/en/post/javascript-is-too-liberal/</link><pubDate>Sat, 26 Jul 2025 00:00:00 +0000</pubDate><author>Luiz Carlos Martins Filho</author><guid>https://luizmartins.dev/en/post/javascript-is-too-liberal/</guid><description>&lt;p&gt;&lt;img src="https://luizmartins.dev/en/post/javascript-is-too-liberal/featured.jpg" alt="Featured Image"&gt;&lt;/p&gt;
&lt;p&gt;JavaScript is a remarkably permissive language, which can be both a blessing and a curse for developers. This post explores the liberal aspects of the language and its implications for code quality and developer experience.&lt;/p&gt;</description></item><item><title>Repository of ideas</title><link>https://luizmartins.dev/en/post/repositorio-de-ideias/</link><pubDate>Sat, 12 Jul 2025 00:00:00 +0000</pubDate><author>Luiz Carlos Martins Filho</author><guid>https://luizmartins.dev/en/post/repositorio-de-ideias/</guid><description>&lt;p&gt;This blog works as a repository of everything I&amp;rsquo;m reading, thinking about, or that interests me. It&amp;rsquo;s a return to the tradition of personal blogs from the era before social media, when each person maintained their own space on the internet.&lt;/p&gt;
&lt;h2 id="the-purpose"&gt;The purpose&lt;/h2&gt;
&lt;p&gt;In a world dominated by algorithms and infinite feeds, there&amp;rsquo;s something special about maintaining a genuinely personal space. A place where ideas can be explored freely, without concern for engagement or reach. Just thoughts, readings, and reflections.&lt;/p&gt;
&lt;p&gt;Welcome to Luiz&amp;rsquo;s Blog!&lt;/p&gt;</description></item></channel></rss>