# Built application files
*.apk
*.ap_
*.aab

# Files for the ART/Dalvik VM
*.dex

# Java class files
*.class

# Generated files
bin/
gen/
out/
release/

# Gradle files
.gradle/
build/

# Local configuration file (sdk path, etc)
local.properties

# Proguard folder generated by Eclipse
proguard/

# Log Files
*.log

# Android Studio Navigation editor temp files
.navigation/

# Android Studio captures folder
captures/

# IntelliJ / Android Studio
*.iml
.idea/

# Android Studio inspection exports (not project config)
ClangTidy.xml
OCUnusedGlobalDeclaration.xml
.descriptions.xml

# Keystore files
*.jks
*.keystore
keystore.properties

# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
.cxx/

# Google Services (e.g. APIs or Firebase)
google-services.json

# Freeline
freeline.py
freeline/
freeline_project_description.json

# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md

# Version control
vcs.xml

# lint
lint/intermediates/
lint/generated/
lint/outputs/
lint/tmp/
*.ipr

# Android Profiling
*.hprof

# NDK
obj/
.externalNativeBuild/

# CMake
cmake-build-*/

# The WSL/Linux build trees, used by the device loop and by the MIDI B2b ALSA work. `build/` above is
# unanchored and so already catches shell/build and native/build at any depth — these need their own
# lines only because the directories are not called `build`. They must stay SEPARATE from the MSVC
# trees beside them: one CMake cache cannot serve two toolchains, and sharing the directory silently
# clobbers whichever built last.
/shell/build-linux/
# shell/build-linux.sh's own tree. Separate from the hand-driven one above on purpose: a packaging
# run must not reconfigure the tree a device session is using, and one CMake cache cannot serve two
# build types anyway.
/shell/build-release-linux/

# OS-specific files
# macOS
.DS_Store
.AppleDouble
.LSOverride
._*

# Windows
Thumbs.db
ehthumbs.db
Desktop.ini
$RECYCLE.BIN/

# Linux
*~
.directory

# Backup files
*.bak
*.swp
*.swo
*~

# Package Files
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# Kotlin
.kotlin/

# Additional temp/debug files
nul
*.tmp
.vscode/

# Claude Code — kept local, not published
/.claude/
/CLAUDE.md
/.claudeignore

# Internal / planning docs (kept locally, not for contributors). The WHOLE directory, no exceptions:
# event-schema.md was briefly tracked as the songcore spec, but it is internal design material and
# doesn't belong in a public repo. Its §9 rule (a schema change lands with the code + regenerated
# goldens in one commit) still holds — the schema is enforced in-repo by songcore/event.h, the
# conformance goldens in /tools/testdata, and the tools that compare against them.
#
# The trailing slash matters, and so does the leading one: `/docs/internal/` ignores the DIRECTORY, so
# git never descends into it and no later negation pattern can accidentally re-include a file from it.
# The old `docs/internal/*` only ignored the entries, one by one.
/docs/internal/

# APK artifacts — release APKs go to GitHub Releases, not the repo
apk/

# The host tools and their conformance goldens. They are a SEPARATE PRIVATE GIT REPOSITORY whose
# working directory sits right here, nested inside this one — not a submodule, which would announce a
# private dependency in .gitmodules and hand a cloner a broken checkout. Nothing that ships references
# them: every mention of tools/ under native/, shell/ or app/ is a comment, so a clone without this
# directory builds the APK, the SDL shell and all four packages.
#
# ⚠️⚠️ `git clean -xdf` HERE DELETES THAT REPOSITORY AND ITS HISTORY. Ignored and nested means git
# treats the whole tree as disposable junk. It is pushed to a private remote; the remote is the only
# thing that makes the mistake recoverable.
/tools/

# Demo media for the release page and the landing site — not for the repo. The GIFs and their MP4
# twins are ~12 MB and the full-size theme screenshots ~2 MB each, against ~10 MB of tracked bytes in
# the whole repository. The six images the README and the store listing actually use are tracked
# beside these and are NOT covered by these two lines.
/docs/images/gif/
/docs/images/screenshot-amiga-*.png

# The crash-recovery autosave. It lands in the APP ROOT, which is the repo root whenever the shell is
# run from a build tree here — so without this a test run leaves a ~440 KB project one `git add -A`
# away from being committed. It is user work, never source.
/autosave.ptp

# Keep build helper scripts (don't ignore)
!build.sh
!test.sh
!clean.sh

# Gradle wrapper JAR must be committed — it bootstraps the build on CI and fresh clones
!gradle/wrapper/gradle-wrapper.jar
