For most of the last decade our community forum lived on hosted Discourse at discourse.getgrav.org. It was a solid choice at the time, it ran reliably, and a lot of good conversations happened there. But it was also one more service we didn't own, sitting on a stack we didn't control, with our community's data living somewhere that wasn't Grav. This year I've been steadily pulling those pieces back home, and the forum was the last big one on the list.
So the community forum now runs on Forum Pro, a native Grav plugin, served straight from getgrav.org/forum. Same conversations, same members, same history. Just running on our own platform now instead of someone else's.
Bringing the Services Home
The forum isn't a one-off. It's part of a deliberate push to consolidate the third-party services we'd accumulated over the years into platforms we build and run ourselves:
- Crowdin for translations became translations.getgrav.org, our own translation platform.
- Gumroad for premium sales and licensing became licensing.getgrav.org, our own store and license server.
- Discourse for the community forum became Forum Pro, running at getgrav.org/forum.
Every one of those external services did its job. None of them did it the way we actually wanted, and each one meant another account, another billing relationship, another export-your-data-if-they-change-the-terms risk, and another integration that stopped at the edge of our site instead of being part of it. When you string enough of those together, your "platform" is really a dozen other people's platforms wearing a trench coat.
The thing that made this possible is Grav 2.0. Once site management moved behind a proper first-party API and we had Admin Next as a real application framework on top of it, building serious tools like a store, a translation system, or a full forum stopped being a stretch. They're Grav applications now, sharing the same accounts, the same admin, the same backups, and the same deployment pipeline as everything else.
Why Not Just Keep Discourse?
In fairness to Discourse, it's genuinely excellent software. It's powerful, it's mature, and it has features for situations most communities will never encounter. That power is exactly the problem we kept running into.
Discourse is complex. It's complex to host (a Ruby app, a Postgres database, Redis, a sidekiq job runner, a mail pipeline, all in their managed container), and it's complex to use. New members would land on a trust-level system, a tag-and-category model with more dimensions than we needed, and an interface that assumed you already understood how Discourse thinks. We were running a small, focused developer community on a platform built to run enormous, sprawling ones.
What I wanted was a forum that a first-time visitor could understand in about five seconds. Categories, topics, posts, replies. A search box that works. A way to mark something as the answer. That's most of what our community actually does, and the rest is moderation tooling that should stay out of the way until you need it.
So we built for that. Forum Pro is deliberately simpler than Discourse, and that simplicity is a feature, not a compromise.
We Borrowed the Best Ideas
Simpler doesn't mean we ignored a decade of hard-won forum design. Discourse, and plenty of other platforms, figured out a lot of things that are genuinely good, and we happily borrowed the ones that fit:
- Read tracking that actually tracks. A "last visit" line shows you exactly what arrived since you were last here, and unread topics get a counter that jumps you straight to the first reply you haven't seen.
- Suggested topics under every thread, your unread ones first, then related recent ones, so there's always somewhere to go next.
- A timeline rail beside long topics that shows where you are in the conversation and lets you scrub through it. You can turn it off if it's not your thing.
- Notification preferences per topic and per forum, with a simple Watching / Tracking / Normal / Muted picker that explains what each level actually does.
- Reactions, bookmarks, solved-topic markers, polls, and private messages between members.
- Member groups like Core Team and Moderators, each with their own color and icon, shown as badge bars under member names, alongside earned award badges and an optional member title.
- Overlapping avatars on topic listings so you can see who's in a conversation at a glance, and crisp letter avatars in a member's own color for anyone who hasn't uploaded a picture.
- Moderation that stays tucked away: a tidy wrench menu for topic actions, a moderation queue, flags, bans, and per-member tooling, all gated behind permissions so regular members never see it.
A few things are genuinely ours, built because we wanted them. The whole thing is real-time where it counts: you can see who's viewing a topic, who's typing a reply, and new posts show up live, and it all falls back gracefully to plain page loads when real-time isn't available. Code blocks in posts are rendered with codesh, the same syntax highlighter we now use across the entire site, so a PHP snippet in a forum reply looks exactly like one in the docs, frontmatter-aware Grav markdown and all.
And because the forum is part of the site, blog posts and other pages can now carry a comments section backed by a real forum topic. Comments are moderated, searched, and browsed in the forum like any other thread, and one account covers both. No separate comments service, because of course not.
Not a Trivial Build
I don't want to make any of this sound easy, because it wasn't. A forum is a genuinely complex beast: accounts and authentication, permissions, moderation queues, notifications, real-time presence, full-text search, email, a dozen kinds of content, and a clean migration path for all of it. There's a reason forums are usually their own dedicated product rather than a feature you bolt onto an existing site.
We built the whole thing. We leaned heavily on Anthropic's Claude Fable model to implement and verify Forum Pro, with Claude Opus brought in on the harder problems. The result is a complete, tested forum that we own and run ourselves, finished far faster and more thoroughly than the old way would have allowed.
Migrating a Decade of Conversations
Migration was its own challenge. Moving ten years of community history across without losing anything is the kind of thing that goes wrong quietly, and it's where a lot of the careful work went.
We wrote a Discourse importer that reads a standard Discourse backup (the pg_dump it hands you when you export) and brings the whole thing across in a single command:
bin/plugin forum-pro import-discourse backup.sql.gz --source-url=https://discourse.getgrav.org
It carries over more than I expected to be able to:
- Over 3,700 members, 9,200+ topics, and 41,000+ posts, plus the private messages between them.
- Categories, tags, custom groups and their memberships (including flair colors), custom award badges, and each member's title.
- Reactions, bookmarks, polls, subscriptions, solved-topic markers, and the full edit history of every post.
- Avatars and uploaded attachments, downloaded from the old Discourse CDN and rehosted on our own CDN at
cdn.getgrav.org.
The importer is idempotent, which mattered more than anything else during the cutover. Every imported row keeps a reference back to its original Discourse ID, so running the import again skips everything that's already there and only pulls in what's new. That meant I could do a full import early, keep testing against real data, and then run a final pass right before go-live to sweep up the handful of posts that landed in between. An interrupted run just gets started again. No wiping, no duplicates, no holding your breath.
Your Old Links Still Work
Here's the part I was most worried about. Ten years of Discourse means ten years of links to discourse.getgrav.org scattered across Google, Stack Overflow, old blog posts, and people's bookmarks. Breaking all of them was not an option.
Because every topic, post, category, and member kept its original Discourse ID through the migration, Forum Pro can map an old URL to its new home. Old links like /t/some-topic/1234, /p/5678, /c/some-category, and /u/somemember now 301 redirect to the right place at getgrav.org/forum. When the old discourse.getgrav.org hostname points at the new site, those links resolve cleanly to the migrated content instead of dead-ending.
So your bookmarks keep working, search engines follow the redirects, and nobody lands on a 404 because we moved house.
What's Next
The forum is live and the migration is done, but Forum Pro is young and there's a healthy list of things still to come. If you find a rough edge, a missing piece, or something that worked better on the old forum, I genuinely want to hear about it. That feedback is exactly what shapes where this goes next.
And there's a longer-term plan here. Once Forum Pro has been properly battle-tested running our own community for a while, we intend to release it as a premium plugin, so you'll be able to run the same forum on your own Grav site. Consider getgrav.org/forum the live proving ground.
This is also a good example of what Grav 2.0 makes possible. A full community forum, a store, and a translation platform, all built as Grav applications on the same foundation, all owned and run by us. That's the whole point of the work we've been doing this year.
Getting Help
The best place to reach us in real time is our Discord server at chat.getgrav.org. And of course, the new forum itself is at getgrav.org/forum, so come kick the tires and start a thread.
Enjoy!
Andy