PAGES
← all tools
◆ General Utilities & Libraries

CTFd

v1 open-source

CTFd is a Capture The Flag framework focusing on ease of use and customizability, with everything needed to run a CTF.

Summary

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.

How CTFd helps

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

all 62 features, with the evidence for each →

Languages

Arabic, Bulgarian, Catalan, Chinese (Simplified), Chinese (Traditional), Croatian, Czech, Finnish, French, German, Greek, Hebrew, Indonesian, Italian, Japanese, Korean, Lithuanian, Norwegian, Persian, Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovenian, Spanish, Swedish, Turkish, Vietnamese Interface: Arabic, Bulgarian, Catalan, Chinese (Simplified), Chinese (Traditional), Croatian, Czech, Finnish, French, German, Greek, Hebrew, Indonesian, Italian, Japanese, Korean, Lithuanian, Norwegian, Persian, Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovenian, Spanish, Swedish, Turkish, Vietnamese · Release notes: Catalan, Chinese (Simplified), Croatian, Czech, Finnish, German, Greek, Hebrew, Indonesian, Italian, Japanese, Norwegian, Polish, Romanian, Serbian, Slovak, Slovenian, Spanish, Swedish, Turkish, Vietnamese Indonesian added in 3.8.5 (May 19, 2026) · Czech, Serbian added in 3.8.3 (Apr 11, 2026) · Croatian, Norwegian, Turkish added in 3.8.2 (Feb 5, 2026) · Hebrew added in 3.8.1 (Nov 6, 2025) · Finnish, Greek, Romanian, Slovenian, Swedish added in 3.7.6 (Feb 20, 2025)

Features

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.

Compare with peers →

What CTFd offers you

  • Plugin API support6
  • REST API6
  • CSV data export3
  • Web management console3
  • CI/CD pipeline integration1
  • Command-line interface1
  • JavaScript scripting support1
  • Role-based access control1
All capabilities 62 capabilities
Challenge management verified Create, 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
  • POST /challenges: response schema changed v1 · Aug 2026 · source · release history
  • GET /challenges: 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

api 38 total

Module management verified Group challenges into modules and manage those modules via create, read, update, and delete operations. 19 releases · 9 other sources · first seen Dec 2017

Also counts toward: REST API

release 19 total

docs

  • 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. Modules listing in the Admin Panel 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

api

Submission review and invalidation verified Mark 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

api 9 total

Audience management verified Define 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

api 9 total

Data import via CLI verified Import 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

command line

example

  • 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 management shipped Provide 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 management shipped Enable 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
  • Adds Serbian and Czech translations. 3.8.3 · Apr 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 IP shipped Enable 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 configuration shipped Allow 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 updates shipped Provide 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 configuration shipped Allow 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 privileges shipped Introduce 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 management shipped Allow 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 generation verified Generate a configurable number of competition brackets via a CLI flag. 5 other sources · first seen Sep 2025

command line

api

Plugin migration system shipped Provide 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 metadata shipped Expose 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 visualization shipped Provide 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 fields shipped Allow 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 initialization shipped Allow 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 customization shipped Provide 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
  • Adds dark mode to the core-beta theme. 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 granularity shipped Allow 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 customization shipped Allow 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 retrieval shipped Allow 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 export shipped Export 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 validation shipped Restrict 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/export shipped Import 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 enforcement shipped Allow 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 deployment shipped Run 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 variants shipped Support 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 functions shipped Allow 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 system shipped Allow 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 configuration shipped Allow 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 limit shipped Enforce 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 extension shipped Allow 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 monitoring shipped Check 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 geolocation shipped Convert 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 operations shipped Enable 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 access shipped Provide API access to progression matrix data for custom reporting and dashboarding. 1 other source · first seen Apr 2026

example

  • Pull progression matrix data programmatically to build custom reporting dashboards. curl -H 'Authorization: Token <admin_token>' https://<ctfd_host>/api/v1/statistics/progression/matrix 3.8.3 · Apr 2026 · source
Theme restoration on backup shipped Automatically 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 caching shipped Cache 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 handling shipped Provide 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 overriding shipped Allow 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 tracking shipped Log 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 requirement shipped Require 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 logic shipped Configure 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 control shipped Allow 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 reset shipped Allow 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 configuration shipped Allow 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 handling shipped Adjust 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 UI shipped Allow 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 bypass shipped Allow 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 users shipped Display 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 configuration shipped Provide 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 endpoint shipped Provide 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 management shipped Allow 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 extension shipped Expose 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 optimization shipped Provide 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 context shipped Expose 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 editing shipped Enable 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 control shipped Allow 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 API shipped Allow 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 enforcement shipped Restrict 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.

Screenshots

From the release notes, newest first. Click one to see it full size.

docs update Oct 3, 2026

Score card

  1. Shipping velocity releases a month, last 12 months
  2. Documentation quality release-notes rubric, 0–100
  3. Breaking-change discipline how rarely a release breaks users, and notice given
  4. Maintenance risk quiet time against its own cadence, maintainers
  5. Innovation & surface new capabilities, API and MCP surface
  6. Community health
  7. Contributor trend distinct committers, this year against last
  8. Maintainer concentration bus factor now against a year ago
  9. Issue backlog trend issues closed per issue opened, 12 months
  10. Responsiveness median 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.

Score cards are part of every paid plan.

See plans →

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.

Checking release-note history…

Explore the full chart →

Releases

Show

61 entries

  1. October 20262
  2. August 20261
  3. June 20262
  4. May 20261
  5. April 20261
  6. February 20261
  7. November 20251
  8. September 20251
  9. April 20251
  10. February 20251
  11. December 20241
  12. October 20241
  13. July 20241
  14. June 20242
  15. February 20241
  16. December 20231
  17. August 20231
  18. May 20231
  19. January 20231
  20. May 20221
  21. February 20221
  22. August 20211
  23. March 20211
  24. December 20201
  25. September 20202
  26. August 20201
  27. July 20205
  28. June 20201
  29. May 20203
  30. April 20201
  31. March 20201
  32. February 20201
  33. January 20201
  34. December 20191
  35. August 20191
  36. June 20191
  37. May 20191
  38. April 20191
  39. January 20192
  40. December 20181
  41. May 20181
  42. March 20181
  43. January 20181
  44. December 20171
  45. October 20171
  46. September 20171
  47. July 20171
  48. April 20171
  49. March 20171
  50. January 20171
    Show

    61 entries

    Project health

    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.

    1. Contributors 15 −1 vs prior 12 months
    2. Maintainers 1 +0 joined · −0 left, last 12 months
    3. Bus factor 1 committers behind half the commits
    4. Community-filed not measured of issues opened, last 12 months
    5. Median time to close not measured issues closed, last 12 months
    6. Open backlog not measured open issues today
    1. Issues opened / month not measured
    2. Open backlog not measured
    3. Contributors / month 3
    4. Commits / month 4
    5. Stars 6,841
    Issue themes, last 12 months not 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.

    Tracked by Cyber Toolchain Choose a badge style and copy the code →
    browse all tools → score card for your toolchain →