/godot-project-setup
Use when creating a new Godot 4.x project — scaffolds recommended directory structure, project settings, autoloads, and .gitignore
$ npx -y skills add jame581/GodotPrompter --skill godot-project-setup --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/godot-project-setup
Context preview
The summary Claude sees to decide when to auto-load this skill.
Use when creating a new Godot 4.x project — scaffolds recommended directory structure, project settings, autoloads, and .gitignore
SKILL.md
godot-project-setup.SKILL.mdname: godot-project-setup
description: Use when creating a new Godot 4.x project — scaffolds recommended directory structure, project settings, autoloads, and .gitignore
Godot Project Setup
This skill scaffolds a new Godot 4.3+ project with recommended directory structure, project settings, autoloads, and version control configuration.
> **Related skills:** **scene-organization** for structuring scene trees, **event-bus** for the EventBus autoload pattern, **save-load** for the SaveManager autoload pattern.
Recommended Directory Structure (Split Layout)
The split layout separates assets, scenes, and scripts into distinct top-level directories. This scales well for medium-to-large projects and makes it easy to find resources by type.
res://
├── assets/
│ ├── audio/
│ │ ├── music/
│ │ └── sfx/
│ ├── fonts/
│ ├── shaders/
│ ├── sprites/
│ │ ├── characters/
│ │ ├── environment/
│ │ └── ui/
│ └── textures/
├── scenes/
│ ├── autoloads/
│ ├── characters/
│ ├── environment/
│ ├── levels/
│ ├── screens/
│ └── ui/
├── scripts/
│ ├── autoloads/
│ ├── characters/
│ ├── components/
│ ├── resources/
│ └── ui/
├── resources/
│ ├── items/
│ ├── levels/
│ └── themes/
└── addons/
**Why split layout?**
- Assets managed by artists can be updated without touching script directories.
- Glob patterns in export presets are simpler (`assets/**` stays separate from `scripts/**`).
- Easier to configure `.gitattributes` binary rules per directory.
- Scales to teams where artists and programmers work in different areas.
Alternative: Co-Located Structure
For solo projects or small teams, keep scenes and scripts together by feature. Easier to move a feature wholesale; harder to apply binary `gitattributes` rules.
res://
├── assets/
│ ├── audio/
│ ├── fonts/
│ └── textures/
├── entities/
│ ├── player/
│ │ ├── player.tscn
│ │ ├── player.gd # or Player.cs
│ │ └── player_state.gd
│ └── enemy/
│ ├── enemy.tscn
│ └── enemy.gd
├── levels/
│ ├── level_01/
│ │ ├── level_01.tscn
│ │ └── level_01.gd
│ └── main_menu/
│ ├── main_menu.tscn
│ └── main_menu.gd
├── systems/
│ ├── inventory/
│ └── dialogue/
├── autoloads/
├── resources/
└── addons/
.gitignore
# Godot editor data — never commit
.godot/
# Export artifacts
*.apk
*.aab
*.ipa
*.exe
*.x86_64
*.x86_32
*.arm32
*.arm64
*.pck
*.zip
export/
# C# / Mono build output
.mono/
.import/
bin/
obj/
*.csproj.user
*.sln.user
*.user
# IDE and OS files
.vs/
.vscode/settings.json
.idea/
*.swp
.DS_Store
Thumbs.db
# GodotPrompter (if used in-project)
.godot-prompter-cache/
.gitattributes
Normalize line endings for text files and mark binary assets so Git does not attempt text diffs on them.
# Default: normalize line endings to LF on commit
* text=auto eol=lf
# Godot-specific text files
*.gd text eol=lf
*.gdshader text eol=lf
*.gdshaderinc text eol=lf
*.tscn text eol=lf
*.tres text eol=lf
*.godot text eol=lf
*.cfg text eol=lf
*.import text eol=lf
# C# source
*.cs text eol=lf
*.csproj text eol=lf
*.sln text eol=lf
# Binary assets — no diff, no merge, no EOL conversion
*.png binary
*.jpg binary
*.jpeg binary
*.webp binary
*.svg binary
*.psd binary
*.aseprite binary
*.wav binary
*.ogg binary
*.mp3 binary
*.ttf binary
*.otf binary
*.woff binary
*.woff2 binary
*.glb binary
*.gltf binary
*.blend binary
*.fbx binary
*.mp4 binary
*.ogv binary
Project Settings
Configure these in `Project > Project Settings` or directly in `project.godot`.
Display
| Setting | Recommended value | Notes | |---|---|---| | `display/window/size/viewport_width` | 1920 | Base resolution — art reference size | | `display/window/size/viewport_height` | 1080 | | | `display/window/stretch/mode` | `canvas_items` | Scales 2D content; use `viewport` for pixel-perfect | | `display/window/stretch/aspect` | `keep` | Adds letterbox/pillarbox; `expand` fills screen | | `display/window/size/resizable` | `true` | Allow window resize on desktop |
For pixel-art projects use `stretch/mode = viewport` and `texture_filter = nearest` on the root CanvasItem or globally via `rendering/textures/canvas_textures/default_texture_filter`.
> **Godot 4.7+:** Projects **newly created** in Godot 4.7 already default `display/window/stretch/mode` to `canvas_items` and `display/window/stretch/aspect` to `expand` (previously `disabled` / `keep`), so only `aspect` needs changing if you want `keep`'s letterboxing. Projects created on older versions keep their existing values — set both explicitly when upgrading.
Input Map
Define actions in `Project > Project Settings > Input Map` rather than hard-coding key constants. This lets players rebind controls at runtime.
**GDScript — reading input actions:**
# Good: action-based (rebindable)
func _process(delta: float) -> void:
var direction := Input.get_axis("move_left", "move_right")
if Input.is_action_just_pressed("jump"):
_jump()
# Avoid: hard-coded key checks
func _input(event: InputEvent) -> void:
if event is InputEventKey and event.keycode == KEY_SPACE:
_jump()**C# — reading input actions:**
// Good: action-based (rebindable)
public override void _Process(double delta)
{
float direction = Input.GetAxis("move_left", "move_right");
if (Input.IsActionJustPressed("jump"))
Jump();
}
// Avoid: hard-coded key checks
public override void _Input(InputEvent @event)
{
if (@event is InputEventKey key && key.Keycode == Key.Space)
Jump();
}**Saving and restoring custom bindings at runtime (GDScript):**
func save_bindings() -> void:
var config := ConfigFile.new()
for action in InputMap.get_actions():
if action.begins_with("ui_"):
continue # skip built-in UI actions
var events := InputMap.action_get_events(action)
config.set_value("bindingsRead more
name: godot-project-setup description: Use when creating a new Godot 4.x project — scaffolds recommended directory structure, project settings, autoloads, and .gitignore
Godot Project Setup
This skill scaffolds a new Godot 4.3+ project with recommended directory structure, project settings, autoloads, and version control configuration.
> **Related skills:** **scene-organization** for structuring scene trees, **event-bus** for the EventBus autoload pattern, **save-load** for the SaveManager autoload pattern.
Recommended Directory Structure (Split Layout)
The split layout separates assets, scenes, and scripts into distinct top-level directories. This scales well for medium-to-large projects and makes it easy to find resources by type.
res:// ├── assets/ │ ├── audio/ │ │ ├── music/ │ │ └── sfx/ │ ├── fonts/ │ ├── shaders/ │ ├── sprites/ │ │ ├── characters/ │ │ ├── environment/ │ │ └── ui/ │ └── textures/ ├── scenes/ │ ├── autoloads/ │ ├── characters/ │ ├── environment/ │ ├── levels/ │ ├── screens/ │ └── ui/ ├── scripts/ │ ├── autoloads/ │ ├── characters/ │ ├── components/ │ ├── resources/ │ └── ui/ ├── resources/ │ ├── items/ │ ├── levels/ │ └── themes/ └── addons/
**Why split layout?**
- Assets managed by artists can be updated without touching script directories.
- Glob patterns in export presets are simpler (`assets/**` stays separate from `scripts/**`).
- Easier to configure `.gitattributes` binary rules per directory.
- Scales to teams where artists and programmers work in different areas.
Alternative: Co-Located Structure
For solo projects or small teams, keep scenes and scripts together by feature. Easier to move a feature wholesale; harder to apply binary `gitattributes` rules.
res:// ├── assets/ │ ├── audio/ │ ├── fonts/ │ └── textures/ ├── entities/ │ ├── player/ │ │ ├── player.tscn │ │ ├── player.gd # or Player.cs │ │ └── player_state.gd │ └── enemy/ │ ├── enemy.tscn │ └── enemy.gd ├── levels/ │ ├── level_01/ │ │ ├── level_01.tscn │ │ └── level_01.gd │ └── main_menu/ │ ├── main_menu.tscn │ └── main_menu.gd ├── systems/ │ ├── inventory/ │ └── dialogue/ ├── autoloads/ ├── resources/ └── addons/
.gitignore
# Godot editor data — never commit .godot/ # Export artifacts *.apk *.aab *.ipa *.exe *.x86_64 *.x86_32 *.arm32 *.arm64 *.pck *.zip export/ # C# / Mono build output .mono/ .import/ bin/ obj/ *.csproj.user *.sln.user *.user # IDE and OS files .vs/ .vscode/settings.json .idea/ *.swp .DS_Store Thumbs.db # GodotPrompter (if used in-project) .godot-prompter-cache/
.gitattributes
Normalize line endings for text files and mark binary assets so Git does not attempt text diffs on them.
# Default: normalize line endings to LF on commit * text=auto eol=lf # Godot-specific text files *.gd text eol=lf *.gdshader text eol=lf *.gdshaderinc text eol=lf *.tscn text eol=lf *.tres text eol=lf *.godot text eol=lf *.cfg text eol=lf *.import text eol=lf # C# source *.cs text eol=lf *.csproj text eol=lf *.sln text eol=lf # Binary assets — no diff, no merge, no EOL conversion *.png binary *.jpg binary *.jpeg binary *.webp binary *.svg binary *.psd binary *.aseprite binary *.wav binary *.ogg binary *.mp3 binary *.ttf binary *.otf binary *.woff binary *.woff2 binary *.glb binary *.gltf binary *.blend binary *.fbx binary *.mp4 binary *.ogv binary
Project Settings
Configure these in `Project > Project Settings` or directly in `project.godot`.
Display
| Setting | Recommended value | Notes | |---|---|---| | `display/window/size/viewport_width` | 1920 | Base resolution — art reference size | | `display/window/size/viewport_height` | 1080 | | | `display/window/stretch/mode` | `canvas_items` | Scales 2D content; use `viewport` for pixel-perfect | | `display/window/stretch/aspect` | `keep` | Adds letterbox/pillarbox; `expand` fills screen | | `display/window/size/resizable` | `true` | Allow window resize on desktop |
For pixel-art projects use `stretch/mode = viewport` and `texture_filter = nearest` on the root CanvasItem or globally via `rendering/textures/canvas_textures/default_texture_filter`.
> **Godot 4.7+:** Projects **newly created** in Godot 4.7 already default `display/window/stretch/mode` to `canvas_items` and `display/window/stretch/aspect` to `expand` (previously `disabled` / `keep`), so only `aspect` needs changing if you want `keep`'s letterboxing. Projects created on older versions keep their existing values — set both explicitly when upgrading.
Input Map
Define actions in `Project > Project Settings > Input Map` rather than hard-coding key constants. This lets players rebind controls at runtime.
**GDScript — reading input actions:**
# Good: action-based (rebindable)
func _process(delta: float) -> void:
var direction := Input.get_axis("move_left", "move_right")
if Input.is_action_just_pressed("jump"):
_jump()
# Avoid: hard-coded key checks
func _input(event: InputEvent) -> void:
if event is InputEventKey and event.keycode == KEY_SPACE:
_jump()**C# — reading input actions:**
// Good: action-based (rebindable)
public override void _Process(double delta)
{
float direction = Input.GetAxis("move_left", "move_right");
if (Input.IsActionJustPressed("jump"))
Jump();
}
// Avoid: hard-coded key checks
public override void _Input(InputEvent @event)
{
if (@event is InputEventKey key && key.Keycode == Key.Space)
Jump();
}**Saving and restoring custom bindings at runtime (GDScript):**
func save_bindings() -> void:
var config := ConfigFile.new()
for action in InputMap.get_actions():
if action.begins_with("ui_"):
continue # skip built-in UI actions
var events := InputMap.action_get_events(action)
config.set_value("bindingsAgentic skills framework for Godot 4.x game development. Gives AI coding agents domain-specific expertise for GDScript and C# projects.
Other skills on godot-prompter.
- /authoring-godot-prompter-skills
Use when writing or editing a SKILL.md or an agent definition in this repo — required frontmatter, section ordering, and the GDScript-then-C# example convention.
Open skill - /releasing-godot-prompter
Use when cutting a GodotPrompter release or bumping its version — the version-bump sequence, tag-triggered workflow, and the marketplace manifests that must follow.
Open skill - /2d-essentials
Use when working with 2D-specific systems — TileMaps, parallax scrolling, 2D lights and shadows, canvas layers, particles 2D, custom drawing, and 2D meshes in Godot 4.3+
Open skill - /3d-essentials
Use when working with 3D-specific systems — materials, lighting, shadows, environment, global illumination, fog, LOD, occlusion culling, and decals in Godot 4.3+
Open skill - /ability-system
Use when building character abilities — Resource-based abilities with cost/cooldown/cast, buffs/debuffs, stat modifiers, gameplay tags, and HUD binding
Open skill - /addon-development
Use when creating Godot editor plugins — EditorPlugin, @tool scripts, custom inspectors, and dock panels
Open skill

