<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Luiz Carlos Martins Filho</title>
    <description>The latest articles on DEV Community by Luiz Carlos Martins Filho (@lcmartinsfilho).</description>
    <link>https://dev.to/lcmartinsfilho</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1902766%2Ff2012581-70dd-493d-80ef-9946fc170c2b.webp</url>
      <title>DEV Community: Luiz Carlos Martins Filho</title>
      <link>https://dev.to/lcmartinsfilho</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lcmartinsfilho"/>
    <language>en</language>
    <item>
      <title>Text correction with Harper</title>
      <dc:creator>Luiz Carlos Martins Filho</dc:creator>
      <pubDate>Sun, 13 Sep 2026 01:25:46 +0000</pubDate>
      <link>https://dev.to/lcmartinsfilho/text-correction-with-harper-5hh4</link>
      <guid>https://dev.to/lcmartinsfilho/text-correction-with-harper-5hh4</guid>
      <description>&lt;p&gt;Luiz recently received a recommendation about &lt;a href="https://writewithharper.com/" rel="noopener noreferrer"&gt;Harper&lt;/a&gt;, a new grammar checking tool developed by &lt;a href="https://automattic.com/" rel="noopener noreferrer"&gt;Automattic&lt;/a&gt; using Rust.&lt;/p&gt;

&lt;p&gt;The project's repository describes Harper as meeting the developer'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&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'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;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqinm2t5gpcdhdcgzq4j7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqinm2t5gpcdhdcgzq4j7.png" alt="Harper Interface" width="799" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&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" rel="noopener noreferrer"&gt;writewithharper.com/docs/about&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhjwvi169b7vpsh2setay.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhjwvi169b7vpsh2setay.png" alt="Available Platforms" width="800" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://writewithharper.com/" rel="noopener noreferrer"&gt;Official Site - Harper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Automattic/harper" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://writewithharper.com/docs/about" rel="noopener noreferrer"&gt;Official Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tooling</category>
    </item>
    <item>
      <title>Syncing your Obsidian</title>
      <dc:creator>Luiz Carlos Martins Filho</dc:creator>
      <pubDate>Sun, 13 Sep 2026 01:25:15 +0000</pubDate>
      <link>https://dev.to/lcmartinsfilho/syncing-your-obsidian-2o2</link>
      <guid>https://dev.to/lcmartinsfilho/syncing-your-obsidian-2o2</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'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'll use the Obsidian LiveSync plugin:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/vrtmrz/obsidian-livesync" rel="noopener noreferrer"&gt;vrtmrz/obsidian-livesync&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a VPS on MagaluCloud
&lt;/h2&gt;

&lt;p&gt;For the server, I'll create a VPS on &lt;a href="https://magalu.cloud/?ref=luizmartins.dev" rel="noopener noreferrer"&gt;MagaluCloud&lt;/a&gt;. I'll do the whole process manually, through the console, but it'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" rel="noopener noreferrer"&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" rel="noopener noreferrer"&gt;Virtual Machines&lt;/a&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz8ld338gzdenfko9e7yt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz8ld338gzdenfko9e7yt.png" alt="Opening Virtual Machines in the console" width="799" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On the &lt;a href="https://console.magalu.cloud/virtual-machine?ref=luizmartins.dev" rel="noopener noreferrer"&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;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fctdtmp6anoawngdcnzu3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fctdtmp6anoawngdcnzu3.png" alt="Clicking Create Instance" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select the desired Availability Zone (in this example, I chose br-se1-a) and also the Operating System. Here I'll go with Debian 13 LTS:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmttkl4v1qct8171u2n2f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmttkl4v1qct8171u2n2f.png" alt="Selecting zone and operating system" width="800" height="383"&gt;&lt;/a&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;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fegj92whavfz4qr88iudt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fegj92whavfz4qr88iudt.png" alt="Sizing and configuring the machine" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Don'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'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;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fngvxjoafebkrq7jaf9df.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fngvxjoafebkrq7jaf9df.png" alt="Configuring IP and naming the machine" width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring the server
&lt;/h2&gt;

&lt;p&gt;Access the newly created server with ssh:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh debian@your-ip-here.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For this project, we'll need Docker installed. The installation steps were taken from the project's documentation. Run each command below individually to add Docker's repository to your server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Add Docker's official GPG key:&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;ca-certificates curl
&lt;span class="nb"&gt;sudo install&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; 0755 &lt;span class="nt"&gt;-d&lt;/span&gt; /etc/apt/keyrings
&lt;span class="nb"&gt;sudo &lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.docker.com/linux/debian/gpg &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/apt/keyrings/docker.asc
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;a+r /etc/apt/keyrings/docker.asc

&lt;span class="c"&gt;# Add the repository to Apt sources:&lt;/span&gt;
&lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/apt/sources.list.d/docker.sources &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; /etc/os-release &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$VERSION_CODENAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After adding Docker's official repository with the commands above, install the necessary tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&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;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/obsidian-livesync/&lt;span class="o"&gt;{&lt;/span&gt;couchdb-data,config&lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/obsidian-livesync
&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;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[couchdb]&lt;/span&gt;
&lt;span class="py"&gt;single_node&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;max_document_size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;50000000 ; 50MB (Adjust based on your note size needs)&lt;/span&gt;

&lt;span class="nn"&gt;[chttpd]&lt;/span&gt;
&lt;span class="py"&gt;require_valid_user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;max_http_request_size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;4294967296 ; 4GB (Necessary for large sync batches)&lt;/span&gt;
&lt;span class="py"&gt;enable_cors&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[chttpd_auth]&lt;/span&gt;
&lt;span class="py"&gt;require_valid_user&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;authentication_redirect&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;/_utils/session.html&lt;/span&gt;

&lt;span class="nn"&gt;[httpd]&lt;/span&gt;
&lt;span class="py"&gt;WWW-Authenticate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Basic realm="administrator"&lt;/span&gt;
&lt;span class="py"&gt;enable_cors&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[cors]&lt;/span&gt;
&lt;span class="py"&gt;origins&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;app://obsidian.md,capacitor://localhost,http://localhost&lt;/span&gt;
&lt;span class="py"&gt;credentials&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;headers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;accept, authorization, content-type, origin, referer&lt;/span&gt;
&lt;span class="py"&gt;methods&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;GET, PUT, POST, HEAD, DELETE&lt;/span&gt;
&lt;span class="py"&gt;max_age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;3600&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To install CouchDB, we'll use a docker compose:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.8'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;couchdb&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;couchdb:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;livesync-couchdb&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;COUCHDB_USER=admin&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;COUCHDB_PASSWORD=YOUR_STRONG_PASSWORD_HERE&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./couchdb-data:/opt/couchdb/data&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./config/local.ini:/opt/couchdb/etc/local.d/local.ini&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;127.0.0.1:5984:5984"&lt;/span&gt; &lt;span class="c1"&gt;# Expose only to localhost, Caddy handles external traffic&lt;/span&gt;

  &lt;span class="na"&gt;caddy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;caddy:latest&lt;/span&gt;
    &lt;span class="na"&gt;container_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;livesync-caddy&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80:80"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;443:443"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./Caddyfile:/etc/caddy/Caddyfile&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;caddy_data:/data&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;caddy_config:/config&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;couchdb&lt;/span&gt;

&lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;caddy_data&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;caddy_config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don'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'll use Caddy. Create the file &lt;code&gt;~/obsidian-livesync/Caddyfile&lt;/code&gt; and add the following configuration, adjusting the domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;obsidian.yourdomain.com&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;reverse_proxy&lt;/span&gt; &lt;span class="nf"&gt;couchdb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5984&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bring the stack up with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now let's create a database called obsidian. You're free to use any name here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PUT &lt;span class="nt"&gt;-u&lt;/span&gt; admin http://127.0.0.1:5984/obsidian
&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&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" rel="noopener noreferrer"&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 "Test Connection". If successful, apply the settings.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>tooling</category>
      <category>tutorials</category>
    </item>
    <item>
      <title>JavaScript is (too) liberal</title>
      <dc:creator>Luiz Carlos Martins Filho</dc:creator>
      <pubDate>Sun, 13 Sep 2026 01:22:53 +0000</pubDate>
      <link>https://dev.to/lcmartinsfilho/javascript-is-too-liberal-2e6l</link>
      <guid>https://dev.to/lcmartinsfilho/javascript-is-too-liberal-2e6l</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fteopqsxlbv43isqki7ds.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fteopqsxlbv43isqki7ds.jpg" alt="Featured Image" width="800" height="372"&gt;&lt;/a&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>
      <category>eloquentjavascript</category>
      <category>myreadings</category>
      <category>readings</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
