---
title: "Deploy languagetool"
description: "Grammar, style and spell checking API server powered by LanguageTool"
category: "Other"
url: https://railway.com/deploy/languagetool-1
---

# Deploy languagetool

Grammar, style and spell checking API server powered by LanguageTool

**[Deploy languagetool on Railway](https://railway.com/template/languagetool-1)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/languagetool-1/manifest.json

- **Creator:** onepush
- **Category:** Other

## Template content

### LanguageTool

- **Image:** erikvl87/languagetool:6.8@sha256:ef8fa12cbd485166c9ceeb7139d76d56d07707a624da6bb1fc1fbb5411750527
- **Start command:** `/bin/bash -c 'cd /LanguageTool; N=/ngrams; U=https://languagetool.org/download/ngram-data; ROOT=0; [ "$(id -u)" = 0 ] && ROOT=1; [ $ROOT = 1 ] && [ -d $N ] && chown languagetool:languagetool $N; JOBS=""; for l in $(echo "${NGRAM_LANGUAGES:-none}" | tr "A-Z," "a-z "); do case $l in none|off|false) continue ;; en) f=ngrams-en-20150817.zip ;; de) f=ngrams-de-20150819.zip ;; es) f=ngrams-es-20150915.zip ;; fr) f=ngrams-fr-20150913.zip ;; nl) f=ngrams-nl-20181229.zip ;; *) echo "ngrams: unknown language $l (choose from en,de,es,fr,nl)" >&2; continue ;; esac; if [ -d $N/$l ]; then echo "ngrams: $l already on the volume"; elif [ -d $N ] && [ -w $N ]; then JOBS="$JOBS $l:$f"; else echo "ngrams: $l requested but $N is not a writable volume; add a volume at $N (see README)" >&2; fi; done; if [ -n "$JOBS" ]; then P=$$; ( NEW=0; for j in $JOBS; do l=${j%%:*}; f=${j#*:}; echo "ngrams: downloading $f in the background (LanguageTool keeps serving meanwhile)"; rm -rf $N/.$l.zip $N/.$l.tmp; if curl -fsSL --retry 5 -o $N/.$l.zip $U/$f && unzip -q -o $N/.$l.zip -d $N/.$l.tmp && [ -d $N/.$l.tmp/$l ]; then mv $N/.$l.tmp/$l $N/$l; rm -rf $N/.$l.zip $N/.$l.tmp; [ $ROOT = 1 ] && chown -R languagetool:languagetool $N/$l; echo "ngrams: $l installed"; NEW=1; else echo "ngrams: $l download or unzip failed (check free space on the volume)" >&2; rm -rf $N/.$l.zip $N/.$l.tmp; fi; done; if [ $NEW = 1 ]; then echo "ngrams: restarting so LanguageTool loads the new data"; kill $P; fi; ) & fi; if [ -z "$langtool_languageModel" ]; then for l in en de es fr nl; do [ -d $N/$l ] && export langtool_languageModel=$N && break; done; fi; [ -n "$langtool_languageModel" ] && echo "ngrams: languageModel=$langtool_languageModel"; if [ $ROOT = 1 ]; then exec su languagetool -s /bin/sh -c "echo \"running LanguageTool as \$(id -un)\"; exec bash start.sh"; fi; exec bash start.sh'`
- **Health check:** /v2/languages
- **Public domain:** Yes

## Documentation

# Deploy and Host self hosted LanguageTool 6.8 (Open-Source Grammar Checker API) on Railway

This template runs the erikvl87 LanguageTool 6.8 image as a public HTTP API with /v2/check and /v2/languages, no secrets required. It suits small teams who want grammar checks without sending draft text to a cloud service.

## About Hosting LanguageTool 6.8 open-source software on Railway (self hosted LanguageTool HTTP API template)

Your draft text stays on your own service instead of a vendor's cloud. This template runs the official erikvl87 image, pinned by digest, and serves the HTTP JSON API on port 8010.

Railway handles the rest: pulling the image, routing a public domain to port 8010, and restarting the container if it dies. Health checks hit /v2/languages, so readiness is easy to see.

## Why Deploy LanguageTool 6.8, the Grammarly alternative on Railway (Railway Free Trial)

Grammarly keeps your drafts on its cloud and bills per seat. The $5 Railway trial is enough to test the deploy, not to keep it running.

Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying LanguageTool 6.8 on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.

### Railway vs Other Hosting Providers and VPS for LanguageTool 6.8 self hosting

The LanguageTool image behaves the same on any host, so the real difference is how much server work you take on.

| Provider | What You Get with Railway | What You Get with the Other Provider |
| --- | --- | --- |
| DigitalOcean | Template deploy with port 8010, health check and restart already set | A droplet you size, patch, and firewall yourself |
| AWS | Same template, with no VPC, IAM or load balancer to configure | Fine-grained control over instance type and networking, with more setup |
| Hetzner | Managed deploy with no OS to maintain | Cheap servers with generous RAM, but you handle Docker, TLS and updates |

## Common Use Cases for hosted LanguageTool 6.8

- **CI grammar gates:** Your docs repo can POST changed Markdown to /v2/check with language=en-US and fail the build when matches pile up.
- **LibreOffice against your server:** Point the LanguageTool extension at your own domain so drafts hit your Railway service, not a public endpoint.
- **Browser extension on your domain:** Set the server URL to https://your-domain/v2 so the whole team checks against one instance.
- **Docs and CMS pipelines:** A build hook can send page text to the API before publish, catching typos in release notes and changelogs.
- **Draft text off third-party clouds:** Unreleased copy and customer emails stay on infrastructure you control, though Railway still hosts the box. Check your own data policy before you call it private.

## Dependencies for LanguageTool 6.8 Docker hosted on Railway

The template needs almost nothing to start. All twelve variables ship with defaults, so a plain deploy gives you a working /v2/check endpoint.

### Deployment Dependencies for Managed LanguageTool 6.8 Service (Grammar Checker)

- **Railway service:** one service on the LanguageTool 6.8 image, with a public domain routed to port 8010.
- **Health check:** GET /v2/languages with a 300 second timeout, restart policy ALWAYS.
- **Volume:** none by default. Mount one at /ngrams only if you want n-gram data.
- **Secrets:** none. The API has no built-in auth, so keep the domain private if you need access control.

### Implementation Details for LanguageTool 6.8 (Using erikvl87/languagetool official docker image)

The image is erikvl87/languagetool:6.8, pinned to sha256:ef8fa12cbd485166c9ceeb7139d76d56d07707a624da6bb1fc1fbb5411750527. Java heap comes from Java_Xms=256m and Java_Xmx=1g. Raise Xmx carefully, since Railway RAM is the real ceiling.

## How does LanguageTool 6.8 compare against other grammar checkers

### LanguageTool vs Grammarly (Grammarly Alternative)

- **Where Grammarly wins:** Its tone and rewrite suggestions are more polished, and it works in most apps without setup.
- **Where LanguageTool wins:** Your text stays on your own Railway service, and there is no per-seat fee.
- **API fit:** A plain HTTP JSON call to /v2/check drops straight into a CI job or docs build.

### LanguageTool vs ProWritingAid (ProWritingAid Alternative)

- **Where ProWritingAid wins:** Its reports on pacing, sentence variety and repeated words suit long-form editing.
- **Where LanguageTool wins:** It is open source and checks grammar, spelling and style over a simple API.
- **Honest take:** If you want a writing coach dashboard, ProWritingAid is the better buy.

### LanguageTool vs Microsoft Editor (Microsoft Editor Alternative)

- **Where Microsoft Editor wins:** It is built into Word, Outlook and Edge, so there is nothing extra to install.
- **Where LanguageTool wins:** LibreOffice and browser extensions can point at your own server instead.
- **Data path:** Editor checks run through Microsoft's services, while LanguageTool checks stay on your host.

### LanguageTool cloud vs self hosted (Cloud and Self Hosted Comparison)

- **Cloud wins on setup:** languagetool.org needs no deployment and no RAM sizing from you.
- **Self hosted wins on control:** You set request limits, text length caps and n-gram languages yourself.
- **Gotcha:** Optional n-grams need a volume at /ngrams, so they stay off by default (NGRAM_LANGUAGES=none).

## How to use LanguageTool 6.8 (the OSS grammar checker)?

1. Deploy the template from the Railway editor with no inputs, since all 12 variables ship with defaults and no secrets are needed.
2. Wait for GET /v2/languages to return 200. The first boot can be slow while the JVM loads, so give it a few minutes before you assume something broke.
3. Run the curl below to confirm /v2/check returns matches.
4. Point LibreOffice or a browser extension at https://your-domain/v2.
5. Optionally enable n-grams by setting NGRAM_LANGUAGES to a language such as en and mounting a volume at /ngrams.
6. Tune Java_Xmx and the request limits once you see real traffic, not before.

```bash
curl -s https://your-domain/v2/check \
  -d language=en-US \
  -d text="This are a tset sentence."
```

A non-empty matches array in the JSON response means the check ran and found problems, while an empty array means the text passed the rules that are enabled by default.

## How to self host LanguageTool 6.8 on other VPS Services (LanguageTool self hosting guide)

### Clone the Repository

Pull the template source and move into the folder.

```bash
git clone https://github.com/onepush-dev/languagetool
cd languagetool
```

### Install Dependencies

Docker is the only host dependency, since Java lives inside the image.

```bash
sudo apt-get install -y docker.io
```

### Configure Environment Variables

Every variable has a default, so you can skip this step. Save any overrides in a file named .env.

```bash
PORT=8010
Java_Xmx=1g
NGRAM_LANGUAGES=none
langtool_requestLimit=120
```

Mount a volume at /ngrams before you set NGRAM_LANGUAGES to anything other than none.

### Start the LanguageTool 6.8 Application

Start the container, then check the health endpoint. The first boot is slow, so give it a minute before you curl.

```bash
docker run -d --name languagetool -p 8010:8010 --env-file .env erikvl87/languagetool:6.8
curl -s http://localhost:8010/v2/languages | head -c 200
```

Point a TLS reverse proxy at port 8010 to serve https://your-domain/v2.

## Official Pricing of LanguageTool 6.8 (LanguageTool pricing)

LanguageTool 6.8 is open source, so the software itself costs nothing to run. The erikvl87 image needs no license key and no secrets, so there is no per-seat or per-check fee.

## LanguageTool 6.8 cloud vs self hosted comparison (Pricing, features, costs, and more)

Hosted LanguageTool sells convenience. Self hosting swaps that for your own uptime and restarts. The real question is whether your text can leave your infrastructure.

### Monthly cost of self hosting LanguageTool 6.8 on Railway

Railway bills for what the service uses, so cost follows memory and CPU, not a per-seat fee. I won't quote a number because it moves with traffic and language count. Raising Java_Xmx or enabling n-grams (which needs a volume) pushes the bill up.

### System Requirements for Hosting LanguageTool 6.8 on a VPS

Plan for a few gigabytes of RAM, since the JVM needs room beyond the 1g default heap. Raise Java_Xmx to 2g only after you've watched memory under real load. Disk stays small unless you mount n-gram data at /ngrams. A modest core count handles light use.

## Frequently Asked Questions (FAQs)

### Which path should the health check use?

Use GET /v2/languages. The template waits up to 300 seconds on it, and a 200 response with about 60 languages means the API is ready.

### Do I need n-grams to get useful results?

No. NGRAM_LANGUAGES is set to none by default, so n-grams are off. Turn them on only if you need better confusion-rule detection, and then mount a volume at /ngrams first.

### How much RAM do I need, and what about the Java heap?

The defaults are Java_Xms=256m and Java_Xmx=1g. Raise Java_Xmx to 2g if you load many languages or see heavy traffic, and check your Railway memory limit before you do.

### What are the default rate limits?

Each client IP gets 120 checks per 60 seconds. Set langtool_requestLimit to 0 if you want the limit off.

### Is there authentication?

No. The template has no secrets and no login, so anyone who can reach your domain can call /v2/check. Keep the domain private or put an auth proxy in front if the text is sensitive.

### How do I connect LibreOffice?

Install the LanguageTool extension, open its options, and set the server to https://your-domain/v2. Then check a paragraph to confirm matches come back.


## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/languagetool-1
