Why your prototype is not a template yet
A game jam prototype proves an idea, but it also collects shortcuts. Hard coded paths, test sprites named final_final2.png, an input map you changed at 2 a.m., and a single scene that does everything. If you copy that folder for the next jam, you copy the mess.
A useful godot starter project does the opposite. It starts clean, runs on first open, and gives you obvious places for art, audio, levels, and UI. Spend one focused cleanup pass now and every future idea starts from a working baseline instead of a blank project.
Step 1: Reset to a clean Godot folder structure
Close Godot, duplicate your prototype folder as a backup, then create a fresh working copy called jam_template. Inside that copy, rebuild the top level so it matches this layout:
res://
addons/
art/placeholder/
audio/music/
audio/sfx/
scenes/levels/
scenes/ui/
scripts/autoload/
scripts/game/
ui/theme/
README.md
icon.svg
project.godot
export_presets.cfgKeep this rule simple: scenes live in scenes, logic lives in scripts, and nothing game specific lives in the root. Here is how to divide it:
| Folder | What lives there | Rule to keep it clean |
|---|---|---|
scenes/levels | One LevelBase.tscn and one example Level01.tscn | No logic in the root node except wiring signals |
scenes/ui | MainMenu.tscn, HUD.tscn, PauseMenu.tscn | Every menu works with keyboard and joypad |
scripts/autoload | GameConfig.gd, SaveService.gd, AudioBus.gd | Autoloads hold state, never hold level layout |
art/placeholder | Grid textures, a capsule sprite, simple tiles | Anything here is safe to replace without breaking scenes |
Prune first, then organize
- Delete
.godot, logs, and old builds. They regenerate on import. - Move jam specific sprites into
art/placeholderor delete them if they have no license note. - Break up a god scene. Keep one player scene, one HUD scene, and one level loader.
- Rename nodes and files with full words, such as
Player,CoinPickup, anddamage_area, notNode2D7.- If a script is only used by one scene, move it next to that scene in the same folder.
Tip: if a file makes you hesitate for more than ten seconds, it does not belong in a template. Delete it and add a note in the README about how to recreate it.
Step 2: Swap in placeholder art and config
Your template should run with zero missing dependencies. Replace jam sprites with generated placeholders that have the right size and pivot, even if they look plain. A 32 by 32 grid box, a capsule for the player, and a flat color tile are enough for collision, camera, and movement tests.
If you already use a templates workflow for placeholder sprites, export that set into art/placeholder so the next project starts with consistent sizes.
For config, keep only three autoloads:
extends Node
const GAME_TITLE := "JAM_TEMPLATE"
const VERSION := "0.1.0"
var score := 0
var is_paused := false
func reset_run() -> void:
score = 0
is_paused = falseAdd GameConfig.gd for constants and run state, AudioBus.gd for master, music, and sfx volume helpers, and SaveService.gd for a minimal JSON save in user://. For the save format, keep the same shape described in this save system guide so you can expand it later without rewriting callers.
Set project settings to sane jam defaults: 1280 by 720 stretch with canvas items mode, a fixed icon.svg, and an input map with move, jump, pause, and ui accept on both keyboard and joypad. If you use Godot MCP Studio while you clean up, you can walk this same folder tree from your assistant side panel and check each scene still loads after every move.
Step 3: Bake in presets and a README that prompts you
Presets are what turn a tidy folder into a reusable template. Save these in the template itself:
project.godotwith display, input, autoloads, and debug settings already setexport_presets.cfgwith Windows and Web presets that point atbuild/so exports never land inres://ui/theme/default_theme.treswith button, label, and panel styles plus a large font fallback- One example level that loads the HUD, plays placeholder music, pauses, and quits cleanly
Then add a README.md that forces future you to customize it. A short prompt list works better than a long manual:
# Jam Starter Checklist
1. Project name and jam theme:
2. Player verb for this game:
3. Lose and win condition:
4. Audio to replace first:
5. Export target and window size:
Run test: open MainMenu, press Start, pause, resume, quit to menu.This is also a good place to note license sources for fonts and placeholder audio, plus the Godot version you tested with, such as 4.3 stable. When you are stuck on what to cut for the next jam, focus on asking it to unblock you instead of asking for a full feature, and record the answer as a new README prompt.
Step 4: Duplicate and customize it for the next jam
Do not use Save As inside the same folder. Copy the whole jam_template directory at the file system level, rename it, and open the copy:
- Duplicate
jam_templatetomushroom_dash_jamand delete.godotin the copy so it reimports clean. - Open
project.godot, change the name, and set a newicon.svgif you have one. - Work through the README prompts and rename
Level01.tscnto match the new idea. - Replace one placeholder at a time: player sprite, then tiles, then music, then UI theme accents.
- Run the preset checklist: Start, pause, resume, save, load, quit, and export to your jam target.
Keep the template itself frozen during the jam. If you build something reusable, like a better pause menu or screen shake, port it back after judging. That keeps your starter small and proven, and each jam makes the next godot folder structure a little stronger without adding clutter.