Everything posted by Ernest Defoe
-
Pick'em — support and discussion
picks 2.0.5 What's Changed A maintenance release — performance, correctness, and convention fixes under the hood. No user-facing feature changes. Fixed Leaderboard totals can no longer be corrupted by a race. When two score updates for the same user ran at the same time, both could insert a duplicate all-time score row (the all-time scope isn't covered by the unique index, since SQL treats NULL != NULL). Score writes are now serialized per user and scope, so the duplicate can't happen. Performance Live scoring marks a game's picks correct/incorrect in two batched database updates instead of one update per pick — a popular game with hundreds of picks no longer fires hundreds of separate writes. Admin test-data seeding loads existing picks in a single query instead of one existence check per user-per-game (which previously ran tens of thousands of queries and could time out on a real data set). ESPN score sync now goes through the shared Guzzle HTTP client (honouring the host's proxy/SSL config) instead of a raw curl handle. Internal Migrations now use Flarum's createTableIfNotExists() / addColumns() helpers consistently. Removed redundant manual wasRecentlyCreated bookkeeping in the schedule sync, relying on Eloquent's own value. View release on GitHub
-
CFB Recruiting Tracker - Live college football recruiting
recruiting 3.1.0 What's Changed A full internal code audit — one new admin setting, plus reliability, ethics, and type-safety fixes under the hood. New Disable On3 headshots. A new admin toggle (Enable On3 player headshots) lets you stop all outbound traffic to On3 entirely — recruits then show star-tier initials avatars. The setting's help text documents exactly what the scrape does, and the admin panel now shows when headshots were last successfully refreshed. Fixed No more request stampede on a cold cache. The first request for a recruiting class used to make two blocking outbound calls (~22 s) with no lock, so a burst of visitors each launched their own pair of fetches. A single-flight lock now guarantees at most one cold fetch; everyone else serves the warmed cache or retries automatically. Honest scraping. Removed the spoofed Chrome browser User-Agent used to bypass On3's bot detection (a ToS/identity-spoofing risk that could get the forum's IP blocked). The fetch now identifies itself truthfully. Layout-change detection. If On3 returns a page but almost no players parse out, the extension now logs a warning instead of silently dropping all headshots. Internal The outbound HTTP client is now container-managed and injected, so operators can layer forum-wide middleware (logging, retry, proxy). The /recruiting page is fully TypeScript-type-checked (the prior @ts-nocheck escape hatch is gone), and the API URL is derived correctly for subdirectory installs. View release on GitHub
-
Pick'em — support and discussion
picks 2.0.4 What's Changed Maintenance release — a full internal code audit. No user-facing feature changes; one scoring bug fixed and broad performance/quality improvements under the hood. Fixed Test-data scoring with confidence mode. The admin Testing tab's seeder computed point totals with a duplicate routine that ignored confidence_mode/confidence_penalty, so seeded leaderboards didn't match live scoring. Scoring now runs through a single shared ScoreAggregator used by both live scoring and the seeder. Testing-tab buttons. The seed/clean/wipe endpoints were never routed and returned 404; they now work. Performance Admin stats no longer fire 260+ queries on a full FBS season — upset rate and consensus are computed from one aggregated pick-count query. Profile history no longer fires 30+ rank-count queries — week/season/all-time ranks are batch-loaded and ranked in PHP. Internal All raw database access migrated from Capsule DB::table() to Eloquent across 7 controllers and the seeder. Logo storage now writes through Flarum's asset filesystem disk (cloud/CDN-friendly) instead of native filesystem calls. CFBD API and logo downloads use the Guzzle HTTP client instead of raw curl. Exceptions in the leaderboard/history/scores endpoints are now logged instead of silently swallowed. Settings, current-season lookup, and service dependencies are injected rather than resolved ad hoc. View release on GitHub
-
SEO for Flarum 2 — support and discussion
seo 2.0.11 Security + performance hardening from a code audit. Recommended update — especially for forums with hidden / tag-restricted discussions or a non-public user list. Security (server-rendered meta tags) Discussion and profile meta tags are now scoped to the requesting visitor's visibility. Previously, guessing the URL of a hidden, tag-restricted or soft-deleted discussion (or a hidden user's profile) returned its title/description (and a user's bio/counts/avatar) in the server-rendered og: / twitter: / <meta name=description> tags — content the API would refuse to serve to that visitor. Crawlers and anonymous visitors no longer receive it. Performance The Q&A (best-answer) JSON-LD no longer pulls every reply into memory: suggested answers are capped (200) and the accepted answer is fetched by id, so a thread with thousands of replies can't OOM the render that Google's crawler hammers. Discussion / Post / Tag event handling no longer constructs the heavy PageListener on every event — the pure content helpers moved to a stateless SeoContentUtils. Other Expose the social-media image on the forum payload (admin) via the normal serialization path instead of mutating the model data bag; small cleanups. No migrations. View release on GitHub
-
Pick'em — support and discussion
picks 2.0.3 What's Changed Add author email to composer.json ci: add support-site release announcer (publish-to-flarum) docs: add Floxum badges to README docs: add support site (ernestdefoe.online) to README Full Changelog: https://github.com/ernestdefoe/picks/compare/2.0.2...2.0.3 View release on GitHub
-
Pick'em — support and discussion
Picks A Flarum 2.x extension that adds a college-football pick'em game to your forum. Members predict the winners of each week's games, earn points, and compete on a season leaderboard. Schedules and teams are synced from CollegeFootballData (CFBD), and team logos / live scores come from ESPN. FeaturesWeekly picks — members pick winners for each game in a week; picks lock at kickoff (with an optional offset). Live scoring — a scheduled task polls ESPN for in-progress scores and grades picks automatically as games finish. Leaderboard — season standings with per-week history and per-user pick history (/u/{username}/picks-history). Confidence mode (optional) — members rank their picks by confidence for weighted scoring, with a configurable penalty for missed high-confidence picks. Admin management — sync teams/schedule/scores, open/unlock weeks, enter or override results, refresh team logos, and reset data, all from the admin panel. Per-permission access — separate abilities for viewing, making picks, viewing history, and managing. RequirementsFlarum ^2.0 A free CollegeFootballData API key — get one at https://collegefootballdata.com/key (used for team and schedule syncing). Installation php flarum cache:clear``` Then enable **Picks** in the admin panel under Extensions. ## Setup 1. Open the **Picks** page in the admin panel. 2. Paste your **CFBD API key** and set the **season year** (and optionally a conference filter). 3. **Sync Teams**, then **Sync Schedule** to pull the season's games. 4. **Open** the week(s) you want members to pick. 5. Grant the picks permissions to the appropriate groups (see below). To keep live scores updating, make sure Flarum's scheduler is running (see **Scheduler** below) and enable **ESPN polling** in the settings. ## Permissions Set these under **Admin → Permissions**: | Ability | Lets a user… | |---|---| | `picks.view` | See the Picks page and leaderboard. | | `picks.makePicks` | Submit and change their own picks. | | `picks.viewHistory` | View pick history for users. | | `picks.manage` | Manage the game (sync, results, weeks, settings). Admins always have this. | ## Settings Configured on the admin **Picks** page (stored under the `ernestdefoe-picks.*` namespace): * **CFBD API key**, **season year**, **conference filter** * **Sync regular season / postseason**, **auto-sync** * **Picks lock offset** (minutes before kickoff) * **Confidence mode** + **confidence penalty** (`none` / `half` / `full`) * **Auto-unlock weeks**, **default week view** * **ESPN polling** + **poll interval** * **Nav label** (the forum nav link text) ## Scheduler Live-score polling runs as a scheduled command (`PollLiveScoresCommand`, every 5 minutes). For it to fire, Flarum's scheduler must be invoked once a minute by cron: ```* * * * * cd /path/to/forum && php flarum schedule:run >> /dev/null 2>&1``` You can also run syncs manually: ```php flarum picks:sync-teams # sync the FBS team list from CFBD php flarum picks:poll-scores # poll ESPN for live scores once``` ## Data sources * **CollegeFootballData (CFBD)** — teams and game schedules (API key required). * **ESPN** — team logos and live in-game scores (public endpoints, no key). Team names, logos, and data are the property of their respective owners and the providers above. This is an unofficial fan tool and is not affiliated with or endorsed by the NCAA, CFBD, ESPN, or any team. ## Credits Originally created by [resofire](https://github.com/resofire); now maintained by [ernestdefoe](https://github.com/ernestdefoe) as `ernestdefoe/picks`. ## Support Questions, bug reports, and feature requests: * **Support forum:** https://ernestdefoe.online * **Issues:** https://github.com/ernestdefoe/picks/issues ## License MIT
-
Favorite Team — support and discussion
favorite-team 2.0.3 Changes The favorite-team logo badge now overlays the avatar's bottom-left corner on posts (like a group badge), instead of sitting below the avatar. Hovering the badge shows the team name as a tooltip. Visual/UX only — no migrations. View release on GitHub
-
Gridiron Nation — support and discussion
gridiron-nation 2.2.1 Hardening release from a code audit — includes a likes-counter fix that matters on non-MySQL databases. Changes Cross-database likes counter: the discussions.likes_count sync no longer uses MySQL-only CAST(... AS SIGNED) raw SQL. It now uses Eloquent's atomic increment()/decrement(), so it works on PostgreSQL and SQLite too (previously a like on those engines threw and left the count permanently stale). Floored at 0. Like/unlike listeners are container-resolved (Class@method) — no manual resolve() per event. The hero "newest member" field is cached for 5 minutes like the scoreboard counts, so it no longer adds a DB round-trip to every page load; the two ForumResource extenders are merged. Live-scores controller injects its Guzzle client instead of constructing one per request. Removed an unconditional ini_set('memory_limit') that ran on every web request (it's a CLI/build concern). The composer trigger opens the composer via the core component loader instead of a hard-coded .IndexPage-newDiscussion DOM node. Removed two unused locale keys. Safe to update — no migrations. View release on GitHub
-
Flarum OG Image - Open Graph and Twitter meta tags
og-image v2.0.7 Security + conventions hardening from a code audit. Changes Privacy fix: A discussion's Open Graph meta tags are now rendered only when the request actor can actually see that discussion (whereVisibleTo). Previously a restricted (tag/group-gated) discussion could leak its title and a first-post excerpt into the page's <meta> tags for guests, crawlers and bots — content the API would refuse them. Restricted/invisible discussions now fall back to the generic forum tags. Read the forum_title setting once instead of twice. Tooling: migrate the admin JS to TypeScript (flarum-tsconfig + tsconfig.json) and remove a dead admin re-export. Recommended update for any forum with private or restricted discussions. View release on GitHub
-
Favorite Team — support and discussion
favorite-team 2.0.2 Hardening release from a code audit. Changes Server-side enforcement of the "require a favorite team" setting: members without a team are now blocked from starting discussions and replying (previously only nudged by the modal). Reading and choosing a team stay open. Visible feedback in the team picker: an error alert if a save fails (your selection is kept for retry) and a "Team saved!" confirmation on success. The profile-card logo badge now attaches via the supported profileItems hook instead of mutating core's render tree — more robust across Flarum updates. TeamRepository is bound as a container singleton, so the bundled team list is parsed at most once per request. No database or settings migrations; safe to update. View release on GitHub
-
Group Messages — support and discussion
group-messages 2.0.1 First release of Group Messages — group conversations for Flarum, built on flarum/messages. Features Multi-participant group conversations with a custom name and emoji icon Participant management: add/remove people, leave, and owner + moderator roles (promote/demote) Message reactions (emoji, grouped with counts) Reply to a specific message, with a "replying to" indicator and an inline reference Quote a message into the composer Read receipts ("seen by") on the latest message Direct 1-on-1 messages are left completely untouched. Requires flarum/messages. Install with composer require ernestdefoe/group-messages. View release on GitHub
-
Flarum OG Image - Open Graph and Twitter meta tags
og-image v2.0.6 What's Changed No changes Full Changelog: https://github.com/ernestdefoe/og-image/compare/v2.0.5...v2.0.6 View release on GitHub
-
Favorite Team — support and discussion
favorite-team 2.0.1 What's Changed Add author email to composer.json ci: add support-site release announcer (publish-to-flarum) Full Changelog: https://github.com/ernestdefoe/favorite-team/compare/2.0.0...2.0.1 View release on GitHub
-
Group Messages — support and discussion
group-messages 2.0.0 Initial release. View release on GitHub
-
Group Messages — support and discussion
Group Messages A Flarum extension that turns private messages into group conversations. It builds on flarum/messages — adding extra people, a name and icon, roles, participant management, read receipts, reactions, replies and quoting — without changing how one-on-one direct messages work. FeaturesGroup conversations — start a conversation with two or more other people, give it a name and an emoji icon. Participant management — add or remove people, leave a group, and (for the owner) promote or demote moderators. Roles — every group has an owner and optional moderators; everyone else is a member. Controls are shown based on your role. Reactions — react to any message with an emoji; reactions are grouped with counts. Reply — reply to a specific message, with a "replying to" indicator in the composer and an inline reference on the sent message. Quote — drop a markdown blockquote of any message into the composer. Read receipts — see small avatars of the participants who have read the latest message. Direct (1-on-1) messages are left completely untouched. ScreenshotsA group conversation — custom name and icon, participant count, message reactions, replies with an inline reference, and per-message actions: Starting a new group — pick people, give it a name and an emoji icon, write the first message: Managing a group — rename and re-icon, add or remove people, promote or demote moderators, or leave: Installationcomposer require ernestdefoe/group-messages This extension requires flarum/messages to be installed and enabled. Updating php flarum migrate php flarum cache:clear``` ## Usage * Open the **messages** dropdown (envelope icon) and choose **"New group message"** to start a group. * Inside a group, use the **"…"** menu → **Group settings** to rename it, change its icon, add or remove people, manage moderators, or leave. * Under each message you'll find the reaction picker, **Reply** and **Quote** actions. ### Permissions Creating and using groups reuses the existing direct-message permission (`flarum/messages`' "send private messages"). No new permission is added — anyone who can send a DM can start a group. ## Development ```cd js npm install npm run build # or: npm run dev``` After changing PHP or rebuilding JS on a site: ```php flarum assets:publish php flarum cache:clear``` ## Links * [Packagist](https://packagist.org/packages/ernestdefoe/group-messages) * [GitHub](https://github.com/ernestdefoe/group-messages) * [Report an issue](https://github.com/ernestdefoe/group-messages/issues) ## License This extension is licensed under the [MIT License](https://github.com/ernestdefoe/group-messages/blob/main/LICENSE.md).
-
Favorite Team — support and discussion
Favorite Team A Flarum 2.x extension that lets members pick a favorite FBS (NCAA Division I-A) college-football team. The team's logo is displayed under the member's avatar on posts and on their profile. FeaturesTeam picker — a searchable grid of all 136 FBS teams (logo + name) in the member's account settings. Avatar badge — the chosen team's logo appears under the avatar on posts (in the post's side column) and on the profile / user card. Require at registration (optional) — an admin toggle that forces new members to pick a team before they can use the forum. It shows a non-dismissible picker on the next page load for any logged-in member who hasn't chosen yet (works with normal, social, and SSO sign-ups). No database migration — the choice is stored in the member's existing preferences, so it loads with the user row (no extra query when rendering the badge across a page of posts). Logos via the ESPN CDN — no images are bundled or hosted by the extension. Installation php flarum cache:clear``` Then enable **Favorite Team** in the admin panel under Extensions. ## Usage ### For members Go to **Settings** → **Favorite Team** → **Choose your team**, search or scroll the grid, pick a team, and save. The logo then shows under your avatar. ### For admins Open the **Favorite Team** extension page in the admin panel and toggle **Require members to pick a team** to force the choice at registration. It's off by default. ## How it works * The FBS team list is bundled as static reference data in `resources/teams.json` (id, name, abbreviation, color, and ESPN logo URL per team). * The chosen team id is stored in the member's `preferences` (`ernestdefoe-favorite-team.team`). * The core `UserResource` is extended with two fields: * `favoriteTeamId` — writable by the member themselves (or an admin), validated against the bundled team list. * `favoriteTeam` — a read-only resolved object (`id`, `name`, `logo`, …) used to render the badge; readable by everyone. * `GET /api/fbs-teams` returns the full team list for the picker. ## API | Method | Endpoint | Notes | |---|---|---| | `GET` | `/api/fbs-teams` | Full FBS team list (registered users). | | `PATCH` | `/api/users/{id}` | Set `favoriteTeamId` (self or admin). | ## Configuration | Admin setting | Default | Effect | |---|---|---| | Require members to pick a team | off | Blocks members without a team until they choose. | ## Notes Team names and logos are the property of their respective institutions and are served from ESPN's public logo CDN. This is an unofficial fan tool and is not affiliated with or endorsed by the NCAA, ESPN, or any team. ## License MIT # Favorite Team A [Flarum](https://flarum.org) 2.x extension that lets members pick a favorite FBS (NCAA Division I-A) college-football team. The team's logo is displayed under the member's avatar on posts and on their profile. ## Features * **Team picker** — a searchable grid of all 136 FBS teams (logo + name) in the member's account settings. * **Avatar badge** — the chosen team's logo appears under the avatar on posts (in the post's side column) and on the profile / user card. * **Require at registration (optional)** — an admin toggle that forces new members to pick a team before they can use the forum. It shows a non-dismissible picker on the next page load for any logged-in member who hasn't chosen yet (works with normal, social, and SSO sign-ups). * **No database migration** — the choice is stored in the member's existing preferences, so it loads with the user row (no extra query when rendering the badge across a page of posts). * **Logos via the ESPN CDN** — no images are bundled or hosted by the extension. ## Installation ```composer require ernestdefoe/favorite-team php flarum cache:clear``` Then enable **Favorite Team** in the admin panel under Extensions. ## Usage ### For members Go to **Settings** → **Favorite Team** → **Choose your team**, search or scroll the grid, pick a team, and save. The logo then shows under your avatar. ### For admins Open the **Favorite Team** extension page in the admin panel and toggle **Require members to pick a team** to force the choice at registration. It's off by default. ## How it works * The FBS team list is bundled as static reference data in `resources/teams.json` (id, name, abbreviation, color, and ESPN logo URL per team). * The chosen team id is stored in the member's `preferences` (`ernestdefoe-favorite-team.team`). * The core `UserResource` is extended with two fields: * `favoriteTeamId` — writable by the member themselves (or an admin), validated against the bundled team list. * `favoriteTeam` — a read-only resolved object (`id`, `name`, `logo`, …) used to render the badge; readable by everyone. * `GET /api/fbs-teams` returns the full team list for the picker. ## API | Method | Endpoint | Notes | |---|---|---| | `GET` | `/api/fbs-teams` | Full FBS team list (registered users). | | `PATCH` | `/api/users/{id}` | Set `favoriteTeamId` (self or admin). | ## Configuration | Admin setting | Default | Effect | |---|---|---| | Require members to pick a team | off | Blocks members without a team until they choose. | ## Notes Team names and logos are the property of their respective institutions and are served from ESPN's public logo CDN. This is an unofficial fan tool and is not affiliated with or endorsed by the NCAA, ESPN, or any team. ## License MIT
-
Gridiron Nation — support and discussion
gridiron-nation 2.2.0 What's Changed fix: keep wide team-wordmark hero decorations from being cut off feat: stronger drop shadow on hero team decorations fix: widen welcome-hero scoreboard so long newest-member names aren't cut off feat: per-glyph hero decoration inset (measure real ink overflow in JS) Full Changelog: https://github.com/ernestdefoe/gridiron-nation/compare/2.1.11...2.2.0 View release on GitHub
-
Social Groups for Flarum — support and discussion
social-groups v2.3.65 What's Changed No changes Full Changelog: https://github.com/ernestdefoe/social-groups/compare/v2.3.64...v2.3.65 View release on GitHub
-
Social Groups for Flarum — support and discussion
social-groups v2.3.64 What's Changed No changes Full Changelog: https://github.com/ernestdefoe/social-groups/compare/v2.3.63...v2.3.64 View release on GitHub
-
Social Groups for Flarum — support and discussion
social-groups v2.3.63 What's Changed No changes Full Changelog: https://github.com/ernestdefoe/social-groups/compare/v2.3.62...v2.3.63 View release on GitHub
-
SEO for Flarum 2 — support and discussion
seo 2.0.10 What's Changed fix(ci): allow pre-release stability so Flarum 2 deps resolve Full Changelog: https://github.com/ernestdefoe/seo/compare/2.0.9...2.0.10 View release on GitHub
-
SEO for Flarum 2 — support and discussion
seo 2.0.9 What's Changed Fix boot crash when fof/sitemap is also installed Full Changelog: https://github.com/ernestdefoe/seo/compare/2.0.8...2.0.9 View release on GitHub
-
Social Groups for Flarum — support and discussion
social-groups v2.3.62 What's Changed No changes Full Changelog: https://github.com/ernestdefoe/social-groups/compare/v2.3.61...v2.3.62 View release on GitHub
-
Gridiron Nation — support and discussion
gridiron-nation 2.1.11 What's Changed Fix overflowing messages-page nav Stack messages-page nav vertically (correct selector .MessagesPage-nav) Force nested SelectDropdown in messages nav into a vertical list Refine messages nav: compact Send button, flat list, tighter spacing Stop hero clipping the Online popover; raise its z-index Give DM messages the stadium-ticket chrome + pull the thread up Lay messages page out as nav-left / content-right columns Revert messages page to stacked layout; just trim the top gap Override Page-container gap directly to pull messages content up Hide the redundant MessagesPageHero to pull the thread up Compact the messages nav rows to lift the thread higher Revert messages-page layout overrides; keep only the ticket chrome Make messages nav strip full-width like default theme Hide MessagesPageHero so the horizontal nav + thread sit at the top Trim remaining messages content margin + nav padding Force messages container to block stacking at all widths Add small top margin so messages nav clears the fixed header Restore the Messages hero banner Full Changelog: https://github.com/ernestdefoe/gridiron-nation/compare/2.1.10...2.1.11 View release on GitHub
-
Social Groups for Flarum — support and discussion
social-groups v2.3.61 What's Changed No changes Full Changelog: https://github.com/ernestdefoe/social-groups/compare/v2.3.60...v2.3.61 View release on GitHub