Everything posted by Ernest Defoe
-
Social Groups for Flarum — support and discussion
@"flavour1"#p451 I'm not near my Mac now so no I don't have access to a Webkit based browser.
-
Social Groups for Flarum — support and discussion
@"flavour1"#p449 Tell me what all issues you are having? I'm not sure why you are getting that error on Shattered Pact that is a public group. Tell me what it says when you go into the Mac version of Console. It's like option, command, and I or something like that. If I was at my Mac i could tell you.
-
Role Play — support and discussion
Role-Play for FlarumPlay a character, post in-character, and run a card-based tactical game — right inside your Flarum discussions. Role-Play turns an ordinary Flarum forum into a home for tabletop-style play. Members create characters, write posts as those characters, and storytellers can run full turn-based combat encounters — with dice, cards, initiative and live HP bars — without anyone leaving the thread. It touches no core tables (everything lives in its own rp_* tables) and is free and MIT-licensed. Three features, one extension🎭 CharactersMembers manage their cast at /characters ("My Characters" in the account menu): a name, an accent colour, an optional avatar and bio. Characters are yours; archive them any time and their old posts keep their identity. 💬 Post in-characterWhen replying, pick "Post as …" in the composer and your reply is authored as that character — its coloured badge and name replace your own, with a quiet "Played by you" underneath so nothing is hidden. Perfect for narrative threads where several people each speak as their characters. ⚔️ A tactical card gameThis is where Role-Play goes further than any other Flarum RP add-on. Build a deck of cards, then run encounters — turn-based fights that play out live in the discussion sidebar. The deck builderAt /deck ("My Deck" in the account menu) each member crafts cards — abilities, items, spells and enemies — each with dice formulas the game engine actually rolls: Attack roll (e.g. 1d20+5) — checked against the target's defense Damage roll (e.g. 3d6) — applied on a hit, doubled on a natural-max crit Optional defense, HP, cost, a Font Awesome icon, and a description Mark a card public to share it into everyone's deck Dice expressions are validated server-side — a malformed formula is rejected, never silently ignored. Running an encounterAny member can start an encounter inside a discussion and becomes its storyteller (GM). From the tracker in the sidebar you: Build the field — add party members and foes by hand, spawn a foe straight from an enemy card (its HP and defense seed automatically), and let players join with one of their own characters. Roll initiative & start — every combatant rolls 1d20 + agility; the tracker sorts them into turn order. Play it out — on each turn the active combatant plays a card at a target. The engine rolls to-hit vs. defense, rolls damage on a hit (×2 on a crit), and updates HP. A rolling action log narrates every play — hits, misses and crits. Advance until one side is down — a Victory / Defeat banner appears, and the GM ends the encounter. The tracker shows the initiative order, colour-coded HP bars (green party / red foes), the active turn, and adapts its controls to who's looking — the GM drives the fight; a player only acts on their own character's turn. Live for the whole tableWhen flarum/realtime is installed, every play, turn and HP change is broadcast over WebSocket — the whole table sees the fight update instantly, no refresh. Without realtime, the tracker falls back to a lightweight poll, so it still stays in sync. Installation php flarum cache:clear``` That's it — the six `rp_*` tables are created automatically on enable. Then: * Members find **My Characters** and **My Deck** in their account menu. * Anyone can start an encounter from a discussion's sidebar. * For instant multi-viewer combat, install and configure **flarum/realtime** (optional). ### Requirements * Flarum **2.0+** * PHP 8.1+ * *(Optional)* flarum/realtime for live updates --- ## How the dice work The engine (`src/Game.php`) is a small, pure core: | Step | Rule | |------|------| | **Dice** | Any `XdY+Z` expression, e.g. `2d6+1`, `1d20`, `3d8-2` | | **Initiative** | `1d20 + agility`, highest goes first | | **To-hit** | Attack total ≥ target defense (defense `0` = always hits) | | **Crit** | A natural maximum on any attack die → **double damage** | | **Down** | A combatant at `0` HP is out; turns skip them | --- ## Building from source The PHP runs as-is; the front-end compiles with the Flarum webpack toolchain: ```cd js npm install npm run build``` --- ## License [MIT](https://github.com/ernestdefoe/roleplay/blob/master/LICENSE) © Ernest Defoe. Free to use, fork and build on.
-
Advanced Cookie Consent — support and discussion
Advanced Cookie ConsentA GDPR / ePrivacy-style cookie consent extension for Flarum 2. Free and MIT-licensed. Shows a clean cookie notice with Accept / Reject / Customize, and a granular Privacy Settings dialog with consent categories and a per-service transparency view — and, crucially, it can gate third-party scripts so they only load after consent. FeaturesCookie notice banner (bottom bar, corner box, or centered) with Accept, Reject and Customize, plus your Privacy Notice link. Granular Privacy Settings modal — per-category toggles (Necessary is always on) with expandable detail, plus a Services tab listing the third-party services and cookies in each category. Script gating — two ways to ensure tags only run after consent: Paste scripts per category in the admin panel; they load when that category is accepted. Mark any script on the page as <script type="text/plain" data-cc-category="marketing">…</script> and it activates on consent. Admin-defined categories (rename, add, remove, mark required) — defaults: Necessary, Performance, Functional, Marketing. Consent versioning — bump the version to re-prompt everyone when your policy changes. Do Not Track / Global Privacy Control — optionally auto-reject non-essential categories when the browser sends an opt-out signal. Fully stylable — layout (bottom bar / corner box / centered), light / dark / auto theme, custom accent colour, box width and corner radius, so it fits any site and screen size. Reopen anytime — a "Cookie settings" link, plus a JS API so a theme can place its own trigger. Fully translatable; consent is stored locally (no personal data leaves the browser). Screenshots| Cookie notice | Privacy settings | | --- | --- | | | | Fully stylable so it fits any forum — choose the layout (bottom bar / corner box / centered), a light/dark/auto theme, your own accent colour, box width and corner radius: JavaScript API window.cookieConsent.accepted('marketing'); // boolean window.cookieConsent.onChange((c) => { /* … */ }); window.cookieConsent.acceptAll(); window.cookieConsent.rejectAll();``` ## Installation ```composer require ernestdefoe/advanced-cookie-consent php flarum cache:clear``` Then open **Admin → Advanced Cookie Consent** to set your text, categories and scripts. ## License [MIT](https://github.com/ernestdefoe/advanced-cookie-consent/blob/main/LICENSE)
-
Projects — support and discussion
ProjectsA flexible user projects extension for Flarum 2 — a showcase page for creator communities. Members publish "projects" (books, games, apps, art, mods, anything) as cards on a dedicated page, with rich, admin-configurable metadata. Inspired by this community request. Free and MIT-licensed. FeaturesProject cards with an optional cover image, author, categories, key parameters, a short description and link buttons — on a dedicated /projects page. Search & filters — full-text search, category filter and sort (recent / most-liked / A–Z), plus an Add project button. Admin-defined categories with an icon and accent colour. A project's main category becomes a badge shown next to the author's name across the forum. Custom parameters — define your own typed fields (text, paragraph, number, date, URL, select, yes/no) such as Genre, Age rating or Release date. Choose which show on the card. Flexible link/button system — define button slots, optionally restricted to specific domains (e.g. only YouTube links), with default or custom labels. Example for a book: Read Excerpt, Buy, Discuss on Forum. Optional moderation — projects can publish instantly or wait for approval, controlled per-group by the Publish without moderation permission. Detail page with forum-formatted content, all parameters and link buttons; link a forum discussion for comments. Built-in likes on every project. Profile integration — a Projects tab on each member's profile, plus a featured-project badge (their main category's icon, with the project name on hover) next to their username everywhere. FoF Badges integration (optional) — award a badge when a member's project is first published. Screenshots| Browse page | Project detail | | --- | --- | | | | | Submission form | Admin configuration | | --- | --- | | | | Permissions| Permission | Default | | --- | --- | | Create projects | Members | | Publish without moderation | — (admins/mods always can) | | Moderate projects | Moderators | Installation php flarum migrate php flarum cache:clear``` Then open **Admin → Projects** to add categories, custom parameters and button slots. ## License [MIT](https://github.com/ernestdefoe/projects/blob/main/LICENSE)
-
Social Groups for Flarum — support and discussion
@flavour1 try this new update and see if your issues are fixed please. Report back what isn't working as it should so it can be fixed. Thank you for reporting the problems you were having. Sorry the fix took so long to get done.
-
Social Groups for Flarum — support and discussion
@"flavour1"#p424 Will look at this this weekend. Sorry for the delay. On the issue of embedded items I didn't include this in the build but will look into adding it. I'll try to get this update done this weekend. @"Claude_Bot"#10 add these issues to be looked into please. Social Groups version v2.3.67 Flarum version 2.0.0-rc.3 restricted permission for non logged-in visitors now works as expected. when trying to open the /groups/… url, I get a error message: "Failed to load group." and still an error modal "The requested resource was not found." which could be removed, as it is no error, but intended). Unfortuantely there are still some bugs that prevent the extension from being usable: - The SGFeed-composer area is not dynamic, so when i paste some content that fills up the space, I can not edit it anymore. - I still see no composer formatting controls, except the buttons from fof/upload and fof/polls - I can not reply to posts: [Error] Failed to load resource: the server responded with a status of 403 () (social-group-posts, line 0) and error modal: "You do not have permission to do that." (reactions do work by the way) - When I type anything that should get embeded, like image links or urls, the embedd is not rendered when posting. Only a website reload displays it correctly. - I can not edit posts as an admin, only delete the (whole?) discussion - uploaded images (voa fof/upload) do not show in the SGMedia tab. - SGMedia-lightboxAuthor link opens a auto-generated discussion named gallery (gallery) – interestingly in there the FormControl SGThread-editTextarea works dynamically but editing and replying do not work: "Failed to save edit." "Error" "You do not have permission to do that."
-
Social Groups for Flarum — support and discussion
@"flavour1"#p415 Social Groups v2.3.66 when trying to reply to a group post, i get the error: "You do not have permission to do that" and in Safari Web Inspector: [Error] Failed to load resource: the server responded with a status of 403 () (social-group-posts, line 0) My Permissions for Social Groups in Admin settings are: Create Social Groups: Members Edit & delete any social group: Admins I see no further permission settins in the Admin > Permissions table for the Social Groups extension. All Discussions replies work as expected. (saved, show the composer). @"flavour1"#p416 loading the /groups url loads the site, despite not being logged in and everything is restricted for members only. I get a browser log: [Error] Failed to load resource: the server responded with a status of 401 () (social-group-members, line 0) - but the site still loads and shows all posts within groups. @Claude_Bot add these to be investigated and fixed.
-
Social Groups for Flarum — support and discussion
@Claude_Bot log this so it can be investigated and fixed. I'm experiencing some issues which I want to point out- hopefully there is a way for you to solve those: Despite not being logged-in flarum I can open and read the Group Discussions. Flarum permissions are set to allow only logged-in users to see discussions, so I would expect that to be congruent. I actually get an error when I open a Group '{"errors":[{"status":"401","code":"not_authenticated"}]}' but it still renders the full discussion. (I'm on macOS with Safari) I can not reply to any group posts '{"data":[],"included":[],"meta":{"page":{"total":0,"offset":0,"limit":20}},"links":[],"jsonapi":{"version":"1.1"}}' I do not see the TextEditor-controls Composer-footer, so I can not format any posts within Groups.
-
Social Groups for Flarum — support and discussion
@"Claude_Bot"#p411 This post #8/p18
-
Social Groups for Flarum — support and discussion
@Claude_Bot log them so they can be investigated and fixed.
-
Social Groups for Flarum — support and discussion
@Claude_Bot Despite not being logged-in flarum I can open and read the Group Discussions. Flarum permissions are set to allow only logged-in users to see discussions, so I would expect that to be congruent. I actually get an error when I open a Group '{"errors":[{"status":"401","code":"not_authenticated"}]}' but it still renders the full discussion. (I'm on macOS with Safari) I can not reply to any group posts '{"data":[],"included":[],"meta":{"page":{"total":0,"offset":0,"limit":20}},"links":[],"jsonapi":{"version":"1.1"}}' I do not see the TextEditor-controls Composer-footer, so I can not format any posts within Groups.
-
Social Groups for Flarum — support and discussion
@Claude_Bot please add the above concerns @flavour1 posted about so they can be fixed.
-
Social Groups for Flarum — support and discussion
@"flavour1"#p404 yes please keep doing further testing. Yes I will get these issues fixed as soon as I have a moment to do so.
-
OnAir+ — support and discussion
OnAir+ — Live Streaming for Flarum 2 Bring live video into your community. Members go live from YouTube or Twitch, and a LIVE NOW badge follows their avatar everywhere it appears — posts, the discussion list, mentions, the header, the sidebar. Free / MIT. The optional premium add-on OnAir+ turns your forum into the whole platform — a built-in RTMP server (stream straight in from OBS), in‑forum HLS playback, multistream, VOD, live chat, go‑live notifications and scheduled streams. See the comparison below. Features🔴 LIVE badge on every avatar — one Avatar override lights a streamer up everywhere. ▶️ YouTube + Twitch embed viewer — paste a channel/video URL and go live. 📡 Presence with graceful fallback — uses flarum/realtime for instant badge updates when installed, transparently falls back to lightweight polling when it isn't. 🟥 Live Now widget + a /onair directory — see who's streaming at a glance. 🔐 Permissions + admin settings — who can go live, default provider, poll interval. ⏱️ Stale‑stream reaper — auto‑ends streams left running. The Live directory OnAir vs OnAir+OnAir (this extension) is free and complete on its own for YouTube/Twitch streamers. OnAir+ is a paid add‑on for communities that want to host streaming themselves. | | OnAir (free) | OnAir+ | |---|:---:|:---:| | LIVE badge on avatar, everywhere | ✅ | ✅ | | Live Now widget + /onair directory | ✅ | ✅ | | YouTube embed viewer | ✅ | ✅ | | Twitch embed viewer | ✅ | ✅ | | Realtime presence + polling fallback | ✅ | ✅ | | Permissions + admin settings | ✅ | ✅ | | Auto‑end stale streams | ✅ | ✅ | | Built‑in RTMP server → in‑forum HLS | — | ✅ | | Stream keys + creator studio | — | ✅ | | Multistream / restream to YouTube + Twitch | — | ✅ | | VOD recordings | — | ✅ | | Live chat overlay | — | ✅ | | Go‑live notifications + follow a streamer | — | ✅ | | Scheduled streams + reminders | — | ✅ | | Concurrent viewer counts | — | ✅ | OnAir+ — stream straight into the forumMembers broadcast from OBS to your own server; viewers watch an hls.js player inline, with live chat beside it. OnAir+ — creator studioEach streamer gets an ingest URL, a secret stream key, multistream targets, and a one‑click key reset. Installcomposer require ernestdefoe/onair Then enable OnAir in the admin panel. Optionally install flarum/realtime for instant (push) LIVE badges — OnAir detects it automatically. For self‑hosted streaming, add OnAir+ (composer require ernestdefoe/onair-pro). Development npm install npm run build # or: npm run dev (watch)``` A no‑backend concept render of the whole product lives in `preview/index.html`. ## Architecture notes * **LIVE badge:** overrides the shared `Avatar` component (main‑bundle, safe to extend at init) and reads a serializer‑supplied `user.isLive()`. * **Presence transport:** `app.onair.presence` picks `RealtimeTransport` when `flarum/realtime` is detected, else `PollingTransport`; both expose the same API. * **Providers:** `app.onair.providers` (JS) + the `StreamProvider` interface (PHP) are the extension points **OnAir+** plugs its RTMP/HLS provider into. ## License MIT © Ernestdefoe
-
OnAir for Flarum 2 — support and discussion
OnAir — Live Streaming for Flarum 2 Bring live video into your community. Members go live from YouTube or Twitch, and a LIVE NOW badge follows their avatar everywhere it appears — posts, the discussion list, mentions, the header, the sidebar. Free / MIT. The optional premium add-on OnAir+ turns your forum into the whole platform — a built-in RTMP server (stream straight in from OBS), in‑forum HLS playback, multistream, VOD, live chat, go‑live notifications and scheduled streams. See the comparison below. Features🔴 LIVE badge on every avatar — one Avatar override lights a streamer up everywhere. ▶️ YouTube + Twitch embed viewer — paste a channel/video URL and go live. 📡 Presence with graceful fallback — uses flarum/realtime for instant badge updates when installed, transparently falls back to lightweight polling when it isn't. 🟥 Live Now widget + a /onair directory — see who's streaming at a glance. 🔐 Permissions + admin settings — who can go live, default provider, poll interval. ⏱️ Stale‑stream reaper — auto‑ends streams left running. The Live directory OnAir vs OnAir+OnAir (this extension) is free and complete on its own for YouTube/Twitch streamers. OnAir+ is a paid add‑on for communities that want to host streaming themselves. | | OnAir (free) | OnAir+ | |---|:---:|:---:| | LIVE badge on avatar, everywhere | ✅ | ✅ | | Live Now widget + /onair directory | ✅ | ✅ | | YouTube embed viewer | ✅ | ✅ | | Twitch embed viewer | ✅ | ✅ | | Realtime presence + polling fallback | ✅ | ✅ | | Permissions + admin settings | ✅ | ✅ | | Auto‑end stale streams | ✅ | ✅ | | Built‑in RTMP server → in‑forum HLS | — | ✅ | | Stream keys + creator studio | — | ✅ | | Multistream / restream to YouTube + Twitch | — | ✅ | | VOD recordings | — | ✅ | | Live chat overlay | — | ✅ | | Go‑live notifications + follow a streamer | — | ✅ | | Scheduled streams + reminders | — | ✅ | | Concurrent viewer counts | — | ✅ | OnAir+ — stream straight into the forumMembers broadcast from OBS to your own server; viewers watch an hls.js player inline, with live chat beside it. OnAir+ — creator studioEach streamer gets an ingest URL, a secret stream key, multistream targets, and a one‑click key reset. Installcomposer require ernestdefoe/onair Then enable OnAir in the admin panel. Optionally install flarum/realtime for instant (push) LIVE badges — OnAir detects it automatically. For self‑hosted streaming, add OnAir+ (composer require ernestdefoe/onair-pro). Development npm install npm run build # or: npm run dev (watch)``` A no‑backend concept render of the whole product lives in `preview/index.html`. ## Architecture notes * **LIVE badge:** overrides the shared `Avatar` component (main‑bundle, safe to extend at init) and reads a serializer‑supplied `user.isLive()`. * **Presence transport:** `app.onair.presence` picks `RealtimeTransport` when `flarum/realtime` is detected, else `PollingTransport`; both expose the same API. * **Providers:** `app.onair.providers` (JS) + the `StreamProvider` interface (PHP) are the extension points **OnAir+** plugs its RTMP/HLS provider into. ## License MIT © Ernestdefoe
-
AI Assistant — mention @Claude_Bot for help
@Claude_Bot tell everyone what you are now able to do and how you can provide better support with your new update.
-
AI Assistant — mention @Claude_Bot for help
I am working on an update to the AI Helper here that when you ask it a question about any of my themes or extensions it will read all available information on it from Github and will give you a more accurate answer to your question instead of just relying on forum posts etc to get the answers. What this means is it will be more robust and answers that will actually be correct or closer to correct. Basically I am trying to make the Helper smarter so you get better answers to support questions and when reporting a bug it will give you better guidance.
-
Google Fonts — support and discussion
Google Fonts for Flarum Use any Google Font on your Flarum 2 forum. Pick a body font and a heading font from the full Google Fonts library — applied site-wide, with a live preview right in the admin panel. Features🔎 Searchable picker for a curated list of popular Google Fonts, in the admin settings — and you can type/paste any Google Font family name, even ones not in the list. ✍️ Separate body and heading fonts, so you can pair (e.g.) Inter body text with Playfair Display headings. 👀 Live preview of each font directly in the admin panel. ⚡ Server-side injection of the Google Fonts stylesheet into the page <head> — no flash of unstyled text, no client round-trip. 🪶 No configuration files, no API key required. Installationcomposer require ernestdefoe/google-fonts Then enable Google Fonts in your admin panel. UsageGo to Admin → Google Fonts. Set a Body font and (optionally) a Heading font. Start typing to search, or paste an exact family name from fonts.google.com. Click Save. The fonts apply to your forum immediately. Leave a field blank to fall back to your theme's default font. Updating php flarum cache:clear``` ## License [MIT](https://github.com/ernestdefoe/google-fonts/blob/main/LICENSE)
-
Mobile Tab — support and discussion
@"Maxim"#3 it looks just like the other the biggest difference is that you can customize the items at the bottom including user your site logo/favicon as the center of the tab. I will include a screenshot of the admin settings. [upl-image-preview uuid=6f5231ff-6805-4861-9483-e61396bfd5a5 url=https://ernestdefoe.online/assets/files/2026-06-07/1780794328-520336-screenshot-2026-06-06-200517.png alt=screenshot-2026-06-06-200517.png thumbnail_url=https://ernestdefoe.online/assets/files/2026-06-07/1780794328-520336-screenshot-2026-06-06-200517.png] [upl-image-preview uuid=40ee8063-0546-4c76-baa8-251f130e84f8 url=https://ernestdefoe.online/assets/files/2026-06-07/1780794458-758376-screenshot-2026-06-06-200719.png alt=screenshot-2026-06-06-200719.png thumbnail_url=https://ernestdefoe.online/assets/files/2026-06-07/1780794458-758376-screenshot-2026-06-06-200719.png]
- Add integration for Giveaways for Digest Mail
-
Giveaway — support and discussion
Giveaways Run provably-fair giveaways on your Flarum community. Members enter with one click, earn bonus entries for being active, and winners are drawn automatically — with a published seed and entrant fingerprint anyone can verify. Features🎁 Beautiful giveaways page — a dedicated /giveaways page with cards, live countdowns, status badges and entrant counts. 🎟️ One-click entry — registered members enter instantly. The button shows their current entry count. ⭐ Earn-entries engine — grant a one-time bonus when entrants post in the community, rewarding real activity. 🗂️ Categories — organise giveaways into colour-coded categories with filter pills, badges and an inline manager. 🎯 Eligibility rules — optionally require a minimum post count or account age to enter. ⏱️ Scheduled auto-draw — set an end time and the winners are drawn automatically by the scheduler. Hosts can also draw now at any time. 🔔 Winner notifications — every winner gets an in-app alert linking straight to the giveaway. 🛡️ Provably fair — every draw publishes a random seed and a SHA-256 hash of the full entrant list, so the result is independently reproducible and tamper-evident. 🏆 Multiple winners — draw any number of weighted winners in a single fair pass. 🔐 Granular permissions — separate enter, create own, and manage all permissions. ScreenshotsGiveaway page — enter, requirements & live countdown Provably-fair results — published winners, seed & entrant hash Installationcomposer require ernestdefoe/giveaways Then enable Giveaways in your admin panel and review the permissions grid. Scheduled draws require Flarum's scheduler to be running. Add this to your server's crontab: * * * * * cd /path/to/flarum && php flarum schedule:run >> /dev/null 2>&1 Without it, giveaways won't auto-draw at their end time — but you can still draw manually from each giveaway page. Updating php flarum migrate php flarum cache:clear``` ## How the fair draw works When a giveaway is drawn: 1. The full entrant list is serialized in a fixed order (`userId:entries`, sorted by user id) and hashed with **SHA-256** — this is the **entrant hash**. 2. A random **seed** is generated. 3. For each winner slot *i*, the winner is chosen by `SHA-256(seed:i)` reduced over the weighted entry pool, removing each winner before the next pick. Because the seed and entrant hash are published on the giveaway page, anyone can re-run the algorithm and confirm the winners were not manipulated. ## Permissions | Permission | Default | Description | |---|---|---| | `giveaways.enter` | Members | Enter giveaways | | `giveaways.create` | Admins | Create and manage **own** giveaways | | `giveaways.manage` | Admins | Manage **all** giveaways | ## Settings * **Show a "Giveaways" link in the main navigation** — toggle the nav item. * **Navigation label** — customise the link text. ## License [MIT](https://github.com/ernestdefoe/giveaways/blob/main/LICENSE) © ernestdefoe
-
Mobile Tab — support and discussion
Mobile Tab BarA configurable mobile bottom tab bar for Flarum 2.x. On phones, a native-app-style bar is pinned to the bottom of the screen; on tablet and desktop it's hidden. Features🧱 Full custom tab editor — build the bar yourself in admin: add, remove, and reorder tabs. 🎛️ Per-tab settings — each tab has a type, a Font Awesome icon, a label, a visibility (everyone / logged-in / logged-out), and an optional raised flag (the lifted center button). 🧩 Tab types — Home, Tags, Search, Notifications, Profile (avatar menu), New discussion, Log in, Site logo, Favicon, or a custom link (internal route or external URL). 🖼️ Logo / favicon in the middle — drop a Site logo or Favicon tile anywhere, including the raised center slot. 🔢 Live unread badge on the Notifications tab, active-route highlighting, and a html.has-mobile-tab hook for themes that need to shift content above the bar. Leave the tab list empty to use the sensible default bar (Home · Tags · + · Notifications · Profile). Installation php flarum cache:clear``` Enable it in **Admin → Extensions**, then configure the bar under its settings. ## Configuring the bar Open the extension's settings page and use the **Bottom bar tabs** editor: 1. **Add tab** to append a row, or reorder with the ▲ ▼ arrows. 2. Pick a **type**, set an **icon** (e.g. `fas fa-home`) and **label**. 3. Choose **visibility** and tick **Raised** for the center action. 4. For **Custom link**, enter a path (`/tags/support`) or URL (`https://…`). 5. **Save Changes.** (Site logo / Favicon types pull your site image automatically.) ## Credits Originally created by [resofire](https://github.com/resofire). Rebranded and extended (configurable tab editor, logo/favicon slots) by [ernestdefoe](https://github.com/ernestdefoe), with full credit to the original author. ## License MIT — © ResofireV2 (original author).
-
Digest Mail — support and discussion
Digest EmailA Flarum extension that sends beautifully formatted digest emails to your forum members on a schedule they choose. Each email summarises what happened on your forum since the last digest — new discussions, active conversations, new members, leaderboard standings, badges earned, pick'em results, awards, and more — all in a clean, branded email that works in every major email client. What It DoesInstead of sending a notification every time something happens, Digest Mail sends one well-organised summary email per period. Members choose how often they want it — daily, weekly, or monthly — and can unsubscribe at any time with a single click. Admins control what goes in the email, when it sends, and how hard it works on the server. Email ContentEvery digest email is made up of sections. Some are always included, others only appear when the relevant extension is installed and enabled by the admin. Always includedFeatured Discussion An admin-pinned discussion displayed prominently at the top of every digest with a highlighted card, author avatar, and a button linking directly to the discussion. Set this to your most important current thread — announcements, pinned rules, ongoing events. Leave it blank to disable it. New Discussions Discussions that were started during the digest period, showing the title, author, and reply count. Active Discussions The most engaged discussions during the period, ranked by a configurable activity score that balances reply count and recency. The admin can tune how much weight each factor carries. Unread Discussions Personalised to each recipient — shows discussions they have not read yet, based on their own read history. This is the only section that differs between subscribers. New Members Members who joined during the period, shown with avatars and join date. Community Stats A four-number summary bar showing total posts, discussions, new members, and active users during the period. This always appears near the top of every email regardless of section order. Favorite Discussions The most liked or reacted-to discussions during the period. If fof/reactions is enabled, shows a per-emoji reaction breakdown. If only flarum/likes is installed, shows like counts. Requires at least one of those extensions to be active. Optional — require additional extensionsLeaderboard (requires huseyinfiliz/leaderboard) Shows the top point-earners for the period with a podium display for the top three, a full ranked table for positions four and beyond, movement indicators showing who moved up or down, and a "biggest mover" spotlight for whoever gained the most points during the period. Badges (requires fof/badges) Shows badges earned during the period — recent earners with their badges, the most-awarded badge of the period, and the rarest badge awarded. Pick'em (requires huseyinfiliz/pickem) Shows upcoming pick'em matches members can still vote on, recent match results, and the current pick'em leaderboard standings. Gamepedia (requires huseyinfiliz/gamepedia) Shows the most-discussed game pages from the period and newly added games. Awards (requires huseyinfiliz/awards) Shows active and upcoming awards — including name, description, voting deadline countdown, category list, vote totals, and current front-runners when live vote display is enabled on the award. Section OrderEvery section listed above can be reordered from the Digest Order tab in the admin panel. Use the arrows to set the sequence sections appear in each email. Only enabled sections appear in the list. The three core sections (Discussions, New Members, and Stats) are always shown regardless of order position. SchedulingHow timing worksYou set the time you want digests to go out — for example 8 a.m. — and the extension fires at that time in whichever timezone you select. You choose your own timezone, not the server's. A forum run by an admin in Chicago should be set to Central Time and set to 8 a.m., even if the server itself is physically located somewhere else entirely. Single hour vs send windowSingle hour: The extension dispatches one chunk of subscribers per scheduler run at the configured hour. For most small forums this means all subscribers are processed in one or two runs within the same minute. Send window: You set a start time and an end time — for example 2 a.m. to 5 a.m. — and the extension dispatches one chunk of subscribers per minute throughout that window. Each minute the scheduler fires, the next batch is processed and queued. Workers drain each batch in parallel as it arrives. This keeps server load low and steady instead of hitting everything at once. Recommended for forums with more than a few thousand subscribers. When the send window is active, the extension tracks its own progress automatically. Once all subscribers for a given frequency have been processed, it stops on its own — it does not keep running until the window closes. User frequency choicesEach user picks their own digest frequency from their account settings page: Daily — one email every day at the configured time Weekly — one email on the configured day of the week Monthly — one email on the configured day of the month Off — no digest emails Admins can restrict which frequencies are available. A low-traffic forum might choose to offer only weekly and monthly and hide the daily option entirely. The unsubscribe preference page shown to users automatically reflects whichever options the admin has enabled. Design and ThemesEvery email uses a table-based HTML layout that works reliably in all major email clients including Gmail, Outlook, Apple Mail, and mobile clients. The email uses your forum's configured brand colours throughout — headings, buttons, and accent elements all pull from your forum's primary and secondary colour settings automatically. Light and dark mode: If fof/nightmode is installed, each subscriber's email theme automatically matches their night mode preference — members who use dark mode receive a dark-themed email. Members who have not set a preference receive the light version. If night mode is not installed, all emails use the light theme. UnsubscribeEvery email includes a secure unsubscribe link in the footer. Clicking it takes the subscriber to a preference page where they can choose a different frequency or opt out entirely. The link is unique to each subscriber and valid for 90 days. Unlike some implementations, the link remains valid across multiple digest sends — it is only replaced when it expires or the subscriber uses it to change their preference. This means a user who receives a digest on Monday and clicks the link on Friday will always get a working page. Admin PanelThe admin panel is organised into four tabs. SettingsContent Limits — set the maximum number of items shown in each section: new discussions, active discussions, unread discussions, new members, leaderboard entries, badges, pick'em entries, and gamepedia entries. Also includes the featured discussion ID and the weighting controls for the hot score algorithm. Schedule — set your timezone, send time (start hour), optional send window end hour, weekly send day, and monthly send day. A live summary below the time dropdowns shows you exactly what mode you are in and when emails will go out. User Frequency Options — choose which frequency options are available to users on their account settings page. Extension Integrations — enable or disable each optional section individually. A toggle is only activatable when the required extension is installed and enabled in Flarum. Sections that are disabled here are removed from the digest entirely and do not appear in the Digest Order tab. Token Checker — paste any unsubscribe token to verify it is valid, see which user it belongs to, and confirm its expiry date. Useful for diagnosing unsubscribe link issues without sending an email. Digest OrderArrow-based ordering for all active sections. Changes save immediately and apply to all future digests. Sections that are not currently enabled are not shown here — enable them in the Settings tab first. StatisticsLive statistics pulled from your forum's database: Subscription Overview — total members, total digest subscribers, and the overall subscription rate as a percentage Subscribers by Frequency — how many subscribers are on each frequency, with a visual bar and a View button that slides open a paginated list of all subscribers for that frequency showing username, avatar, and last sent date Last Sent — the date and time each frequency was last sent Send History — one entry per frequency per day showing the total sent and skipped count. History is retained automatically: 30 daily entries, 52 weekly entries, and 24 monthly entries Server SettingsEverything related to how the extension uses your server, in one place. The page auto-detects your forum's installation path and generates ready-to-copy cron lines and config blocks using your actual server path. Queue Settings — queue name, chunk size (subscribers dispatched per scheduler run), job delay, and maximum retry attempts Cron Setup — tailored setup instructions for your chosen queue backend: Sync, Database Queue, or Redis/Valkey. Each tab shows only what is relevant to that setup, including retry and backoff behaviour, send window guidance, and optional two-phase pre-population for very large forums Recommended Settings by Forum Size — a reference table covering 100 members through 100,000+ with suggested chunk size, worker count, and send mode for each tier Test SendFrom the Settings tab, any admin can send a live digest email to any address immediately — without affecting any subscriber records or timestamps. Choose a frequency and an optional theme (light or dark), enter any email address, and click Send. Use this to check your email layout, branding, and content before your first scheduled send goes out. RequirementsCore requirementsPHP 8.1 or higher Flarum 2.0 or higher A working outbound mail configuration in your Flarum admin panel (SMTP, Mailgun, Postmark, etc.) A server cron job running schedule:run every minute — this is the standard Flarum scheduler requirement shared by many other extensions Queue driverBy default Flarum uses the sync queue driver, which processes jobs during the web request rather than in the background. This is fine for very small forums but causes problems as your subscriber list grows: | Subscribers | What happens on sync | |---|---| | Under \~50 | Fine — most servers handle it without issue | | 50–200 | Slow page responses, occasional timeouts | | 200+ | Regular timeouts, memory exhaustion on typical VPS hosting | | 500+ | Effectively broken — posts fail or appear to hang | Flarum 2.x has a database queue driver built into core — no extension install required. To enable it, add this to your config.php: 'driver' => 'database', ],``` For larger forums, Redis or Valkey with Laravel Horizon and Supervisor is the most scalable option. See the **Server Settings** page in the admin panel for full setup instructions tailored to your chosen approach. ### Optional integrations | Extension | What it enables | |---|---| | `huseyinfiliz/leaderboard` | Leaderboard section | | `fof/badges` | Badges section | | `huseyinfiliz/pickem` | Pick'em section | | `huseyinfiliz/gamepedia` | Gamepedia section | | `huseyinfiliz/awards` | Awards section | | `flarum/likes` | Favorite Discussions section | | `fof/reactions` | Per-emoji reaction breakdown in Favorite Discussions | | `fof/nightmode` | Per-user dark mode email theme | --- ## Installation ```composer require ernestdefoe/digest-mail php flarum migrate``` Then enable the extension in your Flarum admin panel. --- ## Cron Setup The only cron line required for all setups is the Flarum scheduler. Add it to your server's crontab by running `sudo crontab -u YOUR_WEB_USER -e`, replacing `YOUR_WEB_USER` with the user that owns your Flarum files. If you are unsure which user that is, run `ls -la /path/to/flarum` and check the owner column. Common values are: * **Ubuntu/Debian** with Nginx or Apache → `www-data` * **CentOS/RHEL** with Apache → `apache` * **CentOS/RHEL** with Nginx → `nginx` * **Shared hosting** → your hosting account username ```* * * * * cd /path/to/flarum && php flarum schedule:run >> /dev/null 2>&1``` **If you are using the sync driver**, that is the only line you need. **If you are using the database queue driver**, add a second line for the queue worker: ```* * * * * cd /path/to/flarum && php flarum queue:work --queue=digest,default --max-time=55 --tries=3 --backoff=30 >> /dev/null 2>&1``` `--queue=digest,default` processes digest jobs first, then other Flarum notifications. `--max-time=55` stops the worker cleanly before the next cron fires. Add one additional worker line per parallel worker for larger forums. **If you are using Redis or Valkey with Horizon and Supervisor**, the scheduler cron line is the only line you need. Do not add a `queue:work` cron line — Horizon is your persistent worker and runs continuously under Supervisor. Adding a `queue:work` cron on top would create competing workers. Adjust `user` to match the user that owns your Flarum files (`www-data`, `apache`, `nginx`, or your hosting account username depending on your setup). The **Server Settings** page in the admin panel generates ready-to-copy cron lines and config blocks using your actual server path and current Queue Settings values. ### Two-phase pre-population (50,000+ subscribers only) For very large forums, you can pre-populate the queue with jobs before the send window opens so workers have no construction overhead when they start. Add this cron line 10 minutes before your configured send window start. For example, if your window starts at 2 a.m., run this at 1:50 a.m.: ```50 1 * * * cd /path/to/flarum && php flarum digest:enqueue --frequency=daily --delay=600 >> /dev/null 2>&1``` The first number is the minute (50 = :50) and the second is the hour in 24-hour format (1 = 1 a.m.). Adjust both to match your setup. --- ## Console Commands ### `digest:send` The main send command. Runs automatically via the scheduler every minute. Outside the configured send window it exits immediately. Inside the window it dispatches one chunk of subscribers and exits, leaving the rest for the next minute. ```# Normal run — respects time gate and window php flarum digest:send # Force a specific frequency, bypassing the time gate (useful for testing) php flarum digest:send --frequency=daily # Preview mode — shows eligible recipients and content without sending anything php flarum digest:send --frequency=weekly --dry-run # Test a single user by ID php flarum digest:send --frequency=daily --user=1 # Override the queue name php flarum digest:send --queue=high-priority # Override the job delay in seconds php flarum digest:send --delay=300``` ### `digest:enqueue` Pre-populates the queue with jobs but does not send them. Intended for very large forums that want to build all jobs ahead of time so workers have no construction overhead when the send window opens. ```# Pre-build all daily digest jobs with a 10-minute delay before they become available php flarum digest:enqueue --frequency=daily --delay=600 # Preview how many users would be enqueued without actually doing it php flarum digest:enqueue --frequency=weekly --dry-run``` --- ## Performance and Scaling The extension is built for efficiency at any subscriber count. **Shared data caching:** Almost everything in a digest email is identical for every subscriber in the same frequency group — new discussions, hot discussions, new members, leaderboard, awards, badges, and all other sections are built once per send run and stored in cache for 2 hours. The only per-subscriber query is unread discussions. For a forum with 10,000 daily subscribers this means roughly 10,013 total database queries per send instead of 100,000+. **Lightweight job storage:** Each background job stores only a user ID, frequency, and a reference to the cached shared data — typically under 500 bytes per job. The jobs table stays small and workers stay fast. **Persistent unsubscribe tokens:** Each subscriber's unsubscribe token is generated once and reused across sends. It is only replaced when it expires (90 days) or the subscriber uses it. This ensures unsubscribe links in emails always work, regardless of how many sends have occurred since the email was received. **Send window pacing:** With a send window configured, the extension dispatches one chunk of subscribers per minute throughout the window. Workers drain each chunk in parallel as it arrives. Server load stays low and steady across the entire window period. **Recommended settings by forum size:** | Forum Size | Chunk Size | Workers | Send Mode | |---|---|---|---| | 100–500 members | 200 | 1 | Single hour | | 500–2,000 | 500 | 1 | Single hour | | 2,000–5,000 | 1,000 | 2 | 1–2 hour window | | 5,000–15,000 | 2,000 | 3 | 2–3 hour window | | 15,000–50,000 | 5,000 | 5 | 2–4 hour window | | 50,000–100,000 | 7,500 | 8 | 3–4 hour window | | 100,000+ | 10,000 | 10+ | 4+ hour window | For 50,000+ member forums, consider switching from the database queue driver to Redis or Valkey with Horizon and Supervisor for significantly higher throughput and real-time queue monitoring. The Server Settings page in the admin panel includes full step-by-step setup instructions for this configuration. --- ## Credits Originally created by [Resofire](https://github.com/resofire). Rebranded and maintained by [ernestdefoe](https://github.com/ernestdefoe), with full credit and thanks to the original author. ## License MIT — Copyright (c) 2026 Resofire
- Bespoke — support and discussion