{"id":28962333,"url":"https://github.com/joelklabo/appmaker","last_synced_at":"2026-05-09T02:36:55.001Z","repository":{"id":300523185,"uuid":"1006390860","full_name":"joelklabo/appmaker","owner":"joelklabo","description":"Create production-ready iOS apps with just a name","archived":false,"fork":false,"pushed_at":"2025-06-22T08:15:27.000Z","size":73,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-25T03:40:23.870Z","etag":null,"topics":["app-generator","cli-tool","developer-tools","ios","swift","swiftui","xcode"],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/joelklabo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-22T06:47:03.000Z","updated_at":"2025-06-22T08:15:30.000Z","dependencies_parsed_at":null,"dependency_job_id":"f1acd01c-ef57-47cd-b30e-f615f90e8c22","html_url":"https://github.com/joelklabo/appmaker","commit_stats":null,"previous_names":["joelklabo/appmaker"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/joelklabo/appmaker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelklabo%2Fappmaker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelklabo%2Fappmaker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelklabo%2Fappmaker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelklabo%2Fappmaker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joelklabo","download_url":"https://codeload.github.com/joelklabo/appmaker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joelklabo%2Fappmaker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32805155,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-08T08:22:46.396Z","status":"online","status_checked_at":"2026-05-09T02:00:06.633Z","response_time":123,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["app-generator","cli-tool","developer-tools","ios","swift","swiftui","xcode"],"created_at":"2025-06-24T03:04:50.696Z","updated_at":"2026-05-09T02:36:54.992Z","avatar_url":"https://github.com/joelklabo.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AppMaker\n\nA straightforward iOS app generator that creates working apps in 5 seconds.\n\n## The Complete Journey: Idea to App Store \n\n### Sarah's Story: From Coffee Shop Idea to Live App\n\nSarah runs a small coffee shop. She's never coded before, but she has an idea: a loyalty stamp app for her customers. Here's her actual journey from zero to App Store:\n\n#### Day 1, 9:00 AM - The Idea\n\n\"I need a simple app where customers earn stamps and get a free coffee after 10 stamps.\"\n\n#### 9:05 AM - Installation\n\n```bash\n# Sarah installs the required tools (one time only)\n$ brew install xcodegen\n$ curl -fsSL https://raw.githubusercontent.com/joelklabo/appmaker/main/install.sh | bash\n$ source ~/.zshrc\n```\n\n#### 9:10 AM - Creating the App\n\n```bash\n$ appmaker CoffeeCard\n🔵 Creating CoffeeCard...\n✅ Done!\n\nNext steps:\n  cd CoffeeCard\n  make dev\n```\n\n#### 9:11 AM - First Run\n\n```bash\n$ cd CoffeeCard\n$ make dev\n⚙️  Generating project...\n✅ Created project at CoffeeCard.xcodeproj\n```\n\nXcode opens automatically. Sarah presses Cmd+R. The app is running! She can add items, edit them, delete them. But it's generic - it's about \"Items\" not coffee stamps.\n\n#### 9:20 AM - Making It Her Own\n\nSarah realizes the app already does 90% of what she needs. She just needs to rename \"Item\" to \"Customer\" and add stamp tracking. She opens `Models/Item.swift` and modifies it:\n\n```swift\n@Model\nfinal class Item {\n    var title: String        // Change to customer name\n    var details: String      // Change to phone number\n    var isComplete: Bool     // Change to hasFreeCoffee\n    var createdAt: Date\n    \n    // Add a computed property for stamp count\n    var stampCount: Int {\n        // For now, track stamps in the details field\n        Int(details) ?? 0\n    }\n    \n    init(title: String = \"\", details: String = \"0\", isComplete: Bool = false) {\n        self.title = title\n        self.details = details\n        self.isComplete = stampCount \u003e= 10\n        self.createdAt = Date()\n    }\n}\n```\n\nSarah realizes she can use the existing fields creatively:\n- `title` = Customer Name\n- `details` = Stamp Count (as a string)\n- `isComplete` = Has Free Coffee (when stamps \u003e= 10)\n\nShe updates `Views/ContentView.swift` to change the UI labels:\n\n```swift\n.navigationTitle(\"Coffee Cards\")  // was \"Items\"\n// ... \nLabel(\"Add Customer\", systemImage: \"plus\")  // was \"Add Item\"\n```\n\n#### 9:30 AM - Testing on Her iPhone\n\n```bash\n$ make device\n🔧 Configuring for device testing...\n1. Connect your iPhone via USB\n2. Open CoffeeCard.xcodeproj\n3. Select your device from the device menu\n4. Press Cmd+R to run\n\nFirst time setup:\n- You'll need to trust the developer certificate on your iPhone\n- Settings → General → VPN \u0026 Device Management → Developer App\n```\n\nSarah connects her iPhone, selects it in Xcode, and presses Cmd+R. After trusting the developer certificate, the app runs on her phone!\n\n#### 9:45 AM - Preparing for the App Store\n\nSarah needs an Apple Developer account. She signs up at developer.apple.com ($99/year).\n\nWhile waiting for approval, she prepares her app:\n\n```bash\n$ make appstore\n🎨 Generating placeholder app icon...\n✅ Icon placeholder created\n📄 Creating privacy policy...\n📸 Screenshot guidelines saved to AppStoreAssets/README.txt\n📱 App Store Checklist:\n  ✅ Code signing configured\n  ✅ App icon generated (basic)\n  ✅ Privacy policy created\n  ✅ Screenshots captured\n  ⚠️  Need Apple Developer Account ($99/year)\n\nNext: make testflight\n```\n\n#### 10:00 AM - Creating an Icon\n\nSarah opens `Assets.xcassets/AppIcon.appiconset/` and replaces the placeholder with a simple coffee cup icon she made in Canva (1024x1024 PNG).\n\n#### 10:30 AM - Apple Developer Account Approved\n\nSarah configures her signing in Xcode:\n1. Opens project settings\n2. Selects her team (now showing her developer account)\n3. Bundle identifier is already set to `com.appmaker.CoffeeCard`\n\n#### 10:45 AM - Building for TestFlight\n\n```bash\n$ make testflight\n🚀 Building for TestFlight...\n✅ Archive created at build/CoffeeCard.xcarchive\n\nNext steps:\n1. Open Xcode → Window → Organizer\n2. Select your archive and click 'Distribute App'\n3. Choose 'TestFlight \u0026 App Store'\n4. Follow the upload wizard\n\nAfter upload completes:\n- Your app will be available in TestFlight within 5-10 minutes\n- Share the TestFlight link with testers\n```\n\nSarah follows the steps. The upload wizard in Xcode handles everything. 15 minutes later, she gets an email: \"CoffeeCard is ready to test.\"\n\n#### 11:00 AM - Testing with Staff\n\nSarah shares the TestFlight link with her baristas. They download the beta and start testing. They love how simple it is!\n\n#### Day 2, 9:00 AM - Submitting to App Store\n\nSarah takes screenshots on her iPhone and prepares for submission:\n\n```bash\n$ make submit\n📤 Submitting to App Store...\n\nFinal steps in App Store Connect:\n1. Go to https://appstoreconnect.apple.com\n2. Select your app\n3. Fill in:\n   - App description\n   - Keywords  \n   - Support URL (use your website)\n   - Marketing URL (optional)\n4. Upload screenshots from AppStoreAssets/\n5. Select your build from TestFlight\n6. Submit for review\n\n✅ Typical review time: 24-48 hours\n```\n\nSarah logs into App Store Connect and fills in:\n- **Description**: \"Simple loyalty card tracker for CoffeeCard customers. Earn stamps with each purchase and get a free coffee after 10 stamps!\"\n- **Keywords**: coffee, loyalty, stamps, rewards, cafe\n- **Support URL**: https://coffeecard.example.com\n- **Screenshots**: The ones she took on her iPhone\n\nShe submits for review.\n\n#### Day 3, 2:00 PM - App Approved!\n\nEmail from Apple: \"CoffeeCard is now live on the App Store.\"\n\nSarah searches for her app. There it is! She downloads it, adds her first customer, gives them a stamp. It works perfectly.\n\n#### The Real Numbers\n\n- **Total time invested**: ~2 hours over 3 days\n- **Actual coding time**: 20 minutes (just renaming fields)\n- **Cost**: $99/year Apple Developer fee\n- **Lines of code written**: ~10 (just label changes)\n- **Result**: A real app on the App Store that her customers use every day\n\n#### What Made This Possible\n\n1. AppMaker generated a complete, working app\n2. The app was already 90% of what Sarah needed\n3. No complex setup or configuration required\n4. Clear next steps at every stage\n5. Everything just worked\n\n---\n\n*\"I thought making an app would take months and thousands of dollars. Instead, I had one running in 10 minutes and on the App Store in 3 days.\" - Sarah*\n\n## What It Does\n\nCreates a complete, working iOS app with SwiftUI, SwiftData, and a clean architecture. Every app includes full CRUD functionality, persistence, and a modern UI.\n\n## What You Get\n\nEvery generated app includes:\n- ✅ **Working code** that builds and runs immediately\n- ✅ **Full CRUD** - Create, Read, Update, Delete functionality\n- ✅ **SwiftData persistence** - Data saves between launches\n- ✅ **Modern UI** - NavigationStack, sheets, forms, all configured\n- ✅ **Clean architecture** - Organized into Models, Views, and App\n- ✅ **Development tools** - Makefile, git repo, proper structure\n\n## Example: Building an App\n\n```bash\n$ appmaker TodoList\n\nCreating TodoList...\n✅ Done!\n\nNext steps:\n  cd TodoList\n  make dev\n\n$ cd TodoList\n$ make build\n# Build succeeds - exit code 0\n\n$ make dev\n# Opens in Xcode - press Cmd+R to run\n```\n\n### What You Get\n\n```\nTodoList/\n├── Makefile                    # make dev, test, build, appstore, testflight\n├── project.yml                 # XcodeGen configuration\n├── Info.plist                  # iOS app configuration\n├── README.md                   # Quick start guide\n├── TodoList/\n│   └── TodoListApp.swift      # @main entry point with SwiftData\n├── Models/\n│   └── Item.swift             # Generic Item model (rename for your domain)\n├── Views/\n│   ├── ContentView.swift      # Main list view\n│   ├── ItemDetailView.swift   # Edit existing items\n│   └── AddItemView.swift      # Add new items\n├── Assets.xcassets/\n│   └── AppIcon.appiconset/    # App icon placeholder\n└── scripts/\n    └── generate_icon.sh       # Icon generation helper\n```\n\n### What Actually Works (Immediately)\n\nPress Cmd+R. The app runs. You can:\n- Add new items with title and details\n- View items in a list sorted by creation date\n- Edit item details by tapping on them\n- Mark items as complete\n- Delete items with swipe gestures\n- All data persists between app launches\n\nNo setup. No configuration. It just works.\n\n### The Generated Code\n\n**Models/Item.swift** (Ready to customize):\n```swift\n@Model\nfinal class Item {\n    var title: String\n    var details: String\n    var isComplete: Bool\n    var createdAt: Date\n    \n    init(title: String = \"\", details: String = \"\", isComplete: Bool = false) {\n        self.title = title\n        self.details = details\n        self.isComplete = isComplete\n        self.createdAt = Date()\n    }\n}\n```\n\n**Views/ContentView.swift** (Complete UI):\n```swift\nstruct ContentView: View {\n    @Environment(\\.modelContext) private var modelContext\n    @Query(sort: \\Item.createdAt, order: .reverse) private var items: [Item]\n    @State private var showingAddItem = false\n\n    var body: some View {\n        NavigationStack {\n            List {\n                ForEach(items) { item in\n                    NavigationLink {\n                        ItemDetailView(item: item)\n                    } label: {\n                        ItemRow(item: item)\n                    }\n                }\n                .onDelete(perform: deleteItems)\n            }\n            .navigationTitle(\"Items\")\n            .toolbar {\n                ToolbarItem(placement: .navigationBarTrailing) {\n                    Button(action: { showingAddItem.toggle() }) {\n                        Label(\"Add Item\", systemImage: \"plus\")\n                    }\n                }\n            }\n            .sheet(isPresented: $showingAddItem) {\n                AddItemView()\n            }\n        }\n    }\n}\n```\n\n### Customizing for Your Domain (5 minutes)\n\nThe generated app is intentionally generic. Here's how to make it yours:\n\n1. **Rename the model** to match your domain:\n```swift\n// Change Item to whatever you're tracking\n@Model\nfinal class Recipe {  // was Item\n    var name: String      // was title\n    var ingredients: String  // was details\n    var isFavorite: Bool    // was isComplete\n    var createdAt: Date\n}\n```\n\n2. **Update the UI labels**:\n```swift\n.navigationTitle(\"My Recipes\")  // was \"Items\"\nLabel(\"Add Recipe\", systemImage: \"plus\")  // was \"Add Item\"\n```\n\n3. **Add domain-specific features**:\n```swift\n// Add computed properties\nvar ingredientCount: Int {\n    ingredients.split(separator: \",\").count\n}\n\n// Add methods\nfunc toggleFavorite() {\n    isFavorite.toggle()\n}\n```\n\nThe architecture is simple and flexible - perfect for rapid customization.\n\n## Quick Demo\n\n```bash\n$ appmaker TodoApp\n🔵 Creating TodoApp...\n✅ Done!\n\nNext steps:\n  cd TodoApp\n  make dev\n\n$ cd TodoApp\n$ make build\n# Builds successfully if iPhone 15 simulator is available\n```\n\n## Installation\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/joelklabo/appmaker/main/install.sh | bash\nsource ~/.zshrc\n```\n\nRequirements:\n- macOS with Xcode\n- `brew install xcodegen` (if not installed)\n\n## How It Works\n\n1. **Creates** a complete project structure\n2. **Generates** SwiftUI + SwiftData code\n3. **Configures** XcodeGen project\n4. **Initializes** git repository\n5. **Opens** Xcode when you run `make dev`\n\nNo configuration files. No options. No complexity.\n\n## Design Decisions\n\n- **Bash**: No dependencies, works everywhere\n- **XcodeGen**: Eliminates .xcodeproj conflicts\n- **SwiftData**: Modern persistence that just works\n- **Generic Model**: Flexible starting point for any app\n- **Model-View**: Simple, native SwiftUI patterns\n- **Makefile**: Consistent commands across all projects\n\n## What This Is Not\n\n- Not a framework (generates standard Swift)\n- Not a template engine (creates real projects)\n- Not configurable (opinionated defaults)\n- Not complex (under 500 lines of bash)\n\n## More Examples\n\n```bash\n# Create any app - they all start with the same flexible base\nappmaker RecipeBook    # Rename Item to Recipe\nappmaker ExpenseTracker  # Item becomes Expense \nappmaker BookLibrary    # Item becomes Book\nappmaker WorkoutLog     # Item becomes Workout\n\n# The pattern is always the same:\n# 1. Generate the app\n# 2. Rename Item to your domain object\n# 3. Customize the fields\n# 4. Ship it\n```\n\n## The Point\n\nYou have an idea. You want to build it. Not configure it.\n\n```bash\nappmaker YourIdea\n```\n\nAppMaker gives you a working app in seconds. The rest is up to you.\n\n## Source\n\nThe entire tool is one file: [appmaker](appmaker)\n\nRead it. Fork it. Improve it.\n\n## The Carmack Standard\n\nWhat would John Carmack do? Make it work perfectly, make it fast, make it simple.\n\nAppMaker:\n- **Works perfectly**: Every generated app builds and runs\n- **Fast**: 5 seconds from idea to working app\n- **Simple**: One command, zero configuration\n\nThe intelligence is hidden. The complexity is handled. You just build.\n\n---\n\n*\"Simplicity is prerequisite for reliability.\" - Edsger Dijkstra*","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoelklabo%2Fappmaker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoelklabo%2Fappmaker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoelklabo%2Fappmaker/lists"}