bennykok/omg.dev/omg-app-builder
Claude Code and agent skill by bennykok/omg.dev
- community
Checking that the SKILL.md file is still in the repository.
Build and deliver a new website, web app, API, or Expo app created through omg.dev New Project or Quick Chat. Use for initial product creation and first deployment, not routine maintenance of an established project.
Install
npx vskill@latest install bennykok/omg.dev/omg-app-builderSKILL.md
Build and deliver an omg.dev app
Turn the user's product description into a working, verified result. Keep setup work with the agent. Ask only about product choices that materially change the result.
Ask one question per question call, and put at most one decision in it. A second question in the same call is not shown to the user on every client. If the user has not said what the app should do, ask that in plain words and wait for the answer. Do not build a placeholder product in its place. If a question times out, ask again once in a normal message and end the turn.
Establish the project
- In Quick Chat, call
omg_create_projectonce with a short descriptive name. Settemplatetoexpofor an Expo or universal mobile app. The Expo template already contains a working todo flow with data stored on the phone, Expo Router, Liquid Glass, Lucide icons, web support, and EAS configuration. Use the returnedrepo.cwdfor every command, edit, check, and deployment. Inspectomg_list_reposbefore retrying an uncertain create call. - In a New Project session, the current directory is already the project. It contains Git, a README, and this skill. Do not create a second project.
- Preserve
.git. Do not overwrite an existing folder or move the current Quick Chat into the new project.
Choose the delivery path
- For a website, web app, or API, use the supported omg.dev runtime unless the user requests another platform. In a blank project, scaffold the official omg.dev React template before writing product code. The current directory already contains Git and omg.dev instructions, so generate into a temporary directory inside it, copy the scaffold into the project, and remove only that temporary directory:
``bash scaffold="$(mktemp -d .omg-web-scaffold-XXXXXX)" bunx --bun create-omg@latest "$scaffold" --template react-ts --no-install cp -a "$scaffold"/. . rm -rf "$scaffold" bun install ``
This template supplies @omg-dev/vite-plugin, vibes-build, server functions, database support, and analytics. Do not substitute create-vite or a hand-written Vite scaffold. Read https://docs.omg.dev/llms.txt and only the relevant parts of https://docs.omg.dev/llms-full.txt before choosing additional packages or API contracts.
- For a game (racing, arcade, puzzle, kids' learning, word, 3D), create the project with
template: "web-game"and read.agents/skills/omg-web-game-builder/SKILL.mdinstead of designing an engine. Its step 1 comes before any code edit:bun run devin the background on port 5174, thenomg_expose_portwith port 5174 and withoutexpoGo, then tell the user the preview is ready in the card below. The Expo preview steps in this skill (port 8081,expoGo: true) do not apply to a web game. Usetemplate: "expo-game"and.agents/skills/omg-game-builder/SKILL.mdonly when the user asks for a game to install on iPhone or Android, or names Expo or a native app. - For an Expo app, start from the managed
expotemplate and follow "Expo app: the fast path" below. Adapt its screens and its data store instead of rebuilding configuration. Keep secrets in hosted server routes. A production native build needs any server deployed at a secure origin; do not treat a sandbox tunnel as production hosting. - Use one live Metro server for Expo Web and Expo Go in a Cloud Computer. Expose its port through
omg_expose_port; do not assume a global Expo CLI, Xcode, a simulator, or machine-specific tools exist. - When the app is compatible with Expo Go,
omg_expose_portputs theexps://Expo Go link on a preview card in the omg.dev app. Tell the user the preview is ready and to open it from the card below. Do not paste the rawexps://URL in your reply; the card already shows it. Paste it only where the user cannot see the card, such as a reply sent withomg_send_to_originto a messaging channel, or when the user asks for the link. Do not use Expo tunnel, LAN exposure,exp.direct, or ngrok. If Expo Go cannot load a required native module, use a development build when authorized or report that limit clearly. - TestFlight, App Store submission, paid services, domains, and third-party production accounts are separate delivery actions. Do them only when the user requests them and the required account is available. TestFlight needs the user's Expo account and paid Apple Developer account, but an EAS cloud build does not need Xcode or a Mac in the sandbox. Use supported login flows and never ask for passwords or tokens in chat.
Expo app: the fast path
A new user is waiting. The first screen must reach their phone within about 3 minutes, before any feature work. Follow these steps in order:
omg_create_projectwithtemplate: "expo". Ifnode_modulesis missing, runbun installonce.- Preview before you write any code. Call
omg_expose_portwith port 8081 andexpoGo: true. Then runbash scripts/start-expo-preview.sh <expoGo.proxyUrl> 8081from the project directory, with a 240000 ms shell timeout. When it printsSandbox proxy answers: HTTP 200, present the web preview first: "Your app is ready. The card below shows it running, and it works on any device." Then mention the phone in one sentence: "To try it on your own phone, tap Your phone on the card." When theomg_expose_portresult hassimulatorAvailable: true, add one more sentence: "You can also try it on an iPhone right in the card: tap Simulator." Do not promise the simulator when that field is false or missing. Do not pasteexpoGo.url; the card shows it. Metro reloads the app on every save, so the preview follows your edits from here on. - Write the screens, in a few larger edits rather than one small edit per turn. Replace the template home screen in
src/app/index.tsx; do not add a second index route. - Run
bun run typecheckand fix what it reports. It also checks the routes and fails on a second home screen or a rootapp/folder. Then runbun run check:ui, open its PNGs, and fix what is wrong (see Build step 4). Do not write automated tests unless the user asks. - Deploy once with
omg_deploy(see below). The data stays on the phone, so this is a static web build. - Finish with
omg_ship.
Do not browse node_modules, fetch documentation, or read the template file by file before the first preview: the summary below is enough. Do not write your own browser test loops or screenshot scripts: bun run check:ui does that. If you cannot view images, read its text report only.
The template:
src/app/index.tsx: the home screen, and the only file for/. Replace its content with your home screen. Keep every screen insrc/app/: Expo Router ignores a rootapp/folder whilesrc/appexists. For tabs, move the home screen tosrc/app/(tabs)/index.tsxand deletesrc/app/index.tsx, because both answer/and the old one wins. The template file has a header, an input with an add button, a list with toggle and delete, an error card, and a reload button. Styles are in oneStyleSheetat the bottom; the theme constants are at the top (INK,CORAL,BACKGROUND,SURFACE,SURFACE_BORDER).src/app/_layout.tsx: an Expo Router stack with no header, insideKeyboardProvider. A new screen is a new file insrc/app/(stats.tsxis/stats). Navigate withrouter.push("/stats")or<Link href="/stats">fromexpo-router.src/lib/tasks.ts: the data, stored on the phone with AsyncStorage (localStorage on the web).tasksApi.list(),create(title),update(id, patch),remove(id). Keep this file. For each new kind of item, copy its shape with its own storage key.- Icons:
lucide-react-native, for example<Plus color={CORAL} size={22} />. Glass surfaces:GlassViewfromexpo-glass-effect. - Colours: set every theme constant from the design before you style screens. Cards, rows and sheets use the design's own surface colour. The template's translucent white
SURFACEsuits only its light starter; left on a dark or coloured design, every card comes out white. UseGlassViewonly where the design shows frosted glass. On Android it draws no glass, so give it a background colour. - Safe areas: wrap each screen in
SafeAreaViewfromreact-native-safe-area-contextwithedges={["top", "bottom"]}, or useuseSafeAreaInsets(). Never importSafeAreaViewfromreact-native: it is iOS-only, so on Android the header goes under the status bar and the tab bar under the gesture bar. - Keyboard: put screens with a text input in
KeyboardAwareScrollViewfromsrc/lib/keyboard(bottomOffset={24},keyboardShouldPersistTaps="handled"), as the template does. For a field pinned to the bottom, useKeyboardStickyViewfrom the same file. Import them fromsrc/lib/keyboard, never fromreact-native-keyboard-controllerdirectly: its.web.tsxtwin keeps the static web export working. Do not use React Native'sKeyboardAvoidingView: on iOS the screen moves after the keyboard, slowly.
Data: store it on the phone by default, with the tasks.ts pattern. Use hosted data only when the user asks for accounts or data shared between people. Then add sign-in with @omg-dev/sdk and .scoped("user") collections in schema.ts. Never call /api/... with a raw fetch: a hosted collection answers an anonymous phone with 401 Authentication required.
For hosted data, install the latest @omg-dev/sdk and deploy the backend before testing its shared data in Metro. Keep .omg/project.json in the project directory. The hosted web preview uses that registered app identity and signs its owner in through the SDK. Use <VibesAuthProvider> and SDK requests. Do not add a separate preview login, forward dashboard cookies, or replace the user's app permissions. A physical phone still needs the app's normal sign-in and the deployed backend origin.
Metro rules: use only ports 8081 to 8099, because Expo Go links work only in that range. Start Metro only with the script; npx and ss are not installed on every Computer.
Building blocks (Expo)
The template ships tested helpers in src/kit/. Import them; do not rewrite them. They work on iOS, Android and web. Each file starts with a comment that shows its use.
overlay.tsx:useConfirm()anduseSheet().<OverlayProvider>is already in_layout.tsx. Useif (await confirm({ title, destructive: true }))for every delete or confirm.Alert.alertwith buttons does nothing on web. UseuseSheet().open(node)for sheets and forms. Do not stackModalcomponents: the second one draws behind the first on web.ActionRow.tsx: a pressable row with a delete or other action beside it. A button nested inside a pressable row also fires the row on web.image.ts:await toPersistentImage(pickerAsset). Call the picker withbase64: true, quality: 0.5and store the returned string. A picker URI on web is ablob:URL that is gone after a reload.use-timer.ts:usePersistedTimer(key, durationMs)withstart,pause,resume,reset, andformatClock. It stores the end time, so a reload does not reset it. Use it for every timer or countdown.use-viewport.ts:useViewport()anduseIsWide(). In the static web exportuseWindowDimensions()can give width 0 on first render. PreferflexandmaxWidth; use the hook only when you need a number.
Shared data between people (a shared list, a trade, a group): use the hosted @omg-dev/sdk path in "Data" above. Do not write a local server. If a local server is unavoidable, answer OPTIONS and send these headers on every response: Access-Control-Allow-Origin with the request Origin (or *), Access-Control-Allow-Methods: GET,POST,PUT,PATCH,DELETE,OPTIONS, and Access-Control-Allow-Headers: content-type,authorization. A missing PUT or DELETE fails only in the browser.
Build
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingagents/skills/omg-app-builder/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/bennykok/omg.dev/omg-app-builder)