Quick answer: Godot custom feature tag set in the export preset but OS.has_feature("mygame_demo") still returns false? The tag is in the preset but spelled differently in code, or the build was overridden.

A demo export should hide pay-only content based on a custom demo feature tag, but the check returns false in the built game.

Define Feature in Preset

Export → (preset) → Features → add a custom tag like demo. The tag is baked into the exported binary’s feature set.

Query in Code

if OS.has_feature("demo"):
    locked_panel.hide()

Case-sensitive. Demodemo. Centralize the strings in a constants script.

Project Settings Overrides

Project Settings supports per-feature overrides on the same setting (application/config/name.demo, etc.). Useful for changing window title, default scenes per feature.

Stand-alone Detection

Standard feature tags (windows, macos, mobile, editor, debug, release) are added automatically. Use these in code rather than detecting platform via OS.get_name.

Verifying

The exported demo build returns true for demo and hides paid features. The full build returns false and shows everything.

“Feature tags live on the export preset and query via OS.has_feature. Strings are case-sensitive.”

Define feature tag constants in autoload — one source of truth, no typo debugging.