CTFd is an open-source platform for building and running Capture The Flag competitions, and it is free to self-host, with a paid hosted-instance option through the vendor for those who don't want to run it themselves. It gives admins tools to build challenges, hints, and flags, run individual or team-based competitions, and manage a scoreboard with tie resolution and freezing, which makes it aimed at CTF organizers, training programs, and security teams running internal exercises rather than at players themselves. It's extensible through plugins and themes, so organizers can add custom challenge types or scoring logic instead of waiting on core features. First committed in 2015, it remains active with 167 contributors, near-weekly releases, and a security patch shipped this week.
CTFd is a Capture The Flag framework focusing on ease of use and customizability, with everything needed to run a CTF.
Which team is actually winning once tied scores and late corrections are accounted for?
resolves ties automatically on the scoreboard and lets an admin retroactively mark a previously accepted submission as incorrect, recalculating standings without deleting the original record
Which challenges are stalling players or leaking solutions before they should?
tracks solve counts and submission types per challenge, separates rate-limited attempts from wrong answers, and can gate a challenge's solution page so it only opens to users who solved it
Are the hints and files I built during setup the ones players are actually seeing?
the admin interface and API cover challenges, categories, hints, flags and file uploads from a single source, and a progression matrix shows per-user, per-category advancement so gaps between what was built and what was reached are visible before the event ends
Can I reconstruct exactly what happened after the competition closes?
frozen and unfrozen scoreboard states export separately to CSV, and user or team data (including team membership) exports and imports as CSV for archival or re-use in another event
Did an admin action on submissions get taken without leaving the API?
submission status changes made by hand in the panel and those made through the API both update the same submission record, so a correction shows up the same way regardless of which path an admin used
62 capabilities
· 6 backed by code, an API document or a real run
Built from CTFd's releases, docs, README and our own runs.
“Seen” marks the month we first spotted a release the vendor didn't date.
Group names and tags are our labels.
+Challenge managementverifiedCreate, read, update, and organise challenges including their flags, hints, tags, files, requirements, and associated metadata.46 releases · 46 other sources · first seen Mar 2017▸
Also counts toward: REST API
release
46 total
GET /challenges/{challenge_id}: response schema changed
v1 · Aug 2026
· source
· release history
PATCH /challenges/{challenge_id}: response schema changed
v1 · Aug 2026
· source
· release history
Adds anonymize setting to preview general details of challenges that have prerequisites.
3.8.3 · Apr 2026
· source
· release history
Adds Challenge Position field to control explicit ordering of challenges (1–n, with 0 falling to the end).
3.8.3 · Apr 2026
· source
· release history
docs
Capture The Flag platform with customizable challenges, scoring, team management, and plugin/theme support.
example
7 total
Bulk-set solution visibility to solved for multiple challenges so participants can only read solutions they've already completed.$ In the Admin Panel, go to Challenges, select the target challenges using the checkboxes, open the Bulk Edit menu, and set Solution Visibility to 'solved'.
3.8.1 · Nov 2025
· source
Enable HTML sanitization for challenge descriptions via the admin panel.$ In the Admin Panel, go to Configuration and enable 'HTML Sanitization'.
3.6.0 · Aug 2023
· source
View all team entities, bypassing visibility restrictions on hidden or banned teams.$ curl -X GET http://localhost:4000/api/v1/teams?view=admin
2.5.0 · Jun 2020
· source
Fetch all user accounts, including those banned or hidden by administrators.$ curl -X GET http://localhost:4000/api/v1/users?view=admin
2.5.0 · Jun 2020
· source
Retrieve the full list of challenges, including those currently hidden from players.$ curl -X GET http://localhost:4000/api/v1/challenges?view=admin
2.5.0 · Jun 2020
· source
Prevent non-admin users from accessing user statistics via the API.$ GET /api/v1/statistics/users # Now requires admin session token
2.3.2 · Mar 2020
· source
+Module managementverifiedGroup challenges into modules and manage those modules via create, read, update, and delete operations.19 releases · 9 other sources · first seen Dec 2017▸
A Module is a named group of challenges. Modules exist so that a set of challenges can be released to specific Audiences instead of to everyone. A challenge belongs to at most one module.
docs update · Oct 2026
· source
example
Check which scoreboard bracket a user belongs to via the API.$ curl -s https://ctf.example.com/api/v1/scoreboard | jq '.data[0].bracket_name'
3.7.0 · Feb 2024
· source
Retrieve scoreboard data with account URLs for direct linking to user profiles instead of generic entries.$ curl -s https://ctfd.example.com/api/v1/scoreboard | jq '.data[].account_url'
2.1.3 · Jun 2019
· source
Run CTFd Docker image directly$ docker run -p 8000:8000 -it ctfd/ctfd
+Submission review and invalidationverifiedMark previously accepted correct submissions as incorrect through the Admin Panel UI, the API, or programmatically via CLI command.12 releases · 16 other sources · first seen Dec 2018▸
Also counts toward: Command-line interface, Web management console
release
12 total
New Admin Panel UI to mark a previously correct submission as incorrect.
3.8.6 · Jun 2026
· source
· release history
PATCH /api/v1/submissions/[submission_id] now supports marking submissions as incorrect via the API.
3.8.6 · Jun 2026
· source
· release history
New Admin Panel UI to mark a previously correct submission as incorrect.
3.8.6 · Jun 2026
· source
· release history
Supports PATCH /api/v1/submissions/[submission_id] to programmatically mark submissions as incorrect.
3.8.6 · Jun 2026
· source
· release history
affiliation, website, and country can now be accepted as additional profile fields during user registration (themes must provide the corresponding inputs)
3.0.0a2 · Jul 2020
· source
· release history
The PATCH /api/v1/users/[user_id] endpoint no longer allows admins to ban themselves, preventing self-banning scenarios that were previously possible.
3.0.0a2 · Jul 2020
· source
· release history
example
7 total
Retroactively invalidate a correct submission from the command line, e.g. after discovering a flag was leaked.$ curl -X PATCH https://<ctfd-host>/api/v1/submissions/<submission_id> \ -H 'Authorization: Token <admin-token>' \ -H 'Content-Type: application/json' \ -d '{"type": "incorrect"}'
3.8.6 · Jun 2026
· source
Programmatically revoke a correct submission (e.g., after detecting a flag-sharing violation) without touching the Admin UI.$ curl -X PATCH https://<ctfd-host>/api/v1/submissions/42 \ -H 'Authorization: Token <admin-token>' \ -H 'Content-Type: application/json' \ -d '{"correct": false}'
3.8.6 · Jun 2026
· source
Manually invalidate a suspicious correct submission through the Admin Panel after reviewing solve logs.$ In the Admin Panel, go to Submissions, locate the correct submission, and click the new 'Mark as Incorrect' action.
3.8.6 · Jun 2026
· source
Manually correct a mistakenly accepted submission directly in the admin panel without touching the API.$ In the Admin Panel, navigate to the submission in question and use the new 'Mark as Incorrect' control to change its status.
3.8.6 · Jun 2026
· source
Correct a mistakenly rejected flag submission for a team member.$ curl -X PATCH https://<ctfd-url>/api/v1/submissions/<submission_id> \ -H 'Authorization: Token <token>' \ -H 'Content-Type: application/json' \ -d '{"type": "discard"}'
3.6.0 · Aug 2023
· source
Inject custom HTML into the site header for admins via CLI.$ python manage.py set_config theme_header '<script src="/custom.js"></script>'
2.3.0 · Feb 2020
· source
+Audience managementverifiedDefine and manage named audiences, add or remove members, and associate audiences with modules to control challenge visibility.12 releases · 9 other sources · first seen Apr 2019▸
Also counts toward: REST API
release
12 total
New endpoint DELETE /audiences/{audience_id}/members/{member_id}
v1 · Aug 2026
· source
· release history
New endpoint DELETE /audiences/{audience_id}
v1 · Aug 2026
· source
· release history
+Data import via CLIverifiedImport data from a file using the CLI, with an option to automatically delete the import file upon completion.9 releases · 9 other sources · first seen Jan 2017▸
release
9 total
Adds /api/v1/exports/raw API endpoint to allow for exports to be generated via the API
3.7.1 · Jun 2024
· source
· release history
/api/v1/files accepts multipart/form-data with token authentication for file uploads.
3.6.1 · Dec 2023
· source
· release history
Add CSV export format teams+members+fields including teams with custom fields and their members' custom field entries to the Admin Panel import/export flow
3.5.1 · Jan 2023
· source
· release history
Add --delete_import_on_finish to python manage.py import_ctf
3.5.0 · May 2022
· source
· release history
deployments.s3_signature_version supports S3 signature version 4 authentication to allow storage in alternative S3-compatible buckets like Google Cloud Storage or DigitalOcean Spaces
3.4.1 · Feb 2022
· source
· release history
Adds ability to import users, teams, and challenges via CSV files in the Admin Panel.
3.4.0 · Aug 2021
· source
· release history
Pull bracket metadata programmatically from scoreboard CSV exports for post-CTF analysis or reporting.$ In the Admin Panel, go to Scoreboard > Export and download the CSV — the exported file now includes 'Bracket ID' and 'Bracket Name' columns.
3.7.5 · Dec 2024
· source
Upload a file using multipart form data with token auth.$ curl -X POST -H "Authorization: Token <your_token>" -F "file=@/path/to/file.jpg" https://ctf.example.com/api/v1/files
3.6.1 · Dec 2023
· source
Award a user without knowing their team ID; CTFd resolves it automatically.$ curl -X POST /api/v1/awards \ -H "Content-Type: application/json" \ -H "Authorization: Bearer <admin_token>" \ -d '{ "name": "first blood", "value": 100, "category": "challenge", "user_id": 42 }'
2.3.2 · Mar 2020
· source
Scale the application's concurrency in your Docker environment to handle more simultaneous connections.$ # In docker-compose.yml under the web service # environment: # - WORKERS=4
1.1.3 · Mar 2018
· source
+Plugin asset managementshippedProvide utilities for plugins to register JavaScript, CSS, and other assets with specific Flask routes.13 releases · 1 other source · first seen Jan 2019▸
Also counts toward: JavaScript scripting support
release
13 total
Adds type and extra arguments to Assets.js() with defer defaulting to False.
3.7.4 · Oct 2024
· source
· release history
Add defer parameter to Assets.js() to allow controlling the defer attribute of inserted <script> tags
3.7.1 · Jun 2024
· source
· release history
Allow plugins to specify multiple paths in config.json to add additional entries to the Plugins dropdown in the Admin Panel
3.5.1 · Jan 2023
· source
· release history
Rewrites HTML sanitization (controlled by HTML_SANITIZATION) to use pybluemonday instead of lxml/html5lib, potentially changing output for edge cases
3.3.0 · Mar 2021
· source
· release history
Add Configs global to themes for wrapped access to get_config (e.g. {{ Configs.ctf_name }}).
3.0.0a1 / 2020-07-01 · Jul 2020
· source
· release history
Improve CTFd.plugins.migrations.upgrade() to be able to upgrade to a specific plugin migration
2.4.3 · May 2020
· source
· release history
example
Use the exposed Moment library in a CTFd plugin to format challenge start times.$ var formatted = window.Moment.utc(challengeDate).local().format('YYYY-MM-DD HH:mm:ss');
2.2.2 · Jan 2020
· source
+Localization managementshippedEnable administrators to configure platform-wide language settings and allow users to select their preferred interface language.10 releases · 1 other source · first seen Jul 2024▸
release
10 total
Adds Indonesian language translations to the platform.
3.8.5 · May 2026
· source
· release history
Supports localized datetime formatting so dates display in each user's preferred language format.
3.8.3 · Apr 2026
· source
· release history
Adds Norwegian, Turkish, and Croatian translations.
3.8.2 · Feb 2026
· source
· release history
Required fields in registration, login, and custom field forms are now marked with a red asterisk.
3.8.2 · Feb 2026
· source
· release history
Adds Uzbek and Hebrew language translations.
3.8.1 · Nov 2025
· source
· release history
example
Override browser-detected languages so all users see CTFd in a consistent locale by default.$ In the Admin Panel, go to Config > Localization and set the Default Language to your desired locale (e.g. 'en' for English).
3.7.3 · Jul 2024
· source
+Admin user search by IPshippedEnable administrators to look up users based on their IP address.7 releases · 1 other source · first seen Aug 2019▸
release
7 total
GET /unlocks: param ip (query) added︀︄︇︀︅︉︀︅︀︀︃︀︀︅︅︀︅︊︀︄︆︀︃︄
v1 · Oct 2026
· source
· release history
Adds PUT method to IP address tracking endpoint.
3.8.2 · Feb 2026
· source
· release history
Adds Bracket ID and Bracket Name columns to CSV scoreboard exports.
3.7.5 · Dec 2024
· source
· release history
POST /api/v1/files accepts a location parameter to control upload destination
3.7.0 · Feb 2024
· source
· release history
email field now supported in query parameters for /api/v1/users and /api/v1/teams endpoints to allow searching via email address.
3.6.1 · Dec 2023
· source
· release history
Add links from User/Team Profile IP addresses to a User IP address search page
3.5.0 · May 2022
· source
· release history
example
Search for a user by email address using the CTFd API.$ curl -s -H "Authorization: Token <your_token>" "https://ctf.example.com/api/v1/users?field=email&search=target@example.com"
3.6.1 · Dec 2023
· source
+Competition mode configurationshippedAllow organizers to configure how players interact with the competition, including support for individual or team modes, score visibility, and registration controls.7 releases · 1 other source · first seen Dec 2018▸
release
7 total
Adds ability to denylist/blacklist email domains from registering, blocking unwanted participants at sign-up.
3.7.7 · Apr 2025
· source
· release history
Admin Panel allows configuring the submissions-per-minute ratelimit via a new configuration key rather than a hardcoded default
3.4.1 · Feb 2022
· source
· release history
Adds support for limiting the total number of teams in a CTF.
3.4.0 · Aug 2021
· source
· release history
Adds a setting to registration visibility to allow for MLC registration while registration is disabled
2.3.2 · Mar 2020
· source
· release history
Team size limits can now be enforced from the configuration panel
2.2.0 · Dec 2019
· source
· release history
Workshop mode, score hiding, registration hiding, and challenge hiding visibility settings are changed to functions: accounts_visible(), challenges_visible(), registration_visible(), scores_visible()
2.0.0 · Dec 2018
· source
· release history
example
Allow MLC (Multi-Level Clearance) registration even if general site registration is disabled.$ # In Admin Panel > Settings > Registration # Enable 'MLC Registration' while leaving 'Site Registration' disabled
2.3.2 · Mar 2020
· source
+Real-time competition updatesshippedProvide authenticated users with real-time notifications of events via Server-Sent Events and expose account profile links in scoreboard and solve data.6 releases · 1 other source · first seen Jan 2018▸
release
Adds solves and solved_by_me fields to /api/v1/challenges and /api/v1/challenges/[challenge_id] endpoints
3.3.0 · Mar 2021
· source
· release history
SERVER_SENT_EVENTS config value added to control whether server-sent notifications are enabled
2.2.0 · Dec 2019
· source
· release history
Adds account_type and account_url fields to the /api/v1/scoreboard endpoint response
2.1.3 · Jun 2019
· source
· release history
Adds Server-Side Events real-time notifications for authenticated users at the /events endpoint
2.1.0 · Apr 2019
· source
· release history
Flask-SocketIO dependency removed; SOCKETIO_ASYNC_MODE config key deleted, requiring gevent worker for real-time support
2.1.0 · Apr 2019
· source
· release history
The JavaScript update() function now accepts a callback argument
1.1.1 · Jan 2018
· source
· release history
example
Retrieve scoreboard data with account URLs for direct linking to user profiles instead of generic entries.$ curl -s https://ctfd.example.com/api/v1/scoreboard | jq '.data[].account_url'
2.1.3 · Jun 2019
· source
+S3 storage configurationshippedAllow administrators to configure AWS S3 storage settings including region, addressing style, custom domains, and cacheable URL generation.6 releases · first seen Feb 2022▸
release
Config key AWS_S3_CUSTOM_PREFIX allows S3 file uploads under a specific folder prefix
3.7.0 · Feb 2024
· source
· release history
Adds AWS_S3_ADDRESSING_STYLE config to select S3 bucket addressing (auto, virtual, path)
3.6.0 · Aug 2023
· source
· release history
Adds AWS_S3_CUSTOM_DOMAIN config to override presigned download URL domains for custom S3 providers
3.6.0 · Aug 2023
· source
· release history
Enables generation of cachable S3 URLs by rounding timestamps down to the previous hour
3.5.2 · May 2023
· source
· release history
Add AWS_S3_REGION configuration key (defaulting to us-east-1) to specify the S3 region for storage
3.5.1 · Jan 2023
· source
· release history
Add s3_signature_version configuration option to enable S3 signature version 4 authentication for alternative S3-compatible buckets like Google Cloud Storage or DigitalOcean Spaces
3.4.1 · Feb 2022
· source
· release history
+Team captain privilegesshippedIntroduce a team captain role that allows designated members to edit team profile details and enforces access controls for non-captains.5 releases · 1 other source · first seen Apr 2019▸
Also counts toward: Role-based access control, REST API
release
The default value for the UPLOAD_PROVIDER config key is no longer filesystem; it now defaults through config.py.
3.2.0 · Dec 2020
· source
· release history
Adds HTML_SANITIZATION configuration key to enable server-side stripping of malicious JavaScript or HTML in rendered content.
3.0.0 · Jul 2020
· source
· release history
The team profile endpoint (/api/v1/teams/me) will now return 403 instead of 400 if the requesting user is not the captain
2.1.4 · Sep 2019
· source
· release history
The team profile endpoint (/api/v1/teams/me) will now return 403 instead of 400 if the requesting user is not the captain.
2.1.4 · Aug 2019
· source
· release history
Introduces the Team Captain role, allowing captains to edit team name, password, and website
2.1.0 · Apr 2019
· source
· release history
example
Integrate team membership checks into custom integrations, handling the new 403 error for non-captains.$ curl -s -o /dev/null -w '%{http_code}' https://<ctfd_host>/api/v1/teams/me
2.1.4 · Sep 2019
· source
+Challenge solution managementshippedAllow administrators to store and publish challenge solutions, enabling users to view them conditionally based on solves or admin settings.5 releases · first seen Sep 2025▸
Also counts toward: REST API
release
Changes GET /api/v1/solutions/[solution_id] to return 404 instead of 403 for hidden solutions.
3.8.1 · Nov 2025
· source
· release history
GET /api/v1/solutions/[solution_id] now returns 404 (not 403) when a solution is hidden — clients that branch on 403 to detect hidden solutions will need to be updated.
3.8.1 · Nov 2025
· source
· release history
New /api/v1/challenges/[challenge_id]/solution endpoint to check whether a challenge solution is accessible to the requesting user.
3.8.1 · Nov 2025
· source
· release history
Adds solved solution visibility mode, letting users view a challenge's solution only after they have solved it.
3.8.1 · Nov 2025
· source
· release history
Admins can now store and publish challenge solutions, accessible to users via /api/v1/challenges/[challenge_id]/solutions and unlocked through /api/v1/unlocks.
3.8.0 · Sep 2025
· source
· release history
+Bracket generationverifiedGenerate a configurable number of competition brackets via a CLI flag.5 other sources · first seen Sep 2025▸
command line
--brackets — Amount of brackets to generate
3.8.0 · Sep 2025
· command-line history
+Plugin migration systemshippedProvide a database migration framework for plugins to manage schema updates and upgrades programmatically.4 releases · first seen May 2020▸
release
Adds separate frozen and unfrozen scoreboard CSV exports (unfrozen available as scoreboard-admin CSV).
3.8.3 · Apr 2026
· source
· release history
Adds force_all parameter to CTFd.plugins.migrations.upgrade() enabling plugins to force-run all migrations.
3.8.2 · Feb 2026
· source
· release history
Improve CTFd.plugins.migrations.upgrade() to be able to upgrade to a specific plugin migration
2.4.3 · May 2020
· source
· release history
Adds the CTFd.plugins.migrations module with an upgrade function for plugin database migrations
2.4.2 · May 2020
· source
· release history
+Progress tracking metadatashippedExpose a count of solved challenges via API endpoints and UI to allow users to track their progress.3 releases · 1 other source · first seen Apr 2020▸
release
New /api/v1/statistics/progression/matrix endpoint backing the progression matrix view.
3.8.3 · Apr 2026
· source
· release history
Add the count meta field to /api/v1/users/me/solves, /api/v1/users/me/fails, /api/v1/users/me/awards, /api/v1/teams/me/awards, /api/v1/users/[user_id]/solves, /api/v1/users/[user_id]/fails, /api/v1/users/[user_id]/awards, /api/v1/teams/[team_id]/solves, and /api/v1/teams/[team_id]/awards
3.5.0 · May 2022
· source
· release history
Sets /api/v1/statistics/users route to be admins_only
2.3.2 · Apr 2020
· source
· release history
example
Retrieve paginated user solves using the new count meta field for progress tracking in UI$ curl https://<ctfd_host>/api/v1/users/me/solves?page=2 | jq '.meta.count'
3.5.0 · May 2022
· source
+Scoreboard bracket statistics and visualizationshippedProvide matrix-based visualizations of player progression through challenges and support for brackets within the Admin Panel statistics.4 releases · first seen Sep 2019▸
release
Updates progression matrix with browser-stored filters and a new challenge category column.
3.8.3 · Apr 2026
· source
· release history
Admin Panel scoreboard now supports brackets.
3.8.0 · Sep 2025
· source
· release history
Adds a matrix scoreboard to the Admin Panel Statistics page to visualise player progression through challenges.
3.8.0 · Sep 2025
· source
· release history
The statistics.js file has been renamed to graphs.js in the Admin Panel; custom themes relying on the old filename will fail to load.
2.1.4 · Sep 2019
· source
· release history
+Extended user profile fieldsshippedAllow custom profile fields such as affiliation, website, and country to be collected during user registration.3 releases · 1 other source · first seen Jul 2020▸
release
Custom fields named Affiliation or 'Website no longer automatically set the user's affiliation or website profile fields
3.6.0 · Aug 2023
· source
· release history
Adds ability to configure custom user and team fields via the Admin Panel's Custom Fields section
3.1.0 · Sep 2020
· source
· release history
affiliation, website, and country can now be accepted as additional profile fields during user registration (themes must provide the corresponding inputs)
3.0.0a2 · Jul 2020
· source
· release history
example
Define custom fields for registration by configuring the Admin Panel's Custom Fields section.$ In the Admin Panel, navigate to Configs > Custom Fields and define user/team fields.
3.1.0 · Sep 2020
· source
+Automated admin account initializationshippedAllow pre-creating an admin account and API token via configuration or CLI for fully automated deployments.2 releases · 1 other source · first seen Sep 2025▸
Also counts toward: CI/CD pipeline integration
release
New PRESET_ADMIN_NAME, PRESET_ADMIN_EMAIL, PRESET_ADMIN_PASSWORD, and PRESET_ADMIN_TOKEN keys in config.ini for pre-creating an admin account in automated deployments.
3.8.0 · Sep 2025
· source
· release history
New PRESET_CONFIGS key in config.ini allows pre-setting server-side configuration without completing the setup wizard or using the API.
3.8.0 · Sep 2025
· source
· release history
example
Pre-create an admin account and set a known API token for fully automated CTFd deployments (CI/CD pipelines, IaC).$ # config.ini [server] PRESET_ADMIN_NAME = admin PRESET_ADMIN_EMAIL = admin@example.com PRESET_ADMIN_PASSWORD = Ch4ng3Me! PRESET_ADMIN_TOKEN = my-known-api-token
3.8.0 · Sep 2025
· source
+Scoreboard visualization customizationshippedProvide options to customize the appearance and behavior of scoreboard charts, including dark mode, color schemes, animations, and JSON configuration overrides.3 releases · first seen Oct 2024▸
release
Updates the scoreboard score graph to reflect the currently active bracket.
3.7.4 · Oct 2024
· source
· release history
Enables overriding ECharts scoreboard and score-graph behavior via window.scoreboardChartOptions, window.teamScoreGraphChartOptions, and window.userScoreGraphChartOptions window objects.
3.7.4 · Oct 2024
· source
· release history
+Database connection configuration granularityshippedAllow database and Redis connections to be configured via individual environment variables instead of a single combined URL.2 releases · 1 other source · first seen Jan 2023▸
release
Add individual environment variable config keys for database connection: DATABASE_PROTOCOL, DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_PORT, and DATABASE_NAME as an alternative to DATABASE_URL
3.5.1 · Jan 2023
· source
· release history
Add individual environment variable config keys for Redis connection: REDIS_PROTOCOL, REDIS_USER, REDIS_PASSWORD, REDIS_HOST, REDIS_PORT, and REDIS_DB as an alternative to REDIS_URL
3.5.1 · Jan 2023
· source
· release history
example
Configure database connection using individual environment variables instead of DATABASE_URL$ export DATABASE_PROTOCOL="postgresql" export DATABASE_USER="ctfd_user" export DATABASE_PASSWORD="secret" export DATABASE_HOST="db.example.com" export DATABASE_PORT="5432" export…
3.5.1 · Jan 2023
· source
+Admin notification customizationshippedAllow administrators to configure the delivery method and audio settings for notifications sent through the admin panel.2 releases · 1 other source · first seen Dec 2019▸
release
Admins can now customize outgoing email content and inject variables using the new email templating capability.
2.3.0 · Feb 2020
· source
· release history
Admins can choose how to deliver their notifications (Toast, Alert, Background, Sound On/Off)
2.2.0 · Dec 2019
· source
· release history
example
Retrieve a notification including its rendered HTML version.$ curl https://ctfd.example.com/api/v1/notifications/<notification_id>?html=1 \ -H 'Authorization: Token <your_api_key>'
3.2.0 · Dec 2020
· source
+Configuration fallback retrievalshippedAllow administrators and the application to retrieve platform configuration values with optional default fallbacks when keys are unset in the database.2 releases · 1 other source · first seen Jan 2019▸
release
utils.get_app_config() adds a default argument and removes memoization
2.0.4 · Jan 2019
· source
· release history
get_config wrapper accepts a default parameter to return fallback values
2.0.4 · Jan 2019
· source
· release history
example
Allow admins to retrieve config values with a fallback if the key is not set in the database.$ get_config('smtp_host', default='mail.ctfd.io')
2.0.4 · Jan 2019
· source
+Frozen scoreboard exportshippedExport a static copy of the scoreboard at the time of freeze for archival or reporting purposes.2 releases · first seen Sep 2019▸
Also counts toward: CSV data export
release
Adds separate frozen and unfrozen scoreboard CSV exports (unfrozen available as scoreboard-admin CSV).
3.8.3 · Apr 2026
· source
· release history
The Challenge API will now properly freeze the solve count to freeze time
2.1.4 · Sep 2019
· source
· release history
+Host header validationshippedRestrict the CTFd instance to a allowlist of host names to mitigate host-header attacks.2 releases · first seen Feb 2025▸
release
Returns a description field in 401 error responses from the API.
3.8.3 · Apr 2026
· source
· release history
Adds TRUSTED_HOSTS configuration to restrict CTFd to allowlisted host names, hardening against host-header attacks.
3.7.6 · Feb 2025
· source
· release history
+User team data import/exportshippedImport users with their team assignments via CLI and export user/team data to CSV.1 release · 1 other source · first seen Apr 2026▸
Also counts toward: CSV data export
release
Adds CSV import & export for users that includes their team information.
3.8.3 · Apr 2026
· source
· release history
example
Import users along with their team assignments in bulk before a CTF starts.$ In the Admin Panel, go to Users > Import/Export and upload a CSV file containing user and team information.
3.8.3 · Apr 2026
· source
+Rate limiting enforcementshippedAllow challenge creators to define rate limits on submissions via a dedicated class and base method for plugin development.2 releases · first seen Feb 2022▸
Also counts toward: Plugin API support
release
Adds Ratelimiteds submission class and BaseChallenge.ratelimited() method for plugin developers to create rate-limited submission records.
3.8.2 · Feb 2026
· source
· release history
Make the Submissions per minute ratelimit configurable via a new input field in the Admin Panel rather than being hardcoded
3.4.1 · Feb 2022
· source
· release history
+Secure Docker deploymentshippedRun the Docker Compose environment as a non-root user to improve security posture.2 releases · first seen Feb 2026▸
release
Docker Compose deployment now runs as the ctfd user instead of root.
3.8.2 · Feb 2026
· source
· release history
The provided Docker Compose file no longer uses the root user and instead uses the ctfd user — file permission mappings tied to root in existing deployments may break on upgrade.
3.8.2 · Feb 2026
· source
· release history
+Submission type variantsshippedSupport additional submission types such as 'discard' to handle specific scoring behaviors like marking failed attempts as valid.2 releases · first seen Aug 2023▸
release
Adds ratelimit submission type so rate-limited attempts are tracked separately from incorrect submissions.
3.8.2 · Feb 2026
· source
· release history
Adds discard submission type to allow marking failed attempts as valid
3.6.0 · Aug 2023
· source
· release history
+Dynamic scoring decay functionsshippedAllow challenges with dynamic values to use linear or logarithmic decay algorithms to adjust scores over time.2 releases · first seen Aug 2023▸
release
Integrates dynamic scoring into the standard challenge type — all challenges now support initial, decay, minimum, and function fields for configurable scoring logic, removing the need for a separate plugin.
3.8.1 · Nov 2025
· source
· release history
Allows dynamic value challenges to use linear or logarithmic decay functions for scoring
3.6.0 · Aug 2023
· source
· release history
+Challenge rating and review systemshippedAllow participants to submit ratings and written reviews for challenges, with admin-configurable visibility and retrieval endpoints.1 release · 1 other source · first seen Sep 2025▸
release
Participants can submit upvotes/downvotes and written reviews on challenges via /api/v1/challenges/[challenge_id]/ratings; visibility is admin-configurable.
3.8.0 · Sep 2025
· source
· release history
example
Retrieve all ratings submitted for a challenge to gauge difficulty or quality feedback from participants.$ curl https://ctfd.example.com/api/v1/challenges/42/ratings \ -H 'Authorization: Token my-known-api-token'
3.8.0 · Sep 2025
· source
+Password policy configurationshippedAllow administrators to enforce minimum password lengths and force password changes on next login for security hardening.2 releases · first seen Sep 2025▸
release
New admin config option for minimum password length.
3.8.0 · Sep 2025
· source
· release history
Admins can now force users to change their password on next login via the change_password field on /api/v1/users/[user_id].
3.8.0 · Sep 2025
· source
· release history
+Scoreboard top accounts limitshippedEnforce a maximum cap on the number of top accounts returned by the scoreboard API.2 releases · first seen Apr 2025▸
release
The /api/v1/scoreboard/top/<count> endpoint now returns at most the top 50 accounts; requests for counts above 50 will be capped.
3.7.7 · Apr 2025
· source
· release history
The /api/v1/scoreboard/top/<count> endpoint now enforces a maximum return of top 50 accounts.
3.7.7 · Apr 2025
· source
· release history
+Plugin configuration panel extensionshippedAllow plugins to define and embed custom configuration templates into the Admin Config Panel via a dedicated config entry in their manifest.2 releases · first seen Jun 2024▸
Also counts toward: Plugin API support
release
Plugins that specify a config route now automatically appear in the Admin Panel under the Plugins section.
3.7.6 · Feb 2025
· source
· release history
Plugins can now define a config entry in config.json to define a template to embed into the Config Panel
3.7.1 · Jun 2024
· source
· release history
+Import status monitoringshippedCheck the status of a background import operation to know when it finishes.2 other sources · first seen May 2022▸
example
Check the status of a background CTF import to know when it finishes$ curl -s http://<ctfd_host>/admin/import | jq .
3.5.0 · May 2022
· source
Import a CTFd backup and automatically remove the file upon completion$ python manage.py import_ctf <path_to_backup> --delete_import_on_finish
3.5.0 · May 2022
· source
+IP geolocationshippedConvert user IP addresses into guessed countries using GeoIP data.2 releases · first seen Jul 2020▸
release
Add city geolocation to Team Profile IP addresses
3.5.0 · May 2022
· source
· release history
Add GeoIP support to convert user IP addresses into guessed countries.
3.0.0a1 / 2020-07-01 · Jul 2020
· source
· release history
+Bulk management operationsshippedEnable administrators to select and delete multiple entities (Users, Teams, Challenges, etc.) in bulk via the Admin Panel.2 releases · first seen May 2020▸
Also counts toward: Web management console
release
Adds filters for Account ID, Challenge ID, and Challenge Name to the Admin Panel Submissions page
3.0.1 · Aug 2020
· source
· release history
Bulk selection and deletion capabilities for Users, Teams, Scoreboard, Challenges, and Submissions in the Admin Panel
2.4.0 · May 2020
· source
· release history
+Programmatic progression matrix accessshippedProvide API access to progression matrix data for custom reporting and dashboarding.1 other source · first seen Apr 2026▸
+Theme restoration on backupshippedAutomatically apply the theme from a backup file during restore operations if one is available.1 release · first seen Apr 2026▸
release
When restoring from a backup, automatically applies the theme from the backup if available, falling back to the default.
3.8.3 · Apr 2026
· source
· release history
+User data response cachingshippedCache API responses for user and team profile data to reduce backend load.1 release · first seen Apr 2026▸
release
Adds response caching to /api/v1/users/[user_id] and /api/v1/teams/[team_id].
3.8.3 · Apr 2026
· source
· release history
+Duplicate solve handlingshippedProvide a consistent exception signal to plugins when a duplicate challenge solve is encountered.1 release · first seen Feb 2026▸
Also counts toward: Plugin API support
release
Raises ChallengeSolveException in BaseChallenge.solve() when a duplicate solve is encountered, giving plugins a consistent signal to handle.
3.8.2 · Feb 2026
· source
· release history
+Plugin function overridingshippedAllow plugins to override existing platform functions through a global application registry.1 release · first seen Feb 2026▸
Also counts toward: Plugin API support
release
Adds app.overridden_functions global allowing plugins to override supported platform functions.
3.8.2 · Feb 2026
· source
· release history
+Challenge interaction trackingshippedLog and expose metadata regarding user interactions with challenges, such as the first time a challenge is opened.1 release · first seen Sep 2025▸
release
CTFd logs a challenges.open tracking event in the Tracking table the first time a user opens a challenge.
3.8.0 · Sep 2025
· source
· release history
+Email confirmation interaction requirementshippedRequire additional user interaction on email confirmation links to improve anti-phishing compatibility.1 release · first seen Sep 2025▸
release
New EMAIL_CONFIRMATION_REQUIRE_INTERACTION key in config.ini requires additional user interaction on confirmation links to improve anti-phishing compatibility.
3.8.0 · Sep 2025
· source
· release history
+Max attempts cooldown logicshippedConfigure max attempts to act as a timed cooldown or lockout period rather than a permanent restriction.1 release · first seen Sep 2025▸
release
Max Attempts can now act as a timed cooldown (e.g., 5-minute lockout) rather than a permanent lockout.
3.8.0 · Sep 2025
· source
· release history
+Submission history visibility controlshippedAllow users and administrators to configure the visibility of past submission data via API endpoints.1 release · first seen Sep 2025▸
release
Adds configurable visibility for users' own past submissions via new /api/v1/users/me/submissions endpoint and admin toggle.
3.8.0 · Sep 2025
· source
· release history
+Passwordless password resetshippedAllow users to set a password for the first time without requiring confirmation of a previous password.1 release · first seen Dec 2024▸
release
Supports setting a password without requiring a previous password confirmation when a user or team has no password set.
3.7.5 · Dec 2024
· source
· release history
+Cross-Origin header configurationshippedAllow administrators to configure the Cross-Origin-Opener-Policy HTTP header to control browser isolation behavior.1 release · first seen Jun 2024▸
release
Add CROSS_ORIGIN_OPENER_POLICY setting to control the Cross-Origin-Opener-Policy header
3.7.2 · Jun 2024
· source
· release history
+Paginated listing empty response handlingshippedAdjust paginated listing endpoints to return a 200 status with empty results instead of a 404 when no items are found.1 release · first seen Jun 2024▸
release
Disable returning 404s in listing pages with pagination, returning 200 with an empty listing instead
3.7.2 · Jun 2024
· source
· release history
+Scoreboard bracket support in API and UIshippedAllow administrators and users to view, filter, and manage scoreboard data within specific competition brackets via API endpoints, CSV exports, and frontend interfaces.1 release · first seen Feb 2024▸
Also counts toward: CSV data export, REST API
release
/api/v1/scoreboard now returns bracket_name and bracket_id to support sub-scoreboards
3.7.0 · Feb 2024
· source
· release history
+Docker health check bypassshippedAllow the Docker container startup to skip database availability pings via an environment variable for environments with delayed DB readiness.1 release · first seen Aug 2023▸
release
Adds SKIP_DB_PING environment variable to skip database availability checks in the Docker image
3.6.0 · Aug 2023
· source
· release history
+Hint visibility for unauthenticated usersshippedDisplay free hints associated with a challenge to users who have not logged in, provided the challenge itself is visible.1 release · first seen Aug 2023▸
release
Shows free hints to unauthenticated users when the challenge itself is visible to them
3.6.0 · Aug 2023
· source
· release history
+HTML sanitization configurationshippedProvide a global configuration option to control HTML sanitization behavior within the platform.1 release · first seen Aug 2023▸
release
Adds HTML_SANITIZATION config option in the Admin Panel's Config section and config.ini
3.6.0 · Aug 2023
· source
· release history
+Submission reversal endpointshippedProvide an API endpoint to reverse previous submission decisions, such as marking a previously incorrect submission as correct.1 release · first seen Aug 2023▸
release
Adds PATCH /api/v1/submissions/[submission_id] endpoint to mark incorrect submissions as correct
3.6.0 · Aug 2023
· source
· release history
+Admin robots.txt managementshippedAllow administrators to configure robot access rules via a dedicated section in the Admin Panel.1 release · first seen May 2023▸
Also counts toward: Web management console
release
Adds robots.txt configuration controls in the Admin Panel for administrators to manage robot access rules
3.5.2 · May 2023
· source
· release history
+Plugin email provider extensionshippedExpose email provider classes to plugins, allowing them to customize or replace the default email sending logic.1 release · first seen Jan 2023▸
Also counts toward: Plugin API support
release
Expose CTFd.utils.email.providers.EmailProvider, MailgunEmailProvider, and SMTPEmailProvider classes for customizing email sending via plugins
3.5.1 · Jan 2023
· source
· release history
+Asset URL optimizationshippedProvide a route to serve frontend assets without file extensions to support caching or build workflows.1 release · first seen May 2022▸
release
Add views.themes_beta route to avoid .dev/.min extension on frontend asset urls
3.5.0 · May 2022
· source
· release history
+User data exposure in frontend contextshippedExpose user identification details including name, email, and team affiliation to the frontend JavaScript environment.1 release · first seen May 2022▸
release
Add userName, userEmail, teamId, and teamName to the CTFd init object in base.html
3.5.0 · May 2022
· source
· release history
+Admin panel page editingshippedEnable administrators to create and edit static Pages within the Admin Panel using raw HTML content.1 release · first seen Aug 2021▸
release
Enables Admin Panel users to write Pages using raw HTML instead of only Markdown.
3.4.0 · Aug 2021
· source
· release history
+Registration access controlshippedAllow administrators to require a password for account registration, restricting new user creation until the specified key is provided.1 release · first seen Aug 2021▸
release
Adds registration password requirement capability, restricting account creation until a specified password is provided.
3.4.0 · Aug 2021
· source
· release history
+Plugin discovery APIshippedAllow the application to list available installed plugins via a dedicated API endpoint.1 release · first seen May 2020▸
Also counts toward: Plugin API support
release
Add CTFd.plugins.get_plugin_names() to get a list of available plugins
2.4.3 · May 2020
· source
· release history
+Email domain restriction enforcementshippedRestrict user email addresses and email changes to a specified list of approved domains to prevent unauthorized or phishing-related addresses.1 release · first seen Jan 2019▸
release
email.check_email_is_whitelisted() enforces domain whitelist for user email changes
2.0.4 · Jan 2019
· source
· release history
Lines in monospace are the tool's own words: help text
parsed from its source, or an endpoint from its API document. Under
release, a line is our summary of a dated release. Under
docs, it is quoted from the tool's own documentation or
website. Each links back to the source it came from.
Command line
View
Source
No command matches.
load a captured run
composed command
No matchesTry a different search, or clear a filter to see more.
option surface across analysed releases
options at that releaseadded, per releaseremoved, per release
option
found in
since
description
No matchesTry a different search, or clear a filter to see more.
option changes per release — drag across the rail to set a range
→
Values are placeholders taken from each option’s declared default.
Nothing is executed here — the output shown is a recording of a run
that already happened.
Screenshots
From the release notes, newest first. Click one to see it full size.
Breaking-change disciplinehow rarely a release breaks users, and notice given
Maintenance riskquiet time against its own cadence, maintainers
Innovation & surfacenew capabilities, API and MCP surface
Community health
Contributor trenddistinct committers, this year against last
Maintainer concentrationbus factor now against a year ago
Issue backlog trendissues closed per issue opened, 12 months
Responsivenessmedian time to a maintainer’s first reply
Nine scores for CTFd, each built from the releases, notes and API history this site tracks — and, on Researcher and Business, where it stands among every measured tool in its category and how that has moved.
Each score is 0–100 on a published rubric, derived from data this site already shows.
A dimension we cannot measure says so — it is never scored 0 and never enters a rank.
How this is scored
Shipping velocity — releases a month over the last 12 months, on a log scale where 16 a month scores 100. Needs 3 releases in the window.
Documentation quality — the release-notes rubric published on the analytics page, unchanged.
Breaking-change discipline — the share of releases carrying a breaking change (none scores 100, half or more scores 0). Only projects that label breaking changes are measured: a clean record cannot be told from an unlabelled one.
Maintenance risk — quiet time measured against the tool's own release cadence (quiet longer than 90 days and three typical gaps scores 0), plus the number of active maintainers and whether contributors are growing, where known. Higher is lower risk.
Innovation & surface — new capabilities in the feature ledger this year, API and MCP operations added, and the share of commits that are features: the mean of whichever we hold.
Community health (open-source tools only) — each is a direction, not a size: contributors this year against last, the bus factor now against a year ago, and issues closed per issue opened, where steady scores 50, doubled 100 and halved 0; plus the median time to a maintainer's first reply (an hour scores about 100, a month or more 0). A commercial card has no repository and carries none of the four.
Documented delivery (commercial tools) — when a vendor's documented new capabilities have slowed against its own baseline, that counts against the overall standing as heavily as two low dimensions. Steady delivery, or too little history to judge, leaves the standing alone; it is never a sixth score.
Open-source tools are scored on repository signals; commercial tools on their published changelog. Ranks compare tools within one category and one profile and need at least five measured peers; the overall standing needs three ranked dimensions. Best-in-breed or consolidator is a shape, not a quality, and is never scored.
Release-note detail over time
See how much detail CTFd puts in its release notes, quarter by quarter, and compare it with tracked tools in the same category. This history uses up to ten retained, reviewed notes per tool; sparse or blank older quarters may reflect that limit.
Issue, contributor and maintainer activity in isislab/CTFd, 2023-10 – 2026-09,
as of 2026-09-25. Twelve-month figures first; the trend lines run
the whole window.
Contributors15−1 vs prior 12 months
Maintainers1+0 joined · −0 left, last 12 months
Bus factor1committers behind half the commits
Community-filednot measuredof issues opened, last 12 months
Median time to closenot measuredissues closed, last 12 months
Open backlognot measuredopen issues today
Issues opened / monthnot measured
Open backlognot measured
Contributors / month3
Commits / month4
Stars6,841
Issue themes, last 12 monthsnot measured
Counts from the project's public repository and git history; no individuals
are identified. Maintainers are the committers covering 80% of the last year's
commits. how we measure this
Add the badge to your README
Maintain this project? The badge links readers straight to this page, so they can
follow every release here.