HA

Halo

Powerful and easy-to-use open-source website builder

Blogging Platforms ★ 39.9k stars Medium setup GPL-3.0

Halo is a modern open-source blogging and website platform written in Java. It offers a clean admin interface, a plugin and theme marketplace, and an extensible architecture.

Key features

  • Modern admin interface
  • Plugin and theme marketplace
  • REST API
  • Markdown editor

Pros & cons

Strengths

  • Polished modern UI
  • Active development

Trade-offs

  • Higher memory needs from Java
  • Docs strongest in Chinese

Halo replaces

Last reviewed Aug 26, 2026 · 850 words

Halo's admin console is nicer than Ghost's and its theme system is more flexible than WordPress's, and I still would not recommend it to most English-speaking self-hosters. The reason is not the software. The documentation at docs.halo.run, the community forum, the app store listings, and most third-party themes are written in Chinese, and while the console itself has a decent English translation, the moment you hit a plugin setting or an error message you are in a translator tab. If that cost is acceptable, what you get is a fast, modern Java blog platform with 39,607 GitHub stars behind it and a development pace that has not slowed since the 2.0 rewrite.

Budget 1 GB and pin the heap

The catalogue's 1,024 MB floor is the JVM talking. Halo 2 runs on Spring Boot with Java 21, and left alone the JVM will claim whatever memory the container allows. On a 2 GB VPS I set the heap explicitly and have never seen the process exceed about 700 MB resident, which is more than Ghost's Node process and far more than a static generator, but stable. The docker run form from the official docs, with the heap pinned:

docker run -d --name halo --restart unless-stopped \
  -p 8090:8090 \
  -v ~/.halo2:/root/.halo2 \
  -e JVM_OPTS="-Xmx512m -Xms256m" \
  registry.fit2cloud.com/halo/halo:2 \
  --halo.external-url=https://blog.example.com

Port 8090 is the default, ~/.halo2 holds everything including uploads and the embedded database, and halo.external-url must match the public address or login redirects and theme asset URLs point at localhost. Put Caddy or another proxy in front for TLS; Halo does not terminate it.

Start on PostgreSQL, even for a small blog

By default Halo writes to an embedded H2 database inside ~/.halo2. It works, and it is the thing most people regret 18 months later when H2 version bumps make upgrades nervous and the file is 400 MB of unbackupable state. Halo 2 talks to PostgreSQL, MySQL, and MariaDB through R2DBC, and switching at install time is three extra arguments after the image name:

  --spring.r2dbc.url=r2dbc:pool:postgresql://db:5432/halo \
  --spring.r2dbc.username=halo \
  --spring.r2dbc.password=change-me \
  --spring.sql.init.platform=postgresql

A single Postgres container serving Halo and whatever else you run is the pattern I use everywhere; the reasoning is in Postgres for everything. Migrating from H2 to Postgres after the fact is possible via Halo's backup and restore, but doing it on day one is 2 minutes instead of an evening.

The app store is the product, and the pricing is in yuan

Themes and plugins install from the Halo App Store inside the console, and the catalogue is deep: comment systems, SEO tooling, S3 upload backends, membership paywalls, page builders. A good share of the best themes are paid, listed at roughly 30 to 200 yuan at last check, with licences tied to your Halo account. Free themes exist and several are excellent, but the English-language selection is thin. The plugin API is stable enough that community plugins survive minor Halo upgrades, which was not true in the 1.x era.

Halo 2 is a different program from Halo 1

If you find a tutorial mentioning MySQL-only setups, application.yaml edits, or a theme in a templates/ directory, it is for Halo 1.x and will not work. The 2.0 rewrite in 2022 changed the storage model to a Kubernetes-style extension system, replaced the theme engine, and broke every 1.x plugin. Migration from 1.x runs through an official plugin that imports posts, categories, and comments. Everything on the current site is 2.x; treat anything older as history.

Against Ghost, WordPress, and the static generators

Ghost has better newsletter and paid-membership tooling out of the box, English docs, and a bigger English theme market; it is the safer choice for a writer who wants to earn from subscribers. WordPress wins on plugin breadth by a factor of 100 and loses on attack surface and admin clutter. Hugo costs nothing to run and has no admin panel at all, which is either the point or the dealbreaker. Halo sits in the middle: a real CMS with a real editor, less bloat than WordPress, more flexibility than Ghost, and a language barrier the others do not have. The rest of the blogging category is worth a scan if none of those fits.

What I'd do

For a blog I write myself and want to look good with zero front-end work, and if I read Chinese or tolerate translated docs: Halo 2 on Docker, heap pinned at 512 MB, PostgreSQL from the first boot, Caddy in front, one paid theme bought once. Nightly pg_dump plus a tar of ~/.halo2/attachments covers the backup. For everyone else, Ghost is the honest default; it does 90% of what Halo does with documentation you can read at speed.

Compare Halo

25 head-to-head comparisons.

Similar blogging platforms apps