03Concepts
Project structure
What's in a geeknative project, file by file.
my-app/
├── AGENTS.md Instructions every coding agent follows
├── CLAUDE.md Imports AGENTS.md for Claude Code, plus Claude-only notes
├── PRODUCT.md What the app is, who it's for, features, glossary
├── DESIGN.md Look and feel, what's shared and what's native, components
├── README.md
├── Makefile Includes .geeknative/framework.mk; add your own targets below it
├── package.json npm workspaces (apps/web) and the geeknative dev dependency
├── contracts/
│ ├── app.json Name, ID, version, build and default locale
│ ├── tokens.json Colors (light and dark), spacing, radii, type
│ ├── strings/en.json All user-facing copy (one file per locale)
│ └── icons.json Each icon's name on iOS, Android and web
├── spec/
│ ├── features/ One spec per feature: home.md, settings.md
│ ├── navigation.md Screens and routes
│ ├── decisions.md Dated decisions and assumptions
│ └── parity.md Generated by make parity
├── apps/
│ ├── ios/ The SwiftUI app
│ ├── android/ The Kotlin and Jetpack Compose app
│ └── web/ The React and TanStack Start app
├── .geeknative/
│ ├── framework.mk The make targets
│ ├── playbooks/ Step-by-step guides per request type
│ ├── templates/feature.md The feature spec template
│ ├── hooks/ Claude Code hook scripts
│ ├── lock.json Framework version and hashes of framework files
│ └── logs/ Full output of each check (git-ignored)
├── .claude/ Claude Code subagents, hooks and permissions
├── .gemini/settings.json Points Gemini CLI at AGENTS.md
└── .github/dependabot.yml Weekly npm and Gradle dependency updates
The apps
apps/ios/
├── App.xcodeproj App/ and AppTests/ are synchronized folders: new files appear automatically
├── Config/ Build settings as .xcconfig files; Identity.xcconfig is generated
├── App/
│ ├── AppMain.swift @main: creates AppContainer and shows RootView
│ ├── Core/ AppContainer, RootView, Navigation/Route.swift, DesignSystem/
│ ├── Features/ Home/, Settings/
│ ├── Generated/ From contracts/; never edit
│ └── Resources/ Assets.xcassets (app icon)
└── AppTests/ Swift Testing tests
apps/android/
├── gradle/libs.versions.toml Every dependency version
├── app/build.gradle.kts Reads app/identity.properties (generated)
├── app/src/main/kotlin/app/
│ ├── App.kt, MainActivity.kt
│ ├── core/ AppContainer, navigation/, designsystem/
│ ├── features/ home/, settings/
│ └── generated/ From contracts/; never edit
├── app/src/main/res/ values/generated_*.xml are generated
└── app/src/test/kotlin/app/ Unit tests
apps/web/src/
├── router.tsx Creates the router with { queryClient, container } as context
├── routes/ One file per URL; __root.tsx is the HTML shell and site header
├── core/ AppContainer, AppearanceEffect, designsystem/
├── features/ home/, settings/
├── generated/ From contracts/; never edit
├── styles.css Tailwind entry; imports generated/tokens.css
└── routeTree.gen.ts Generated by TanStack Router; never edit
Generated files
make gen writes these from contracts/. They're committed, so each app builds on its own, but never edited by hand.
| App | Generated |
|---|---|
| iOS | App/Generated/ (Swift, Localizable.xcstrings, Colors.xcassets) and Config/Identity.xcconfig |
| Android | app/src/main/kotlin/app/generated/, res/values*/generated_*.xml and app/identity.properties |
| Web | src/generated/ |
See File ownership for which files belong to you and which to the framework.