Skip to content

Instantly share code, notes, and snippets.

@MaximilianKohler
Last active April 1, 2024 04:32
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MaximilianKohler/3bdedd0185283ac30c1f1422f9626947 to your computer and use it in GitHub Desktop.
Save MaximilianKohler/3bdedd0185283ac30c1f1422f9626947 to your computer and use it in GitHub Desktop.
Detailed startup guide for newbies on migrating to, and setting up a Xenforo forum. Including reddit-like titles, and threaded comment view. [Centmin Mod]

Xenforo forum setup guide

This is a collection of all the information I came across while setting up my own Xenforo forum (migrating from Reddit subs). I'll keep it updated as I learn more.

Table of contents

How-to easily create a TOC.

Why move from Reddit to a forum?

Reddit has been going downhill on the path to enshittification for many years. But recently, they really s**t their bed. They've made communities no longer autonomous, and completely ignore their Terms of Service. Meaning there is no guarantee that any user or community can freely participate under the ToS without fear of the admins randomly stepping in and asserting their power -- whether that be via banning users or communities without cause, or turning over the community to complete outsiders or hostile entities.

Reddit showed that you can't trust a 3rd party. They can rapidly and drastically change their policies to screw you over after you've put in a decade of work hosting & growing your communities on their platform. With hosting your own forum, there is no such risk; you are under complete control.

Hosting your own Lemmy instance is a similar possibility, but Lemmy is early in development, and has various issues and more limitations currently. For me, adding a traditional forum to my existing website was the best option.

I wanted to move away from Reddit without losing any of the functionality/features, and I was able to accomplish that. I'm paying $5/mo for my server, which is plenty affordable for me.

Why Xenforo (XF)?

A majority of the forums I've participated in over the past decade use XF. It seems to be the favorite choice for most people. There are free options that I like, like phpBB. But I'm not sure what their features & limitations are compared to XF. You can certainly install them and test them out for yourself. I wanted to get this done ASAP, and didn't want to have to possibly migrate from phpBB to XF later on. I didn't want the hassle/cost for myself, and didn't want my users to have to get used to something new. I also wanted to start out by having the forum appeal to the broadest audience possible.

If you use free-hosted options like these https://best-web-hosting.org/free-forum-hosting/ you have the same problem as with Reddit - they own you. But free software like phpBB that you host yourself is fine.

Making my way through the XF installation exposed some of the downsides:

  1. $160 may be too costly for many people, but there are free options listed at the bottom.
  2. The documentation is quite poor, so you'll be finding yourself doing lots of searches for "how to" and troubleshooting. And you may not find good answers despite this product being around for so long and being so popular.
  3. If you're not technically savvy yourself you'll have to spend lots more money hiring people to make tweaks that seem like they should be simple and part of the default software.
  4. Many of the best addons are free, but you may find that you need/want features not covered by them and thus have to pay ~$30 for existing addons, or $60+ for custom ones.

Overall, the cost, time consumed, and difficulty are all much higher for Xenforo compared to starting up some Reddit subs. Not to mention the monthly server & email costs. I think the Xenforo devs can definitely improve on this to become a more competitive option.

They have various hour-long videos on their Youtube channel https://www.youtube.com/@XenForo/playlists. They are helpful but definitely not exhaustive.

Xenforo is highly customizable, but most of the options are locked behind:
a) hiring someone
b) having technical skills/knowledge and/or time to figure everything out on your own

Lucky for you, I've shared some insights below that will help you get acquainted. I'll be keeping this Github guide updated as I learn more.

Why Centmin Mod?

Centmin mod seems to be one of the most popular server setups for Xenforo forums, due to speed, good documentation, and an active developer.

The other option that was mentioned to me was OpenLiteSpeed server + Cyberpanel. It's supposed to be more novice-friendly, but I actually found Centmin easier since there was a full step-by-step guide for it, along with a more active/helpful community/developer. With Cyberpanel, I ran into problems I couldn't find an answer for.

Lessons learned:
The primary factors in choosing a specific setup are:

  1. The existence of a step-by-step guide that covers all aspects of what you intend to set up: Server host, software, DNS, forum, etc.
  2. The quality of the documentation.
  3. How active the community or support options are.

Centmin mod beats Cyberpanel + LiteSpeed in all of these aspects.

Easiest setup

If you want to pay someone to do everything for you, here are some options:

Setting up a server

If you want to go the easiest route, you can purchase a shared-hosting plan from someone like MattW. Shared hosting means Matt takes care of server installation & updates. All you have to worry about is your forum. It's easier and may be more convenient, especially for novices, but there are limitations (it's not your server so you can't do whatever you want) and you get less bang for your buck. Here's an argument in favor of shared hosting if you're starting off small.

Free micro instance in Google's GCP free tier: https://www.theadminzone.com/threads/benchmark-review-for-upcloud-vs-digitalocean-vs-linode-vs-vultr-vs-hetzner.151018/post-1141139

After some deliberation, I chose Hetzner cloud servers. They seem to have a good reputation and some of the best specs-to-price ratios. Cloud servers are similar to VPS, but seem more flexible.

Basic Hetzner setup: https://www.youtube.com/watch?v=kTgu4wJ7v-0

Change time zone: On CentOS 7 it's timedatectl to check. Then choose one: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. Then set with timedatectl set-timezone America/Los_Angeles.

For the hostname, I used the directions here https://levelup.gitconnected.com/setting-up-your-own-bulk-mail-server-using-sendy-and-aws-20d05ee01362?gi=fed21a6bce9e

Putty and FileZilla will be your main tools on Windows. FileZilla settings:

Host: elastic IP
Port: blank
User: ubuntu
PW: key file
Protocol: SFTP SSH file transfer

$20 credit https://hetzner.cloud/?ref=iQrpqFra6HP7

Note that Volumes are optional additional storage. Hetzner automatically comes with a 40 GB drive, which is probably enough for most people. You can add a volume later on if needed.

I'm currently paying $5/mo for my Hetzner server running a small forum. I've heard that $10/mo is enough to run fairly active/large ones.

Hetzner backups:

SSH:

Be careful with SSH keys. When I removed mine from the UI at /security/sshkeys it seemed like an irreversible action akin to deleting my whole server. Hetzner support implied there's a fallback option, but I didn't quite understand it, and what I tried didn't work, so I created a new server.

When I ran "ssh-keygen -t ed25519" on Windows 10, and added a passphrase, Putty/puttygen would not open the key. IE: import key did not work https://web.archive.org/web/20230605235602/https://blog.andrerampersad.me/how-to-import-ed25519-keys-for-use-in-putty-on-windows/

When I ran it without a passphrase, putty would open it, convert it to .ppk with or without a passphrase. So it's better to use Putty to create the keys.

DDoS:

Protecting against DDoS - "Your origin IP should never leak. If you set up your server before without Cloudflare, then switch to Cloudflare there will be public records. If you're getting a fresh start with Cloudflare you're going to want to switch servers" https://www.youtube.com/watch?v=hcmxz0w7Td8&t=844s

Test “Origin IP” Vulnerability https://geekflare.com/test-origin-ip-exposed/

Check website IP address https://www.ecosia.org/search?q=check%20website%20ip%20address - nslookup.io is good.

Unlimited, free DDoS protection with Cloudflare https://www.cloudflare.com/cdn/#CDN-Page-Pricing-AS

"Cloudflare only stops those who don't know your server's IP address. The first time someone posts an image on forum that is hosted on their own server... they have your server's IP and can by-pass Cloudflare" https://xenforo.com/community/threads/is-digital-ocean-host-good-for-xenforo-or-what-host-can-is-best.198215/post-1634117 - "or you can use Cloudflare itself as your image/unfurl proxy (for free and the reliability of hundreds of data centers)"

Hetzner SMTP email

IPv4:

Monitoring software:

https://community.centminmod.com/threads/troubleshooting-website-and-database-performance-speed-slowdowns-postgresql-mariadb.24397/#post-98475

UptimeRobot (hosted) or UptimeKuma (selfhosted). updown.io, Hetrixtool, Cloudflare has it for paid plans. newrelic.com for server and application monitoring.

Avoid Endurance International Group EIG:

Full installation guide:

The site I used is excluded from archive.org and archive.today so I'm not sure if I'm even allowed to link to it here. But there's a forum post with a series of video tutorials/walkthroughs for the full setup titled "CentMinMod Tutorial Series - Cloudflare + nginx + Xenforo" and the videos are:

I would have never been able to do it without this guide. And this guide is a main part of why I chose Centmin Mod.

The specific page with the guide even stopped loading for me. I was panicked that it was lost forever, but I was able to access it once at some point and saved the webpage locally, I also downloaded the Youtube videos.

All of this is certainly not ideal, so perhaps someone can make a less-problematic guide.

The creator of CentMin Mod (Eva) has his own written guides, but I find them a little more difficult, and the video tutorials above cover more essential things. Though, I didn't find Eva's Xenforo setup guide on Cenmin Mod till later, and it actually seems better in some ways. I would use Eva's guide side-by-side with the video tutorial.


CentMinMod Tutorial 3 - How to Install Xenforo 2 on nginx https://www.youtube.com/watch?v=YprjFHTOHwI

Upload folder to /home/nginx/domains/forum.mysite.com/public

He uses these two commands and says not to worry about the error, but it seems like the error is important and all the files don't actually copy over. You can copy them over with Filezilla, or you can try alternative commands in the Centmin guide above.

mv upload/* .
mv upload/*. .
mysql
show databases;
create database myforum;
/usr/local/nginx/conf/conf.d/
ngxrestart
/home/nginx/domains/forum.mysite.com/public/src/config.php

chown -R nginx:nginx /home/nginx/domains/forum.mysite.com/public https://community.centminmod.com/threads/xf-2-2-2-cannot-install-style.20812/ - you may have to run this command occasionally if you login to FileZilla with root to install addons.

	'port' => '11211'
memcachedrestart
mysqlcheck --all-databases

Centmin Mod redirects:

PHPMyAdmin:

"I would not recommend relying on it for your DB dumps. It has a habit of timing out and you getting a corrupted export of your DB, especially when on a shared server environment" https://xenforo.com/community/threads/public-service-announcement-check-your-mysql-backup.152740/post-1535332

General Centmin Mod info:

Use cmd alias centmin to invoke centmin.sh (menu).
Use alias to see available cmds. cmdir gets you into the centmin mod directory.

cmupdate
ngxrestart
fpmrestart (php)
cminfo sar-mem - memory metrics for past 7 days
cminfo sar-cpu
Firewall: /etc/csf
csf -ra (reboot firewall)

Updates:

Enable and verify automatic yum updates https://community.centminmod.com/threads/automatic-nightly-yum-updates-with-yum-cron.1507/page-6#post-96644

Ubuntu tells you when a system restart is required. But it seems that CentOS does not. Per https://www.cyberciti.biz/faq/how-to-check-if-centos-rhel-needs-a-full-reboot/, we can use these two commands:

needs-restarting -r
systemctl reboot

You may have to run yum whatprovides needs-restarting first, to install the utility, but when I ran yum install yum-utils it said it was already installed.

This check is added to Centmin beta branch: https://community.centminmod.com/threads/centmin-mod-130-00beta01-release-discussion.22676/page-2#post-97159

Search:

Find content in files:

Find files:

Use sed to replace content in files: https://community.centminmod.com/threads/automatic-nightly-yum-updates-with-yum-cron.1507/page-3#post-98078

CentOS 7 is EOL soon

SSL:

Generally, you don't want SSL certificates for the main hostname/IP (nor phpmyadmin) anyway as every time you issue an SSL certificate, the certificate can be publicly searched for via Certificate Transparency logs https://community.centminmod.com/threads/ip-ssl.22538/#post-92222 - https://community.centminmod.com/threads/can-i-issue-ssl-with-acme-sh-for-phpmyadmin-tool.21901/#post-90131

So if you have Cloudflare proxy protecting and hiding your real server IP for Nginx vhosts on Centmin Mod server but have valid SSL certificate on main hostname without Cloudflare proxy, then you'd leak your real server IP.

And if you enabled Cloudflare proxy on that main hostname, you'd break email deliverability on the Centmin Mod server as reverse PTR lookup for main hostname won't be able to return the real server IP and instead return Cloudflare proxy edge server IP - see Email - Steps to ensure your site/server email doesn't end up in spam inboxes. https://community.centminmod.com/threads/install-le-ssl-on-hostname.21634/#post-89626

So don't request one for http://main.myforum.com/

Email:

Centmin mod email info (SPF, DKIM, DMARC, etc.) https://community.centminmod.com/threads/steps-to-ensure-your-site-server-email-doesnt-end-up-in-spam-inboxes.6999/

Centmin Mod installs Postfix MTA server for outbound mail. https://community.centminmod.com/threads/how-i-setup-amazon-ses-donotreply-address-easily.15810/#post-67765

Read over the Managing root user emails section and this forum comment so that you don't get spammed with thousands of emails.

There's an email set in /etc/yum/yum-cron.conf, and another in /root/.forward.


Free @yourdomain email using Cloudflare, an SMTP (Sendinblue/Brevo or Mailjet), and Gmail: https://www.youtube.com/watch?v=nNGcvz1Sc_8

I was surprised to see that some forums are using Gmail accounts. I didn't know that was possible, and some people say it's not anymore. You'll have to look up a guide for setting that up yourself.

Amazon SES is the cheapest SMTP option if you're doing large amounts of emails. If you're small, and you think you'll stay small, there are free options like Sendinblue/Brevo and Mailjet.

Addon to integrate XF with Amazon SES & SNS

to process bounces & unsubscribes: https://xenforo.com/community/resources/amazon-ses-bounces-support.8319/

The main instructions should work. If you have trouble you can review this alternative guide: https://xenforo.com/community/threads/amazon-ses-bounces-support.192673/post-1634067

ErrorException: [E_WARNING] Attempt to read property "recipient" on bool src/XF/EmailBounce/Processor.php:106 https://xenforo.com/community/threads/amazon-ses-bounces-support.192673/post-1635749 "appears when you install everything and Amazon tries to connect. After everything is set up correctly with Amazon SES, this error does not happen a second time. Just delete the errors and see it yourself over the next days"

More info in this comment and the next two: https://xenforo.com/community/threads/amazon-ses-bounces-support.192673/post-1637109

Troubleshooting:

The alternative email method

is to create a "myforumbounce35343@gmail.com" email to be used ONLY for this purpose. Directions:

Testing email:

Use "Tools -> test outbound email".

https://docs.aws.amazon.com/ses/latest/dg/send-an-email-from-console.html

success@simulator.amazonses.com
bounce@simulator.amazonses.com
complaint@simulator.amazonses.com
suppressionlist@simulator.amazonses.com

Import/export:

https://xenforo.com/community/threads/192673/post-1637170

Email newsletters

There is a built-in option for sending out emails to everyone, but it's somewhat limited.

Threadloom Search / Newsletter to be retired https://www.theadminzone.com/threads/threadloom-search-newsletter-to-be-retired.154476/page-3#post-1172368

DragonByte Mail is mentioned as an alternative https://xenforo.com/community/resources/dbtech-dragonbyte-mail.5867/ $25.

Titles:

Other:

Threaded view/replies:

There's a $30 add-on that adds this optional functionality to threads. You can choose to reply-in-thread or reply normally. I haven't tried it. I'm sure it has its downsides. https://xenforo.com/community/resources/post-reply.6928/

I found a free one: [OzzModz] Post Comments https://xenforo.com/community/resources/ozzmodz-post-comments.8591/

Prefixes & tags

Prefixes are forum-specific, tags are site-wide.

Add list of prefixes at top of forum:

If you delete a "custom thread field" it (and its content) will be deleted from all previous threads that used them. It's irreversible. https://xenforo.com/community/threads/deleting-custom-thread-fields.215714/

Thus, I would not recommend using them for anything important, and instead use the "field description" to list information you want people to include in their post, and they can copy-paste that in. You could pair that with a "checkbox field type" containing "I included all required info". I found an addon that solves the problem: [OzzModz] Thread & Quick Reply Placeholders & Templates.

Backups

Manual:

The main guide covers manual backups: https://youtu.be/tEwliqSt1Zg?t=944 - /home/backup.sh

I added a change of permissions from 644 to 640 due to: https://community.centminmod.com/threads/mariadb-10-1-upgrades-to-mariadb-10-2-10-3-and-10-4.17793/#post-75214

My SQL backup:

cd /home/
mysqldump yourdbname | gzip > yourdbfilename-$(date +"%Y-%m-%d--%H-%M-%S").sql.gz
chmod 0640 /home/yourdbfilename*

Manual centmin backups:

First I edited the backup.sh with this different date format: full_backups/$(date +"%Y-%m-%d--%H-%M-%S")-

Then: /home/backup.sh or

cd /home/
./backup.sh

chmod 0640 /home/nginx/domains/forum.myforum.com/backup/full_backups/2023*

Backup.sh:

I added all the commands to the backup.sh so that I only have to run one command. I also added some other config files. The \cp copies & overwrites without a confirmation.

mysqldump myforumdb | gzip > /home/nginx/domains/forum.mysite.com/backup/full_backups/myforumdb-$(date +"%Y-%m-%d---%H-%M-%S").sql.gz
wait
\cp /etc/my.cnf /home/nginx/domains/forum.mysite.com/backup/misc_files/
\cp /etc/centminmod/custom_config.inc /home/nginx/domains/forum.mysite.com/backup/misc_files/
\cp /etc/centminmod/php.d/b_customphp.ini /home/nginx/domains/forum.mysite.com/backup/misc_files/
\cp /etc/csf/csf.conf /home/nginx/domains/forum.mysite.com/backup/misc_files/
crontab -l > /home/nginx/domains/forum.mysite.com/backup/misc_files/crontab_backup.txt
wait
tar -zcvpf /home/nginx/domains/forum.mysite.com/backup/full_backups/$(date +"%Y-%m-%d---%H-%M-%S")-miscFILES-.tar.gz /home/nginx/domains/forum.mysite.com/backup/misc_files/;
tar -zcvpf /home/nginx/domains/forum.mysite.com/backup/full_backups/$(date +"%Y-%m-%d---%H-%M-%S")-sitebackupPUBLIC-.tar.gz /home/nginx/domains/forum.mysite.com/public/;
tar -zcvpf /home/nginx/domains/forum.mysite.com/backup/full_backups/$(date +"%Y-%m-%d---%H-%M-%S")-mainPUBLIC.tar.gz /usr/local/nginx/html/;
tar -zcvpf /home/nginx/domains/forum.mysite.com/backup/full_backups/$(date +"%Y-%m-%d---%H-%M-%S")-CONF.tar.gz /usr/local/nginx/conf/conf.d/;
wait
chmod 0640 /home/nginx/domains/forum.mysite.com/backup/full_backups/*
chmod 0640 /home/nginx/domains/forum.mysite.com/backup/misc_files/*

Automatic:

You can pay Hetzner/your server provider an additional 20% for full-server automated backups. There are free ways to do automated backups locally and externally, but I haven't found a good guide yet. If I learn of one I'll add it here.

Eva/George has a script for premium users: https://community.centminmod.com/threads/dbbackup-sh-quick-mysql-database-backups-for-centmin-mod-stack.4573/

You can automate the backup.sh with a cronjob (Eg: 15 */12 * * * /home/backup.sh 2>/dev/null to backup every 12 hrs), but if your databases are password protected you'll have to change some of the commands to make password entry non-interactive. Eg with postgres: psql postgresql://listmonk:CURRENT_PASSWORD@127.0.0.1:9432/listmonk

Restore:

Move Xenforo to a new server: https://xenforo.com/community/threads/moving-from-one-server-to-another-manual.178540/

Restore the SQL db:

CLIENTOPT='--max_allowed_packet=256M --net_buffer_length=65536'
mysql $CLIENTOPT dbname < /home/backupsql/dbname.sql

More info: https://community.centminmod.com/threads/centmin-mod-site-data-migration-guide.10382/

Since the file is probaly gzip'd, you can first do gunzip dbname.sql.gz.

MySQL:

Basic commands: https://xenforo.com/community/threads/increasing-the-150-character-thread-title-limit.215208/

mysql
SHOW DATABASES;
use database_name;
SHOW TABLES;
SHOW COLUMNS FROM xf_thread;
ALTER TABLE `xf_node` MODIFY title varchar(100), MODIFY node_name varchar(100);
ALTER TABLE `xf_thread` MODIFY title varchar(300);

SHOW VARIABLES LIKE 'ft_min_word_len';

Change minimum search length (default 4 characters minimum): https://xenforo.com/community/threads/change-minimum-search-keyword.153405/post-1655953

Clear bounce log https://xenforo.com/community/threads/any-way-to-clear-the-email-bounce-log.159473/

SHOW COLUMNS FROM xf_email_bounce_log;
SELECT * FROM xf_email_bounce_log; - too big; just gibberish.

TRUNCATE `database_name`.`xf_email_bounce_log`;

MariaDB:

"Unless you're a DBA or otherwise managing a huge database, the differences between MySQL and MariaDB are so trivial that it's not worth worrying about which one the control panel defaults to." https://www.theadminzone.com/threads/im-not-seeing-any-newbie-guides-or-comparisons-how-is-a-complete-novice-supposed-to-decide-on-software-server-etc.154985/#post-1181527

Updating is easy https://community.centminmod.com/threads/mariadb-10-1-upgrades-to-mariadb-10-2-10-3-and-10-4.17793/#post-75214

Altered (date format) Centmin code:

mysqldump -Q -K --max_allowed_packet=256M --net_buffer_length=65536 --routines --events --triggers --hex-blob --all-databases > /home/mysql-all-databases-backup-$(date +"%Y-%m-%d--%H-%M-%S").sql

Addons:

Misc info & customization:

Your website is located at /home/nginx/domains/forum.mysite.com/public

ngxrestart fpmrestart (php) memcachedrestart


Social cards/previews/thumbnails:

Themes/styles:

CSS and more:

A basic tutorial of how to customize with CSS:
F12 to open the developer console of your browser. Click the "element picker" on the left side. Click on the part of the page you want to customize and look through the CSS code. Copy/edit it and put in your extra.less file.

For macOS: In your Safari menu bar click Safari > Preferences & then select the Advanced tab. Select: "Show Develop menu in the menu bar". Now you can click Develop in your menu bar and choose Show Web Inspector. You can also right-click and press "Inspect element".

Font size:

Most of the style changes will go in "appearance -> styles -> templates -> extra.less". You can see below what mine currently has.

Customizations I used

See it in action!

Themes/Styles:

Template modifications:

extra.less:

Here's what mine currently has (for the default-grey style):

With the default font (Segoe UI):
/* Border between sticky/normal threads */
.structItemContainer-group--sticky {
    border-bottom: 7px solid;
    color: xf-diminish(@xf-borderColor, 6%);
}


.structItemContainer-group--sticky {
      background-color: @xf-paletteColor1;
}

.structItemContainer-group--sticky .structItem-title a:link,
.structItemContainer-group--sticky .structItem-title a:visited {
    color: @xf-paletteColor4;
}


/* limit the size of images in posts and conversations */

.message .messageContent .messageText img {
max-width: 50%;
}

/* limit the size of images in threads */

.message-body img
{
max-width: 50% !important;
}

/* Underline links */
/* Can use a.link--internal */
a.link
{
    text-decoration: underline;
}

/* remove node stats */
.node-stats {
    display: none;
    }

/* Font size of node stats 

.node-stats dd {
    font-size: 15px;
    }
*/

/* Font size of node titles */

.node-title {
  margin: 0;
  padding: 0;
  font-size: 16px;
  font-weight: 400;
}

/* Size of node avatars */

.node-extra {
.avatar img:not(.cropImage) {
  text-indent: 100%;
  overflow: hidden;
  white-space: nowrap;
  word-wrap: normal;
  display: block;
  border-radius: inherit;
  width: 70%;
  height: 70%;
}
}

/* Font size of thread titles outside the thread */

.structItem-title {
  font-size: 15px;
  font-weight: 600;
  margin: 0;
  padding: 0;
}

/* Font size of thread titles within the thread */

.p-title-value {
  padding: 0;
  margin: 0 0 5px 0;
    margin-right: 0px;
  font-size: 16px;
  font-weight: 550;
  min-width: 0;
  margin-right: auto;
}

/* Remove custom thread field */

.message-fields:last-child {
.pairs.pairs--columns {
  display: none;
}
}

/* Editor toolbar button icon styling */

[data-cmd="clearFormatting"]
{
color: red !important;
}

[data-cmd="bold"]
{
color: #000099 !important;
}

[data-cmd="fontSize"]
{
color: green !important;
}

[data-cmd="strikeThrough"]
{
color: black !important;
}

[data-cmd="paragraphFormat"]
{
color: #bc6103 !important;
}

[data-cmd="xfList"]
{
color: #00b3b3 !important;
}

[data-cmd="insertLink"]
{
color: #3A0FFF !important;
}

[data-cmd="xfQuote"]
{
color: #7e4002 !important;
}

[data-cmd="xfInlineSpoiler"]
{
color: cadetblue !important;
}

[data-cmd="xfSpoiler"]
{
color: #8ac7db !important;
}

[data-cmd="undo"]
{
color: brown !important;
}

[data-cmd="redo"]
{
color: brown !important;
}

[data-cmd="textColor"]
{
color: purple !important;
}

[data-cmd="insertImage"]
{
color: cadetblue !important;
}

[data-cmd="xfMedia"]
{
color: #008AD8 !important;
}

[data-cmd="insertVideo"]
{
color: #008AD8 !important;
}
/* End editor toolbar button icon styling */

/* Format of node descriptions when viewing threads */
.p-description {
  margin: 5px 0 0;
  padding: 0;
  font-size: 13px;
  color: #1a1a1a;
}
After changing to Verdana and decreasing font sizes in Appearance > Style properties > Typography:
/* Border between sticky/normal threads */
.structItemContainer-group--sticky {
    border-bottom: 7px solid;
    color: xf-diminish(@xf-borderColor, 6%);
}


.structItemContainer-group--sticky {
      background-color: @xf-paletteColor1;
}

.structItemContainer-group--sticky .structItem-title a:link,
.structItemContainer-group--sticky .structItem-title a:visited {
    color: @xf-paletteColor4;
}


/* limit the size of images in posts and conversations */
.message .messageContent .messageText img {
max-width: 50%;
}

/* limit the size of images in threads */
.message-body img
{
max-width: 50% !important;
}

/* Underline links */
/* Can use a.link--internal */
a.link
{
    text-decoration: underline;
}

/* remove node stats */
.node-stats {
  display: none;
}
.node-meta {
  display: none;
}

/* Font size of node stats
.node-stats dd {
    font-size: 14px;
    }
 */

/* Font size of node titles */
.node-title {
  margin: 0;
  padding: 0;
  font-size: 14px;
  font-weight: 400;
}

/* Size of node avatars */
.node-extra {
.avatar img:not(.cropImage) {
  text-indent: 100%;
  overflow: hidden;
  white-space: nowrap;
  word-wrap: normal;
  display: block;
  border-radius: inherit;
  width: 70%;
  height: 70%;
}
}

/* Size of nodes */


/* Font size of thread titles outside the thread */
.structItem-title {
  font-size: 15px;
}


/* Font size of thread titles within the thread */
.p-title-value {
  font-size: 18px;
}

/* Font size of prefix list */
.scPrefixList {
.label {
font-size: 90%;
}
}

/* Remove custom thread field */
.message-fields:last-child {
.pairs.pairs--columns {
  display: none;
}
}

/* Editor toolbar button icon styling */

.fr-btn.fr-active:not(.fr-disabled)
{
    background-color: @xf-pageBg;
}

[data-cmd="clearFormatting"]
{
color: red !important;
}

[data-cmd="bold"]
{
color: #000099 !important;
}

[data-cmd="fontSize"]
{
color: green !important;
}

[data-cmd="strikeThrough"]
{
color: black !important;
}

[data-cmd="paragraphFormat"]
{
color: #bc6103 !important;
}

[data-cmd="xfList"]
{
color: #00b3b3 !important;
}

[data-cmd="formatUL"]
{
color: #00b3b3 !important;
}

[data-cmd="insertLink"]
{
color: #3A0FFF !important;
}

[data-cmd="xfQuote"]
{
color: #7e4002 !important;
}

[data-cmd="xfInlineSpoiler"]
{
color: cadetblue !important;
}

[data-cmd="xfSpoiler"]
{
color: #8ac7db !important;
}

[data-cmd="undo"]
{
color: brown !important;
}

[data-cmd="redo"]
{
color: brown !important;
}

[data-cmd="textColor"]
{
color: purple !important;
}

[data-cmd="insertImage"]
{
color: cadetblue !important;
}

[data-cmd="xfMedia"]
{
color: #008AD8 !important;
}

[data-cmd="insertVideo"]
{
color: #008AD8 !important;
}

/* End editor toolbar button icon styling */

/* Format of node descriptions when viewing threads */
.p-description {
  color: #1a1a1a;
}

/* Inline code from 80% to 100% */
.bbCodeInline {
  font-size: 100%;
}

/* size and spacing of user info in threads */
.pairs.pairs--justified > dt {
  float: left;
  max-width: 100%;
  margin-right: 1px;
}
.message-cell {
  display: block;
  vertical-align: top;
  padding: 5px;
}
/*
.message-userExtras {
  font-size: 11px;
}
 */


setup.less:

Other:

Addons:

To do:

Click to expand signatures https://xenforo.com/community/threads/how-to-only-show-one-line-of-signature-behind-a-click-to-expand-button-for-multi-line-signatures.215263/

Display character limit/count https://xenforo.com/community/threads/display-post-character-limit.196477/

Moderating:

Moderate new users:

Moving threads to a new forum can change/kill the old URL. But I did it by "selecting all" within the thread. If you select the thread in the thread/forum view then "move thread" it gives you different options regarding "redirects". I chose the first/default "Do not leave a redirect" and it didn't change the URL at all.

"Leave a permanent redirect" leaves a "ghost thread" where the original one was. The "ghost thread" has a new URL. The moved thread in the new location has the old URL.

You can move single comments/posts without killing the URL, but when I did that (with both "copy" & "move") it moved it to the top position (OP) instead of the bottom, and there was no option to set the position. So it turned a comment into an OP thread, and turned the previous OP into a comment. https://xenforo.com/community/threads/can-you-append-moved-posts-onto-a-thread-rather-than-place-them-in-chronological-order.212610/

Maybe a bug, but I moved a thread to a private "moderator" forum and the original link still exists for normal users to view, but when they click on it it doesn't work.

I'd strongly recommend setting up one or more private testing subforums where you can move/copy/experiment beforehand with test posts to see exactly what will happen.

Allowing banned users to access appeals: https://xenforo.com/community/threads/can-i-give-banned-users-access-to-support-thread-node-only.219248/

Regex: Using regex for spam matching https://xenforo.com/community/threads/spam-phrases-could-also-inspect-thread-title-for-matches.137468/post-1286655

Discourage system: https://www.youtube.com/watch?v=3ubbZa4J2tQ?t=28m

Other forum options:

Paid vs free discussion https://www.theadminzone.com/threads/new-forum-with-phpbb-instead-of-xenforo.155215/post-1184911

phpBB:

https://www.phpbb.com/ - free & open source. Seems very customizable. Should be able to do 300 char titles.

Used by VLC https://forum.videolan.org/ and https://forums.blurbusters.com/ - I like it but I don't see tags.

"Wasn't phpBB infamous for its never-ending parade of security flaws?" https://web.archive.org/web/20230609230406/https://old.reddit.com/r/RedditAlternatives/comments/14536mi/my_alternative_back_to_web_forums/ - https://archive.ph/ZdWNw#selection-4033.13-4033.14

Topic tags: https://www.phpbb.com/customise/db/extension/rh_topic_tags/

An extension to add flair to user profiles https://github.com/TheVilleOrg/phpbb-flair

Discourse:

https://www.discourse.org/ - Titles can be of an unlimited length https://meta.discourse.org/t/is-there-a-way-to-limit-max-and-min-no-of-characters-allowed-for-topic-replies/78043

The tag system seems nice https://meta.discourse.org/tag/moderation. But the overall navigation menu/ability seems poor. Though from the rotating screenshot examples here https://www.discourse.org/ it seems like "categories" may be the answer.

One of the main appeals seems to be the built-in restrictions on new accounts to limit spam?

1-click install on digitalocean https://marketplace.digitalocean.com/apps/discourse

Discourse vs phpBB: https://www.slant.co/versus/2789/17561/~discourse_vs_phpbb

Now federated with ActivityPub Plugin https://meta.discourse.org/t/activitypub-plugin/266794/117

nodeBB:

https://community.nodebb.org/topic/10827/why-i-chose-to-use-nodebb-over-phpbb-discourse-mybb-and-other-forums

Flarum:

Ranked #1 on this site https://www.slant.co/topics/898/viewpoints/7/~best-web-forum-software-packages~flarum - doesn't look that good.

SMF:

https://simplemachines.org/ Looks nice, similar to phpBB. Doesn't look like it has tags/flair built-in, but there are some mods for it:

WordPress forum plugins:

https://www.wpbeginner.com/plugins/5-best-forum-plugins-for-wordpress/ - was recommended over using vBulletin. Someone else said vBulletin 3.x is better and WordPress is majorly insecure.

Paid:

Invision & Xenforo seem to be the two main options https://www.theadminzone.com/threads/which-forum-software-is-the-best.147142/.

IPB/Invision $50-90/mo https://invisioncommunity.com/buy - used by https://www.ibspatient.org/community/forum/ and https://linustechtips.com.

Issues with Invision: https://xenforo.com/community/threads/bring-xenforo-to-the-fediverse.215471/post-1643471

Starting off more greedy than Reddit ended up after 10+ years https://xenforo.com/community/threads/bring-xenforo-to-the-fediverse.215471/page-3#post-1644349

Xenforo $60/mo https://xenforo.com/purchase/ + https://www.themehouse.com/ - used by overclock.net and more. XenForo wins the vote: https://www.theadminzone.com/threads/which-forum-software-is-the-best.147142/

Those are the costs for them to host the forum for you. Alterntaively, you can purchase their software and install it on your own server (as I did above) and the costs will be much less if you have a small-medium forum. My understanding is that IPB offers a "full suite" and charges more, and Xenforo lets you leave out the options you don't need and thus is cheaper for most people.

Finding forums:

The network effect of Reddit and similar sites is valuable, and probably a large reason why they've grown so big. The convenience of having everything on one site with a single login is not trivial. Obviously, that comes with major downsides as well. Twitter, Facebook, Instagram, Youtube, and Reddit have all demonstrated the benefits & detriments of this.

I wrote on this blog about how search engines have an important role to play in breaking up the dependency people have on Reddit. There is a search engine dedicated to forums though -- board reader. It seems like a pretty good alternative to using "search query reddit".

Perhaps a Lemmy-like front end could be created to connect forums; making a forum-equivalent of Reddit. Discourse is implementing federation for their forums so they integrate with Mastodon, etc.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment