# 3.8.1 / 2025-11-06 **Security** - Make challenge attempt ratelimit stricter - Make reset password ratelimit stricter and apply per-account **General** - Integrates dynamic scoring into the standard challenge type - All challenges will now have `initial`, `decay`, `minimum`, `function` columns available through the standard challenge type - Scoring logic for challenges can be configured with the `function` field - The dynamic value challenge plugin will remain supported until CTFd 4.0 - Add `solved` solution visibility to challenge solutions - This only allows a user to view a challenge's solution if they've solved the associated challenge **Admin Panel** - Add bulk editing for solution visibility in the Admin Panel Challenges page **API** - Change `GET /api/v1/solutions/[solution_id]` to return 404 if a solution is hidden instead of a 403 - Add `/api/v1/challenges/[challenge_id]/solution` endpoint to check if a challenge solution is accessible **Themes** - CTFd.js has been bumped to `0.0.19` - `challenges.js` now has additional functions `getSolutionState` and `setSolutionId` to allow the UI to determine if a solution is accessible **Deployment** - Fixes issues where preset admins would not be created - Add `RUN_ID` config which specifies a token which will be used as a cache-buster URL parameter - Add `EXTRA_CONFIGS_FORCE_TYPES` config to allow server admins to force types for configs specified in the `[extra]` section - If `UPDATE_CHECK` is disabled the update prompt banner should be properly disabled - Fix issue where users would be put into an infinite loop if confirm emails is enabled without having an email server configured **Translations** - Add Uzbek and Hebrew languages # 3.8.0 / 2025-09-04 **General** - Admins can now configure whether users can see their past submissions - Admins can now store challenge solutions within CTFd to be viewed by users - Participants can now leave upvotes/downvotes on challenges as well as their review of a challenge - Ratings/Votes can be configured to be viewed by participants or only admins - Reviews are only visible by admins - Challenges now have the `logic` field which allows for challenge developers to control the flag collection behavior of a challenge: - `any`: any flag is accepted for the challenge - `all`: all flags for the challenge must be submitted - `team`: all team members must submit any flag - Max Attempts can now behave as a timeout instead of a lockout - For example a user who submits 3 attempts will then be prevented from submitting another attempt for 5 minutes instead of being unable to submit entirely - Social Shares for challenge completion are now enabled by default and admins may now control the social share template page - Additional attempts after solving on challenges will now show if the submissions is correct/incorrect - If email sending is available, email confirmation is enabled by default and users are nudged to complete email verification. - Hints can now have a title that is shown before unlocking - Hints now always require unlocking even if they require no cost - Prevents accidental viewing and improves tracking of hint usage - CTFd will now store a tracking event under `challenges.open` in the Tracking table when a challenge is opened for the first time by a user - Challenges now report whether a flag is correct or incorrect even if the challenge has already been solved - Fixes issue where admins could not download challenge files before CTF start when downloading anonymously **Admin Panel** - Added a matrix scoreboard to the Statistics page to show player progression through the CTF - Added support for brackets in the Admin Panel scoreboard - Added config option for minimum password length - Added config option to control whether players can view their previous submissions - Admins can now require users to change their password upon login - Added config option to control Max Attempts behavior - In the Admin Panel challenge preview, admins now only see free hints - Fixed issue where the hint form was not resetting properly when creating multiple hints **API** - Added `/api/v1/users/me/submissions` for users to retrieve their own submissions - Added `/api/v1/challenges/[challenge_id]/solutions` for users to retrieve challenge solutions - Added `/api/v1/challenges/[challenge_id]/ratings` for users to submit ratings and for admins to retrieve them - Added `ratings` and `rating` fields to the response of `/api/v1/challenges/[challenge_id]` - Added `solution_id` to the response of `/api/v1/challenges/[challenge_id]` - If no solution is available, the field is `null` - Added `logic` field to the response of `/api/v1/challenges/[challenge_id]` - Added `change_password` field to `/api/v1/users/[user_id]` when viewed as an admin - Added `/api/v1/solutions` and `/api/v1/solutions/[solution_id]` endpoints - `/api/v1/unlocks` is now also used to unlock solutions for user viewing **Deployment** - Added `PRESET_ADMIN_NAME`, `PRESET_ADMIN_EMAIL`, `PRESET_ADMIN_PASSWORD`, and `PRESET_ADMIN_TOKEN` to `config.ini` for pre-creating an admin user - Useful for automated deployments and ensuring a known admin token exists - Added `PRESET_CONFIGS` to `config.ini` for pre-setting server-side configs - Useful for configuring CTFd without completing setup or using the API - Added `EMAIL_CONFIRMATION_REQUIRE_INTERACTION` to `config.ini` to require additional interaction for email confirmation links - Improves compatibility with certain anti-phishing defenses - Email confirmation is now enabled whenever email sending is available - Replaced `pybluemonday` with `nh3` (due to breakage in Python modules written in Golang) - Updated Flask to 2.1.3 - Updated Werkzeug to 2.2.3 **Plugins** - Challenge Type Plugins should now return a `ChallengeResponse` object instead of a `(status, message)` tuple - Existing behavior is supported until CTFd 4.0 - Added `BaseChallenge.partial` for challenge classes to indicate partial solves (for `all` flag logic) **Themes** - The `core-beta` theme has been promoted to `core` - The `core-beta` repo has been replaced with the [core-theme repo](https://github.com/CTFd/core-theme). Future changes should be made in the main CTFd repo and these changes will be copied over to the core-theme repo. - The previous `core` theme has been deprecated and renamed `core-deprecated` # 3.7.7 / 2025-04-14 **General** - Added ability to denylist/blacklist email domains from registering - Hints can now include an optional title that is shown to users before unlocking **Admin Panel** - Challenge files now show the stored sha1sum **Deployment** - Fixed issue where the `/api/v1/scoreboard/top/` endpoint wouldn't cache different count values properly - The `/api/v1/scoreboard/top/`endpoint will now return at most the top 50 accounts - Updated gunicorn to 23.0.0 - Updated Jinja2 to 3.1.6 # 3.7.6 / 2025-02-19 **Security** - Added the `TRUSTED_HOSTS` configuration to more easily restrict CTFd to valid host names **General** - Added language switcher on the main navigation bar - Removed autocomplete=off from login, register, and reset password forms **Plugins** - Challenge type plugins can now raise `ChallengeCreateException` or `ChallengeUpdateException` to show input validation messages - Plugins specifying a config route will now appear in the Admin Panel under the Plugins section **Translations** - Add Romanian, Greek, Finnish, Slovenian, Swedish languages # 3.7.5 / 2024-12-27 **Security** - Change confirmation and reset password emails to be single use instead of only expiring in 30 minutes **General** - Fix issue where users could set their own bracket after registration - If a user or team do not have a password set we allow setting a password without providing a previous password confirmation - Fix issue where dynamic challenges did not return their attribution over the API - Language selection is now available in the main theme navigation bar **Admin Panel** - A point breakdown graph showing the amount of challenge points allocated to each category has been added to the Admin Panel - Bracket ID and Bracket Name have been added to CSV scoreboard exports - Fix issue with certain interactions in the Media Library **API** - Swagger specification has been updated to properly validate - `/api/v1/flags/types` and `/api/v1/flags/types/` have been seperated into two seperate controllers **Deployment** - IP Tracking has been updated to only occur if we have not seen the IP before or on state changing methods - Bump dependencies for `cmarkgfm` and `jinja2` # 3.7.4 / 2024-10-08 **Security** - Validate email length to be less than 320 chars to prevent Denial of Service in email validation **General** - Add attribution field to Challenges **Admin Panel** - Display brackets in the Admin Panel **Themes** - Display brackets for users/teams on listing pages and public/private pages - Fix miscellaneous issues in core-beta - Adds dark mode to core-beta theme - Fix issue with long titles in challenge buttons - Adds `type` and `extra` arguments to `Assets.js()` and default `defer` to `False` as `type="module"` automatically implies defer - ECharts behavior for some graphs in core-beta can now be overriden using the following window objects `window.scoreboardChartOptions`, `window.teamScoreGraphChartOptions`, `window.userScoreGraphChartOptions` - Update the scoreboard score graph to reflect the current active bracket changes **Deployment** - Add `.gitattributes` to keep LF line endings on .sh files under Windows - Fix issues where None values are not cast to empty string - Bump dependencies for `pybluemonday`, `requests`, and `boto3` # 3.7.3 / 2024-07-24 **Security** - Fix issue where challenge solves and account names could be seen despite accounts not being visible **Admin Panel** - Add a Localization section in the Config Panel - Add the Default Language config in the Admin Panel to allow admins to configure a default language - Previously CTFd would default to an auto-detected language specified by the user's browser. This setting allows for that default to be set by the admin instead of auto-detected. **Translations** - Fix issue where Simplified Chinese would be used instead of Traditional Chinese - Update the language names for Simplified Chinese and Traditional Chinese for clarity - Update Vietnamese translation - Add Catalan translation # 3.7.2 / 2024-06-18 **Security** - Patches an issue where on certain browsers flags could be leaked with admin interaction on a malicious page **API** - Disable returning 404s in listing pages with pagination - Instead of returning 404 these pages will now return 200 - For API endpoints, the response will be a 200 with an empty listing instead of a 404 **Deployment** - CTFd will now add the `Cross-Origin-Opener-Policy` response header to all responses with the default value of `same-origin-allow-popups` - Add `CROSS_ORIGIN_OPENER_POLICY` setting to control the `Cross-Origin-Opener-Policy` header # 3.7.1 / 2024-05-31 **Admin Panel** - The styling of the Config Panel has been updated to better organize different settings - When switching user modes via the Admin Panel, all teams will now be removed - Fix issues where importing CSVs comprised of JSON entries would fail - Add `serializeJSON` function back into the Admin Panel **API** - The `/api/v1/exports/raw` API endpoint has been added to allow for exports to be generated via the API - Update the ScoreboardDetail endpoint (`/api/v1/scoreboard/top/`) to return account URL, score, and bracket - Add a query parameter to ScoreboardDetail endpoint (`/api/v1/scoreboard/top/`) to filter by bracket - Return `function` field for DynamicValue challenges data read **General** - Add Italian and Vietnamese languages - Switch to Crowdin for translations **Themes** - Add `defer` parameter to `Assets.js()` to allow controlling the defer attribute of inserted `