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
curlmed 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.comsom 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.8fö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, som6.8-13, så en numrerad tagg kan försvinna;6.8ligger kvar. User=783:783startar containern som avbildens egen användare i stället för root, ochReadOnly=truehindrar att dess filer ändras.:Ugör den användaren till ägare av volymen.- Volymen
languagetool-fasttextrymmer 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=1glå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:
- Öppna tilläggets inställningar och välj Advanced settings (only for professional users) längst ner.
- Under LanguageTool server: väljer du Other server—requires LanguageTool server running there och anger
https://lt.example.com/v2. - 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:
- Öppna Tools > Options > Languages and Locales > LanguageTool Server. På macOS ligger Tools under LibreOffice > Preferences.
- Kryssa i Enable LanguageTool.
- 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. - 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-gram | Med engelska n-gram | |
|---|---|---|
| Nedladdning | – | 8,4 GB, omkring 7 minuter på vår server |
| Disk | – | 15 GB |
| Engelsk text på 228 ord | 0,2–0,3 sekunder | 1,3–2,0 sekunder |
| Svensk text på 184 ord | 0,3–0,6 sekunder | 0,3–0,6 sekunder |
| Kontroller per minut, 10 användare samtidigt | 267 | 132 |
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:
| Mening | Fel | Hittat |
|---|---|---|
| Vi har skickat en offfert till kunnden. | två stavfel | ja, båda |
| Mötet börjar klockan klockan nio. | upprepat ord | ja |
| Det var ett stor misstag. | ett stor | ja, men föreslog "en stor misstag" |
| Vi ses på Måndag. | versal på veckodag | ja |
| Hej , hur mår du? | mellanslag före kommatecknet | ja |
| jag skickar fakturan i morgon. | gemen i början av meningen | ja |
| Ring kund tjänst om du har frågor. | särskrivning | nej |
| Dem kom sent till mötet. | dem i stället för de | nej |
| Jag kom sent eftersom att bussen var försenad. | eftersom att | nej |
| Jag har inte hunnit läst rapporten. | läst i stället för läsa | nej |
| Jag har en hus på landet. | en hus | nej |
| Bilarna är röd. | röd i stället för röda | nej |
| Vi har mycket saker att göra. | mycket i stället för många | nej |
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 Java | Efter starten | Efter kontroller på båda språken |
|---|---|---|
JAVA_XMX=1g, som i steg 2 | 550 MB | 1,2 GB, 1,4 GB med n-gram |
JAVA_XMX=1536m, avbildens standard | 500 MB | 1,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.