GuiderFöretag och övervakningSpråkkoll med LanguageTool

Kör LanguageTool, ett alternativ till Grammarly, med Podman utan root

LanguageTool på Debian 13, språkgranskaren med öppen källkod, i rootless Podman bakom Caddy, för svenska och engelska, så att teamets texter granskas på er egen server från webbläsartillägget, LibreOffice eller API:t.

Testad på LanguageTool 6.8 på Debian 13 (trixie) på en server hos Melonslab Uppdaterad 14 oktober 2026

Rekommenderad server för guiden

SSD RAID 1 · ECC DDR4 · 10 Gbit

VC-P Alloy · 2 vCPU · 8 GB Minne · 60 GB Lagring

Månadsvis, ingen bindningstid 7 dagars öppet köp

100 kr/mån

Beställ nu
På den här sidan

Det här sätter du upp

LanguageTool kontrollerar stavning, grammatik och interpunktion på fler än 20 språk, bland dem svenska och engelska. Den stryker under fel medan du skriver i webbläsaren, i LibreOffice och i andra program, och förklarar varje fel. Här körs den som en egen server, så att det ert team skriver granskas på den servern och aldrig skickas till en extern tjänst.

LanguageTool görs av LanguageTooler GmbH i Hamburg i Tyskland. Kärnan, som är det som körs här, är öppen källkod under LGPL 2.1 eller senare, som dess källkodsarkiv anger (kontrollerat 14 oktober 2026). Version 6.8 kom ut den 5 maj 2026.

LanguageTool som alternativ till Grammarly. Grammarly granskar text enbart i sitt eget moln. Dess lista över språk (kontrollerad 14 oktober 2026) ger svenska stavning och grundläggande grammatik, medan de mer avancerade förslagen om tydlighet, flyt och ton gäller engelska, spanska, franska, tyska, portugisiska och italienska. Dess integritetspolicy, som gäller från 6 juli 2026 och nu ges ut av Superhuman Platform Inc. (tidigare Grammarly), säger att dina uppgifter kan behandlas utanför landet där du bor, och att överföringar från EU till USA sker enligt EU-U.S. Data Privacy Framework. Med LanguageTool på er egen server stannar texten på den.

Det här saknar servern med öppen källkod. LanguageTool Premium, den betalda tjänsten, lägger till mer än det som körs här. Dess Premium-sida (kontrollerad 14 oktober 2026) listar fler än 20 000 extra kontroller för engelska, tyska, franska, spanska, nederländska, polska och portugisiska, obegränsad omformulering av meningar med AI (tre om dagen utan Premium), en personlig stilguide och texter på upp till 150 000 tecken. LanguageTools dokumentation för servern säger att "the AI-based rules are only available in the cloud", och att servern inte stöder synonymer. Daniel Naber på LanguageTool skrev på deras forum att den publika koden är "the Open Source version without premium features", och att det finns en Premium-version att köra själv för större företagskunder. Svenska är inte ett av språken som får de extra kontrollerna, så för svenska är reglerna med öppen källkod nästan allt LanguageTool har.

LanguageTools webbläsartillägg kräver numera Premium för att granska text på LanguageTools egna servrar. Deras meddelande säger att tillägget "will continue to work as it currently does for users who use it with their own server", vilket är det den här guiden sätter upp.

LanguageTool ger inte ut någon egen containeravbild; deras källkodsarkiv listar tre som användare har gjort. Den här guiden använder meyay/languagetool: den byggs från LanguageTools egna versionstaggar, den uppdaterade sitt bassystem och sina Java-bibliotek med säkerhetsrättningar tre dagar före vårt test, den körs som en vanlig användare med ett skrivskyddat filsystem, och den har med fastText för språkigenkänning och en rättning av en minnesläcka i stavningskontrollen som svenskan använder. Den mest nedladdade, erikvl87/languagetool, uppdaterades senast i juni 2026. LanguageTool slutade själva ge ut ZIP-filer med färdiga versioner efter 6.6, så varje avbild bygger sin egen.

Här körs LanguageTool i Podman under en egen användare som heter languagetool, bakom Caddy från Podman-guiden, som släpper in ert kontor och ber alla andra om ett lösenord.

Varje steg nedan har körts på en nyinstallerad Melonslab VC-P Alloy (2 vCPU, 8 GB) med Debian 13:

  • LanguageTool 6.8 svarade 23 sekunder efter första starten, som laddade ner avbilden på 537 MB och fastText-modellen på 126 MB. Senare omstarter tog 6 sekunder.
  • 13 svenska och 13 engelska meningar med kända fel, och fyra korrekta, kontrollerades. Den hittade felen i 6 av de svenska meningarna och flaggade 11 av de engelska, en med fel förslag, och ingen av de korrekta meningarna (steg 8 har listan).
  • LanguageTools eget webbläsartillägg i Chromium strök under fel på svenska och engelska via den här servern. Det fungerade från kontorets adress och misslyckades bakom lösenordet, som tillägget inte kan skicka.
  • LibreOffice 25.2 granskade svenska och engelska dokument via servern, med lösenordet i adressen.
  • API:t svarade curl med lösenordet, och med "401" utan det.
  • Engelska n-gramdata fick LanguageTool att hitta tre fler förväxlade ord, till priset av 15 GB disk och långsammare engelska kontroller (steg 7).
  • En ordlista fick den att godkänna företagsnamn på båda språken.
  • En avlyssning av serverns trafik visade inga externa anslutningar medan LanguageTool startade och granskade text, och dess logg innehåller inte texten den granskar.
  • En uppdatering av avbilden gick igenom med podman auto-update, uppsättningen återställdes från en säkerhetskopia, och allt startade igen av sig självt efter en omstart av servern.

LanguageTool använde omkring 550 MB minne strax efter starten och omkring 1,2 GB när båda språken hade använts, med Java begränsat till 1 GB.

Innan du börjar

Du behöver:

  • en server uppsatt som i Podman-guiden, med Caddy igång;
  • en A-post och en AAAA-post för lt.example.com som pekar på din server;
  • kontorets publika IPv4-adress, och dess IPv6-nät om det har ett. Sök på "vad är min IP" från en dator där.

Exemplen använder lt.example.com för LanguageTool, 198.51.100.7 och 2001:db8:7::/48 för kontoret, och 10.8.0.0/24 och 2001:db8:1f::/64 för enheter i ett WireGuard-VPN, som i WireGuard-guiden. Byt ut dem genomgående.

LanguageTool skickar ingen e-post, så det finns inget steg för e-post.

1. Skapa användaren

Som root:

useradd -m -s /bin/bash languagetool
loginctl enable-linger languagetool
machinectl shell languagetool@

Allt fram till steg 3 körs som languagetool.

2. Definiera containern

Skapa en ordlista, som steg 9 förklarar. Lägg till ert företagsnamn så länge:

echo "Examplecorp" > ~/words.txt
mkdir -p ~/.config/containers/systemd

Skapa ~/.config/containers/systemd/languagetool.container:

[Unit]
Description=LanguageTool

[Container]
ContainerName=languagetool
Image=docker.io/meyay/languagetool:6.8
# LanguageTool runs as the image's own unprivileged user, on a read-only file system.
User=783:783
ReadOnly=true
Tmpfs=/tmp:exec
Volume=languagetool-fasttext:/fasttext:U
Volume=%h/words.txt:/languagetool/org/languagetool/resource/en/hunspell/spelling_custom.txt:ro
Volume=%h/words.txt:/languagetool/org/languagetool/resource/sv/hunspell/spelling_custom.txt:ro
Environment=JAVA_XMS=256m JAVA_XMX=1g
# Only Caddy, on this server, can reach LanguageTool: the port is not open to the internet.
PublishPort=127.0.0.1:8140:8081
AutoUpdate=registry

[Service]
Restart=always

[Install]
WantedBy=default.target

Vad inställningarna gör:

  • Taggen 6.8 följer varje nybygge av LanguageTool 6.8, med säkerhetsrättningar, men byter aldrig till en ny version av LanguageTool av sig själv. Avbilden behåller bara sina senaste numrerade taggar, som 6.8-13, så en numrerad tagg kan försvinna; 6.8 ligger kvar.
  • User=783:783 startar containern som avbildens egen användare i stället för root, och ReadOnly=true hindrar att dess filer ändras. :U gör den användaren till ägare av volymen.
  • Volymen languagetool-fasttext rymmer fastText-modellen, som känner igen vilket språk en text är skriven på. Avbilden laddar ner den, 126 MB, vid första starten.
  • JAVA_XMX=1g låter Java använda upp till 1 GB för sina data. Steg 10 har detaljerna.

Starta den:

systemctl --user daemon-reload
systemctl --user start languagetool
systemctl --user enable --now podman-auto-update.timer

Första starten laddar ner avbilden och fastText-modellen. Den är klar när det här skriver ut 200, efter omkring 25 sekunder:

curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8140/v2/languages

3. Sätt Caddy framför

LanguageTools server har ingen inloggning: den som når den kan använda den, och loggen varnar för att den körs "in public mode". Därför bestämmer Caddy vem som kommer in:

  • Kontoret och enheter i ert VPN kommer in direkt. LanguageTools webbläsartillägg kan inte skicka något lösenord (steg 5), så det är så det kommer in.
  • Alla andra måste logga in med ett användarnamn och ett lösenord, som LibreOffice och API:t kan skicka.

Gå tillbaka till root med exit och byt till machinectl shell caddy@. Skapa ett lösenord för inloggningen. Det kommer att stå i serverns adress i LibreOffice (steg 6), så använd ett med bara bokstäver och siffror:

openssl rand -hex 16

Spara det i din lösenordshanterare. Gör en hash av det och skriv lösenordet två gånger:

podman exec -it caddy caddy hash-password

Den skriver ut en rad som börjar med $2a$14$. Lägg till det här blocket sist i ~/Caddyfile, med den raden i stället för HASH:

lt.example.com {
    # Your office and VPN get in directly; everyone else must log in.
    @outside not remote_ip 198.51.100.7 2001:db8:7::/48 10.8.0.0/24 2001:db8:1f::/64
    basic_auth @outside {
        team HASH
    }
    reverse_proxy 127.0.0.1:8140
}

team är användarnamnet. Lägg till kontorets IPv6-nät om det har ett: datorerna där använder hellre IPv6 och skulle annars få inloggningsrutan. Starta om Caddy:

systemctl --user restart caddy

4. Granska text från kommandoraden

Från valfri dator, med ditt lösenord i stället för PASSWORD:

curl -s -u team:PASSWORD https://lt.example.com/v2/check \
  -d language=sv-SE --data-urlencode 'text=Det var ett stor misstag.' \
  | python3 -c 'import json, sys; [print(m["message"]) for m in json.load(sys.stdin)["matches"]]'
Adjektivet är böjt i positiv utrum (stor) och bör då föregås av ordet "en" istället för "ett", alternativt böjas i positiv neutrum. Menade du: "en stor misstag"?

Utan -u, utanför kontoret, blir svaret 401. LanguageTool svarar i JSON, och sista raden skriver bara ut meddelandena: varje post under matches har också var i texten felet sitter (offset och length), och förslag under replacements. Använd language=en-US eller en-GB för engelska, eller language=auto för att låta LanguageTool avgöra. Med auto kände fastText igen korta svenska och engelska meningar rätt i våra tester, med 96 till 99 % säkerhet.

API:t är detsamma som LanguageTools publika, så skript och program där du kan byta LanguageTools adress fungerar med din. Det tog emot en text på 36 000 tecken i ett anrop.

5. Använd webbläsartillägget

Installera LanguageTools tillägg för Chrome eller Firefox. Sedan, från kontoret eller via VPN:

  1. Öppna tilläggets inställningar och välj Advanced settings (only for professional users) längst ner.
  2. Under LanguageTool server: väljer du Other server—requires LanguageTool server running there och anger https://lt.example.com/v2.
  3. Välj Save.

Du kan bara välja en egen server när du är utloggad från ett LanguageTool-konto. Tillägget har inget svenskt gränssnitt, men det granskar svensk text, och LanguageTools förklaringar av svenska fel är på svenska.

Det här såg vi i Chromium med tillägget 11.4.0:

  • Från kontorets adress strök det under fel på engelska och på svenska, och serverns logg visade varje kontroll från webextension-chrome-ng.
  • Från en adress utanför listan visade tillägget "Sorry, something went wrong while checking your text" med 401. Det skickar sina anrop utan inloggning, så lösenordet hjälper inte, och ett användarnamn och lösenord i adressen, https://team:PASSWORD@lt.example.com/v2, gav "Cannot connect".

Den som jobbar hemifrån använder alltså VPN. Texten du granskar går bara till din server, men tillägget pratar ändå själv med LanguageTool: när det installerades, innan vi hade skrivit något, öppnade det LanguageTools välkomstsida, hämtade sina inställningar, skickade ett anrop till LanguageTools egen granskningstjänst och en användningssignal till LanguageTools statistiktjänst. Dess omformulering, synonymer och översättning är LanguageTools molntjänster, som vi inte använde.

6. Använd LibreOffice

LibreOffice har en inbyggd granskning med LanguageTool, så du behöver inget tillägg. I LibreOffice 25.2:

  1. Öppna Tools > Options > Languages and Locales > LanguageTool Server. På macOS ligger Tools under LibreOffice > Preferences.
  2. Kryssa i Enable LanguageTool.
  3. Sätt Base URL till https://team:PASSWORD@lt.example.com/v2, med ditt lösenord. Lämna Username och API key tomma: de är till för LanguageTool Premium.
  4. Välj OK. Kontrollera under Writing Aids i samma dialogruta att LanguageTool Remote Grammar Checker är ikryssad.

Menyerna ovan är LibreOffice på engelska; i ett svenskt LibreOffice ligger samma sidor under Verktyg > Alternativ. LibreOffice skickar användarnamnet och lösenordet i adressen som en vanlig inloggning, så det fungerar var du än är. I vårt test fick ett svenskt dokument "Det var ett stor misstag" och ett felstavat ord understrukna, och ett engelskt "He go to the office". Med fel lösenord visar LibreOffice inget fel: den hittar bara inga fel i texten. LibreOffice sparar adressen, med lösenordet, i din användarprofil.

7. Bättre engelska med n-gramdata

LanguageTool kan använda n-gramdata, uppgifter om hur ofta ord förekommer tillsammans i en mycket stor mängd engelsk text, för att hitta ord som är rätt stavade men förväxlade, som "accept" och "except". Sådana data finns för engelska, tyska, franska, spanska och nederländska, men inte för svenska.

De är stora och gör engelska kontroller långsammare:

Utan n-gramMed engelska n-gram
Nedladdning–8,4 GB, omkring 7 minuter på vår server
Disk–15 GB
Engelsk text på 228 ord0,2–0,3 sekunder1,3–2,0 sekunder
Svensk text på 184 ord0,3–0,6 sekunder0,3–0,6 sekunder
Kontroller per minut, 10 användare samtidigt267132

Av 15 engelska meningar med förväxlade ord hittade LanguageTools vanliga regler 10. N-grammen lade till tre: "accept" i stället för "except", "see" i stället för "sea" och "borrow" i stället för "lend". Två missades i båda fallen. Använd dem om ni mest skriver engelska och har diskutrymmet. LanguageTool rekommenderar en snabb SSD för dem.

Som languagetool lägger du till de här två raderna i languagetool.container, under de andra raderna med Volume och Environment:

Volume=languagetool-ngrams:/ngrams:U
Environment=download_ngrams_for_langs=en
systemctl --user daemon-reload
systemctl --user restart languagetool

Avbilden laddar ner och packar upp datan innan LanguageTool startar, så servern är borta under de 5 till 10 minuter det tar. journalctl --user -u languagetool -f visar hur det går. Datan laddas inte ner igen efter det.

8. Så bra granskar den svenska och engelska

Vi granskade meningar med kända fel på båda språken, med engelska n-gram påslagna. På svenska hittade LanguageTool:

MeningFelHittat
Vi har skickat en offfert till kunnden.två stavfelja, båda
Mötet börjar klockan klockan nio.upprepat ordja
Det var ett stor misstag.ett storja, men föreslog "en stor misstag"
Vi ses på Måndag.versal på veckodagja
Hej , hur mår du?mellanslag före kommatecknetja
jag skickar fakturan i morgon.gemen i början av meningenja
Ring kund tjänst om du har frågor.särskrivningnej
Dem kom sent till mötet.dem i stället för denej
Jag kom sent eftersom att bussen var försenad.eftersom attnej
Jag har inte hunnit läst rapporten.läst i stället för läsanej
Jag har en hus på landet.en husnej
Bilarna är röd.röd i stället för rödanej
Vi har mycket saker att göra.mycket i stället för månganej

På engelska hittade den "He go", "could of", "a importent", "The the", "Its a nice day", "I have went", "I didn't now that", "your advise", "will effect our prices" och "accept Tom", den sista bara med n-gram. Den flaggade "send me you're invoice", men föreslog "invoiced" i stället för "your". Den missade "Their going to the meeting" och "the prize of the new plan". Fyra korrekta meningar, två på varje språk, fick inga varningar.

För svenska är LanguageTool alltså en bra stavningskontroll som också hittar en del grammatik- och skrivfel, men den missar många av de grammatikfel svenskar gör. På engelska hittar den betydligt mer.

9. Egna ord

LanguageTool markerar namn den inte känner till, som ert företags eller era produkters, som stavfel. words.txt från steg 2 läses för både engelska och svenska: ett ord per rad. I vårt test godkändes "Melonslab" och "Hypefox" på båda språken när de stod i listan, medan "Melonslabb" fortfarande markerades. Efter en ändring, som languagetool:

systemctl --user restart languagetool

Webbläsartillägget har också en egen personlig ordlista, under Personal dictionary i dess inställningar, som stannar i den webbläsaren.

10. Minne och hastighet

LanguageTool är ett Java-program. JAVA_XMS är minnet Java tar vid starten och JAVA_XMX det mesta den får använda för sina data; Java växer mot den gränsen när LanguageTool läser in reglerna för varje språk, och behåller minnet. fastText lägger till omkring 140 MB.

Gräns för JavaEfter startenEfter kontroller på båda språken
JAVA_XMX=1g, som i steg 2550 MB1,2 GB, 1,4 GB med n-gram
JAVA_XMX=1536m, avbildens standard500 MB1,4 GB, 1,8 GB med n-gram

Siffrorna inkluderar fastText. 1 GB räckte för alla våra tester, även med tio användare samtidigt. Höj gränsen om LanguageTools logg visar OutOfMemoryError, till exempel med fler språk eller många användare. Med n-gram håller Linux också delar av datan i sin filcache, som den lämnar tillbaka när andra program behöver minnet.

Den första kontrollen efter en start tar längre tid medan LanguageTool läser in ett språk: 5 till 10 sekunder för den första engelska texten i våra tester och omkring en sekund för svenska. Efter det tog en kort mening 0,05 till 0,3 sekunder. Tillägget granskar när du gör en paus i skrivandet, så ett team på tio granskar sällan samtidigt. När tio användare skickade texter utan paus var de två vCPU:erna gränsen (steg 7 har siffrorna).

11. Externa anslutningar

Vi avlyssnade serverns DNS-uppslagningar och utgående anslutningar medan LanguageTool startade, granskade text på båda språken och stod oanvänd: det fanns inga. Loggen sparar längden och språket för varje kontroll, men inte texten.

Vid första starten laddar avbilden ner fastText-modellen från dl.fbaipublicfiles.com, som drivs av Meta, och med steg 7 n-gramdatan från languagetool.org. Själva avbilden kommer från Docker Hub. Webbläsartilläggets egna anslutningar till LanguageTool står i steg 5.

12. Säkerhetskopiera

LanguageTool sparar inget av det ert team skriver: den granskar texten och glömmer den. fastText-modellen och n-grammen laddas ner igen om de saknas. Det du har satt upp själv är containerfilen och ordlistan. Som languagetool:

mkdir -p ~/backup
tar -czf ~/backup/languagetool.tar.gz -C ~ .config/containers/systemd/languagetool.container words.txt

Kopiera ~/backup till en annan maskin, till exempel med restic, tillsammans med Caddys ~/Caddyfile, som har lösenordshashen. Tilläggets personliga ordlistor stannar i varje webbläsare.

För att återställa på en ny server skapar du användaren som i steg 1, kopierar säkerhetskopian till ~/backup och kör som languagetool:

tar -xzf ~/backup/languagetool.tar.gz -C ~
systemctl --user daemon-reload
systemctl --user start languagetool
systemctl --user enable --now podman-auto-update.timer

Lägg sedan till Caddy-blocket som i steg 3.

13. Uppdatera

podman auto-update letar en gång om dagen efter ett nytt bygge av avbilden 6.8 och startar om LanguageTool när det finns ett. För att uppdatera direkt:

podman auto-update

En ny version av LanguageTool, som 6.9, får en egen tagg. När den har kommit byter du 6.8 i languagetool.container mot den nya versionen, kör daemon-reload och startar om. LanguageTool listar sina ändringar i sin ändringslogg.

Felsökning

Containern stannar direkt, och loggen säger directory "/fasttext" is owned by 0:0. :U sist på en Volume-rad saknas. Lägg till det, kör sedan daemon-reload och systemctl --user reset-failed languagetool och starta den igen. Samma sak gäller /ngrams.

Tillägget säger "Sorry, something went wrong while checking your text" med 401. Du är inte på en adress i Caddy-blocket: hemifrån ansluter du till VPN. Om du är på kontoret kontrollerar du att dess IPv6-nät finns i listan.

LibreOffice hittar inga fel. Kontrollera lösenordet i Base URL och att adressen slutar med /v2. curl som i steg 4, med samma lösenord, visar om servern svarar.

Den första kontrollen efter en omstart är långsam. LanguageTool läser in varje språk vid den första kontrollen. Det tar några sekunder, en gång.

Kör det på din egen server

SSD RAID 1 · ECC DDR4 · 10 Gbit

VC-P Alloy

100 kr/mån

vCPU
2
Minne
8 GB
Lagring
60 GB
Trafik
10 TB
Performance
SSD · RAID 1
  • Full root-åtkomst
  • Nativt /64 IPv6
  • RAID-skyddad lagring
  • Malmö, Sverige
  • Månadsvis, ingen bindningstid
  • 7 dagars öppet köp
Alla guider