<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux on sbgrl.me</title><link>https://sbgrl.me/tags/linux/</link><description>Recent content in Linux on sbgrl.me</description><generator>Hugo -- gohugo.io</generator><language>en</language><managingEditor>sylvain.bougerel@gmail.com (Sylvain Bougerel)</managingEditor><webMaster>sylvain.bougerel@gmail.com (Sylvain Bougerel)</webMaster><copyright>© 2026 Sylvain Bougerel</copyright><lastBuildDate>Mon, 15 Dec 2025 09:00:00 +0800</lastBuildDate><atom:link href="https://sbgrl.me/tags/linux/index.xml" rel="self" type="application/rss+xml"/><item><title>Private Language Tools for browser spell checks</title><link>https://sbgrl.me/posts/private-language-tools-for-browser-spell-checks/</link><pubDate>Mon, 15 Dec 2025 09:00:00 +0800</pubDate><author>sylvain.bougerel@gmail.com (Sylvain Bougerel)</author><guid>https://sbgrl.me/posts/private-language-tools-for-browser-spell-checks/</guid><description>&lt;p&gt;With &lt;a href="https://languagetool.org" target="_blank" rel="noreferrer"&gt;LanguageTool&lt;/a&gt; (LT), it&amp;rsquo;s possible to run a local language tool server and have your browser extension connect to it. That way, your personal prose remains private (if you trust the browser extension, &lt;a href="https://www.reddit.com/r/privacy/comments/1n1v6yi/any_good_grammar_and_spellchecker_software/" target="_blank" rel="noreferrer"&gt;that is&lt;/a&gt;). &lt;a href="https://dev.languagetool.org/http-server" target="_blank" rel="noreferrer"&gt;It&amp;rsquo;s all documented here&lt;/a&gt; and it&amp;rsquo;s pretty simple to do. In this post, I cover how you can do this on Arch Linux (but it&amp;rsquo;s likely easy to port to other distro) with &lt;a href="https://systemd.io/" target="_blank" rel="noreferrer"&gt;systemd&lt;/a&gt; to keep that server running.&lt;/p&gt;
&lt;p&gt;Start by getting LT.&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-nil" data-lang="nil"&gt;yay -S languagetool&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You&amp;rsquo;ll also need &lt;a href="https://fasttext.cc/" target="_blank" rel="noreferrer"&gt;fastText&lt;/a&gt; and a language identification model. Fortunately, there&amp;rsquo;s already 2 good packages for it in &lt;a href="https://aur.archlinux.org/" target="_blank" rel="noreferrer"&gt;AUR&lt;/a&gt; (Check the &lt;code&gt;PKGBUILD&lt;/code&gt; — one can never be &lt;a href="https://dailysecurityreview.com/podcasts/arch-linux-website-forums-and-aur-targeted-in-sustained-cyber-assault/" target="_blank" rel="noreferrer"&gt;too&lt;/a&gt; &lt;a href="https://www.bleepingcomputer.com/news/security/arch-linux-pulls-aur-packages-that-installed-chaos-rat-malware/" target="_blank" rel="noreferrer"&gt;sure&lt;/a&gt; — but it looks correct at the time of writing).&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-nil" data-lang="nil"&gt;yay -S fasttext fasttext-langid-models&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;That&amp;rsquo;s it for the dependencies. Now for your local setup. Create the file &lt;code&gt;~/.config/systemd/user/my-languagetool.service&lt;/code&gt; with the content:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-nil" data-lang="nil"&gt;[Unit]
Description=LanguageTool Grammar Checker Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/languagetool --http --port 8081 --allow-origin &amp;#34;*&amp;#34; --config %h/.config/LanguageTool/server.properties
Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;As well as the file &lt;code&gt;~/.config/LanguageTool/server.properties&lt;/code&gt; with the content:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-nil" data-lang="nil"&gt;fasttextModel=/usr/share/fasttext/lid.176.bin
fasttextBinary=/usr/bin/fasttext&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;And now you&amp;rsquo;re ready to start your local server and keep it up and running for your browser extension:&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-nil" data-lang="nil"&gt;systemctl --user daemon-reload
systemctl --user enable my-languagetool.service
systemctl --user start my-languagetool.service&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You just need to configure the settings in your browser extension to ensure it connects to your local LT server.&lt;/p&gt;</description></item></channel></rss>