Audited 2026-10-08 on Godot 4.7.2.stable (official build). HedgePets stays fully offline: no accounts, networking, analytics, ads, subscriptions or purchases. The Android preset requests no permissions, not even INTERNET.
Status: no Android, iOS or Web build has been produced yet. Every attempt stopped at missing export templates
and toolchains on this machine (see “To export”). What has been proven is the exported game itself: the
project was packed with the real export filters (--export-pack, the same content an APK, IPA or web build carries)
and run from that pack alone, outside the project folder. It started, built the garden, and an arrival used
species.json and the plant variants, with no errors.
| Engine | Godot 4.7.2, GDScript only (no C#, no GDExtension, no native plugins) |
| Renderer | gl_compatibility on desktop and mobile (rendering_method.mobile), i.e. OpenGL 3.3 / OpenGL ES 3.0 / WebGL 2 |
| Graphics API on device | OpenGL ES 3.0 (Android, iOS via ANGLE/Metal in Godot’s iOS template), WebGL 2 (web) |
| Shaders | 9 .gdshader + 2 .gdshaderinc (below) |
| Textures | 38 PNG sprite sheets imported lossless (compress/mode=0, no mipmaps); read at runtime as images |
| Orientation | portrait (display/window/handheld/orientation=1), 1080 x 1920 base, stretch/mode=canvas_items, aspect keep |
| Input | mouse, keyboard, touch (one finger: top half turns, bottom half pans, tap / grab / arrange; two fingers: pan + pinch zoom) |
| Saves | user://garden.json (Godot’s per-platform app data folder) |
| Runtime dependencies | none. Python (tools/*.py) only generates assets offline; nothing runs Python at runtime |
OS.execute, no network, no native code..png sprites, no .py.assets/fonts/*_geometry.json and assets/plants/plant_profiles.json are included by the export filter. Only the legacy 2D scene reads them.INSTANCE_CUSTOM, discard, #include, a custom light() (paper_ground), hint_screen_texture + SCREEN_UV (tilt_shift), FRAGCOORD, and a constant int[16] array with dynamic indexing (near_fade). That is legal GLSL ES 3.00 and WebGL 2.
uint or bitwise operations, textureLod, texelFetch, derivatives, global or instance uniforms.| shader | notes |
|---|---|
| leaf, leaf_ink_shell | MultiMesh custom data, wind include, near-fade include, discard |
| ink_hull | inverted hull, cull_front, near-fade |
| grass | MultiMesh custom data, discard |
| lawn | two texture reads, world-space UVs |
| water, creek | alpha blend, discard, fresnel from VIEW |
| paper_ground | custom light() (viewer only) |
| tilt_shift | screen texture, 12 x 2 taps (cost: see 4) |
| leaf_common.gdshaderinc, near_fade.gdshaderinc | plain functions; Bayer table as a constant int array |
user:// works on Android, iOS and web (IndexedDB on web). The pickup cooldown uses Time.get_unix_time_from_system(), which every platform provides.res://pets. That already handles exported .tres.remap names, and the pack test confirmed it.rendering/textures/vram_compression/import_etc2_astc=true (done): Android refuses to export without ETC2/ASTC. It only adds mobile copies of compressed textures; desktop textures are unchanged.export_presets.cfg (done): Android, iOS and Web presets.
pets/species.json, assets/plants/*.json, assets/fonts/*_geometry.json (plain JSON isn’t exported otherwise).tools/*, docs/*, build/*.export_project_only (an Xcode project, built on a Mac), iPhone + iPad, arm64.org.hedgepets.game. Choose the real one before any store upload.export_project_only; signing happens in Xcode.aspect=keep) on 19.5:9 screens: thin bars top and bottom, nothing cut off.
Done in this pass. The desktop game behaves the same; every existing check still passes.
res:// with Image.load_from_file(globalize_path(...)). Exports don’t ship raw source files, so the leaf sheets, grass, lawn and falling leaves would all have failed.Assets.image() (scripts/util/assets.gd) loads the imported texture and takes its pixels. Exact, because the sheets are lossless.InputEvent.DEVICE_ID_EMULATION), and a touch landing on a visible HUD control is left to the HUD (garden_game.ui_blocks).res://assets/baked/garden.res, made by tools/bake_cache.gd.main3d.tscn, a dev scene, not the game) only zooms with the mouse wheel. The garden has pinch.discardNone of these are installed yet:
Godot_v4.7.2-stable_export_templates.tpz from the official Godot release page and install it.
templates/ contents to ~/.local/share/godot/export_templates/4.7.2.stable/.sudo apt install openjdk-17-jdk-headless.platform-tools, build-tools and a platforms;android-NN matching the Godot 4.7 docs.export/android/java_sdk_path and export/android/android_sdk_path at them. The SDK path currently set, ~/Android/Sdk, doesn’t exist.~/.local/share/godot/keystores/debug.keystore. Android’s documented debug convention is password android, alias androiddebugkey; release signing is yours to create:
keytool -genkeypair -v -keystore ~/.local/share/godot/keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -keyalg RSA -validity 9999 -dname "CN=Android Debug,O=Android,C=US"Then:
godot --headless --path . --script tools/bake_cache.gd # always first
godot --headless --path . --export-debug "Web" build/web/index.html
godot --headless --path . --export-debug "Android" build/android/HedgePets.apk
godot --headless --path . --export-debug "iOS" build/ios/HedgePets.ipa
godot --headless --path . --export-pack "Web" build/packtest/hedgepets.pck # the exported content
cd /tmp && godot --main-pack ~/Projects/hedgepets/build/packtest/hedgepets.pck # run the game from it
godot --headless --path . --script tools/boot_time.gd # startup, part by part