Self-Hosting Weblate on an Old Laptop for Community Translations
Join the newsletter
Follow my raw solo dev journey. Monthly direct to your inbox, no spam.
Localising App Pause was easier than I expected - at first. Play Console has a built-in machine translation feature that handles everything automatically. You move your hard-coded strings into strings.xml, enable the option in the Play Console hub, and it translates your app into whichever languages you choose. Done.
The problem with machine translation is that it’s imperfect. A German user reached out to tell me that my app was being inconsistent - mixing formal and informal tone throughout the UI. Not a great experience for native speakers. They offered to help fix it, which was exactly the kind of community involvement I’d hoped for.
The only problem: I had no infrastructure to actually accept their help. This is how I ended up with a self-hosted translation platform running on an old laptop in my house.
Finding the Right Tool
My first thought was a Google Sheet. Simple, free, no setup. But with 700+ strings across multiple languages, that idea fell apart quickly. Keeping a spreadsheet manually in sync with my strings.xml files would be a nightmare - and error-prone. I needed something that could work directly with the files.
So I started researching translation management platforms. There are quite a few out there - Crowdin, Transifex, POEditor, Localazy, and others. Most of them have a free tier, but with a catch: a cap on the number of strings you can manage. Once your app grows past that cap, you’re paying monthly.
That didn’t sit right with me. I wanted something that could grow with the app without the costs scaling up. I finally found Weblate. It’s open source and can be self-hosted, which means no string limits and no monthly bill. The only cost is the server - and I already had a spare old laptop gathering dust.
Self-Hosting on an Old Laptop
Weblate runs on Docker, which made deployment straightforward in theory. In practice, I hadn’t touched Docker in years. Rather than spending hours relearning it, I leaned on AI to write the deployment script and guide me through every step. It worked quite well actually. The AI handled the parts I’d forgotten, and I got Weblate running without too much friction.
Once it was up, I used Porkbun - where my domain lives - to set up a subdomain: translate.unrushedapps.com. Having a static IP helped, but pointing the subdomain at my home IP wasn’t enough on its own. I also had to configure port forwarding on my router so that incoming requests on the right port actually reached the laptop, and set up nginx as a reverse proxy to route those requests into Weblate. I don’t remember every step exactly - again, AI helped fill in the gaps - but that’s the rough shape of it.
I also set up simple start/stop scripts so I can bring Weblate up and down without having to remember Docker commands each time. One more thing worth mentioning: make sure your laptop is configured to never sleep. If it goes to sleep, Weblate goes offline.
Connecting It to My Repo
With Weblate running, the next step was connecting it to my Bitbucket repo where my strings.xml files live. Weblate supports this natively - it pulls the string files from the repo, lets translators work on them through the web UI, and then pushes the changes back as commits.
My workflow from there is simple: a translator makes changes on Weblate, those changes get committed to a branch, I create a pull request in Bitbucket, review it, and merge. Clean and controlled.
Figuring out Weblate’s UI took a while - it’s powerful but not exactly intuitive out of the box. Once I got my head around it though, it does exactly what I need.
Where It Stands Now
Since launching the platform, two users have stepped up to help with German translations. That’s two real people who care enough about App Pause to give their time - which is pretty motivating.
The setup is ready whenever more help comes in. If someone offers to translate into another language, I can onboard them in minutes.
Was It Worth It?
For a zero-budget localisation setup, absolutely. The only ongoing cost is the electricity for the laptop. I get a proper translation workflow, no string limits, and a platform that scales as far as the community does.
I should apologise for not being more specific about the setup - it’s been a few months and the details are hazy. If there’s enough interest, I’m happy to dust off the old laptop, dig into the config, and write a proper step-by-step follow-up. If you have questions or got stuck somewhere trying this yourself, drop a comment below.
Join the newsletter
Follow my raw solo dev journey. Monthly direct to your inbox, no spam.