Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/mahik504-expo-project-structure
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/expo-project-structure
What's inside
- Skill name
expo-project-structure- Description
- Framework (OSS). Folder structure for a new Expo app. Use when scaffolding or laying out a new Expo project with Expo Router, or deciding where a file should live in one. For new projects only — never restructure an existing app to match.
- License
- MIT
- Instructions
- 109 lines in SKILL.md · view on GitHub
Agent Skills spec issues
- body: contains an absolute path from the author's machine
Files (2)
- SKILL.md
- openai.yaml · agents/
SKILL.md (first lines)
# Expo Project Structure
A starting skeleton for a **new** Expo app — one with no committed folder structure yet.
**Apply only to new projects.** If the app already has a layout, follow its existing conventions and leave files where they are — a default to start from, never a standard to enforce or migrate toward. When unsure whether a project is new, ask before moving anything.
The whole layout, assembled from the rules below:
```
├── assets/
├── scripts/
├── src/
│ ├── app/ # Expo Router routes ONLY — every file is a route
│ │ ├── api/ # server API routes, grouped here
│ │ │ ├── user+api.ts
│ │ │ └── settings+api.ts
│ │ ├── _layout.tsx
│ │ ├── _layout.web.tsx # platform-specific layout
│ │ ├── index.tsx
│ │ └── settings.tsx
│ ├── components/ # reusable UI: button, card, table…
│ │ ├── table/ # complex component → folder + index.tsx
│ │ │ ├── cell.tsx
│ │ │ └── index.tsx
│ │ ├── bar-chart.tsx
│ │ ├── bar-chart.web.tsx # platform-specific variant
│ │ └── button.tsx
│ ├── screens/ # screen bodies that route files render
│ │ ├── home/
│ │ │ ├── card.tsx # used only by Home — not shared
│ │ │ └── index.tsx # rendered by src/app/index.tsx
│ │ └── settings.tsx
│ ├── server/ # server-only helpers used by app/api
│ │ ├── auth.ts
│ │ └── db.ts
│ ├── utils/ # standalone helpers + colocated tests
│ │ ├── format-date.ts
│ │ └── format-date.test.ts
│ ├── hooks/ # reusable hooks: use-theme.ts…
│ ├── constants.ts
│ └── theme.ts
├── app.json
├── eas.json
└── package.json
```
## `src/` and `src/app`
Keep app code under `src/` to separate it from config files. Expo Router supports both `app/` and `src/app/` out of the box — to switch, move the folder and restart the bundler. The default template aliases `@/*` to `./src/*` in `tsconfig.json`.
`src/app` is **routes-only**: every file there becomes a route, so nothing else belongs in it. Everything below lives in sibling folders.
## components/ — reusable UI
Generic, reused UI (button, card, table) with one named export each. Name files in **kebab-case** (`bar-chart.tsx`), matching the default `create-expo-app` template. When a component grows, give it its own folder with the root in `index.tsx` and **colocate** its private sub-components beside it — the import path (`@/components/table`) stays unchanged.
## screens/ — screen bodies
Because `app/` files must be routes, complex screen UI that isn't reused has no home there. Once a screen grows big enough to need breaking out to separate components, put it in `screens/` and let each route just render its screen:
```tsx
import { Home } from "@/screens/home";
export default function HomeScreen() {
// route-specific concerns only — e.g. read url params here
return <Home />;
}
```
**Colocate** a screen's private components inside its folder (`screens/home/components/`). A bonus: the same screen can render under multiple routes.
## server/ + app/api/ — separate server code
Appending `+api` to a file in `app/` makes it a server **API route**. Server code is different from frontend code — it runs in a Node-like server environment (deployed with EAS Hosting or on [third-party services](https://docs.expo.dev/router/web/api-routes/#hosting-on-third-party-services)) and can read secret env vars (`process.env.X`, not just `EXPO_PUBLIC_*`). Keep it apart:
- Group all routes under `app/api/` → `/api/user`, `/api/settings`. This colocates them and avoids collisions (e.g. a `/user` screen and a `/user` route).
- Put shared server-only helpers in `src/server/`.
- Consider ESLint rules that fence `+api` files and `server/` off from frontend-only checks.
## Platform-specific code
Small differences: use `Platform.select` / `Platform.OS`. For larger ones, split into platform files instead of inline `if/else` — `bar-chart.tsx` + `bar-chart.web.tsx`, imported extension-free (`@/components/bar-chart`); Metro picks the right file per target.
- Props must be identical across variants.
- A default file (no platform extension) is always required — make it a no-op if the component is single-platform.
- Supported extensions: `.ios`, `.android`, `.native`, `.web`.
## Colocate styles and tests
- **Styles:** keep the `StyleSheet.create({ ... })` object at the bottom of the component file rather than in a separate `.styles` file.
- **Tests:** put `format-date.test.ts` next to `format-date.ts` (preferred over a separate `__tests__/` folder) so tested files are obvious at a glance.
## AI and config files
Agent instructions live at the repo root — `AGENTS.md` / `CLAUDE.md`, with project skills under `.claude/`. Other config and assets stay outside `src/`: `app.json` / `app.config.ts`, `eas.json`, `package.json`, `assets/`, and `scripts/`.
---
Based on [Expo app folder structure best practices](https://expo.dev/blog/expo-app-folder-structure-best-practices) by Kadi Kraman. For `src/` precedence and alias mechanics, see the [Expo docs](https://docs.expo.dev/router/reference/src-directory/).
## Submitting Feedback
If you encounter errors, misleading or outdated information in this skill, report it so Expo can improve:
```bash
npx --yes submit-expo-feedback@latest --category skills --subject "expo-project-structure" "<actionable feedback>"
```
Only submit when you have something specific and actionable to report. Include as much relevant context as possible.
If an AI agent repeatedly failed or the user had to take over an Expo task, load the expo-skill-feedback skill and follow its eval-candidate flow instead of reusing the command above.From mahik504/orchestra-workflow, MIT.
More from mahik504/orchestra-workflow
- 0.592score
eas-app-stores
mahik504
EAS service (paid).
SkillAFreshness: A★ 1Claude Code +9 - 0.592score
expo-data-fetching
mahik504
Framework (OSS).
SkillAFreshness: A★ 1Claude Code +9 - 0.589score
expo-native-ui
mahik504
Framework (OSS).
SkillAFreshness: A★ 1Claude Code +9 - 0.589score
expo-router
mahik504
Framework (OSS).
SkillAFreshness: A★ 1Claude Code +9 - 0.587score
fix-security-vulnerabilities-with-strix
usestrix
Fix security vulnerabilities found by a Strix pentest (open-source CLI or app.strix.ai cloud) — triage by severity, patch the root cause rather than the…
SkillAFreshness: A★ 1Claude Code +9 - 0.587score
orchestra-docs
mahik504
College/product slides, reports, and papers.
SkillAFreshness: A★ 1Claude Code +9 - 0.587score
penetration-testing-with-strix
usestrix
Pentest a web app, API, codebase, repository, URL, domain, or IP with Strix — autonomous AI penetration testing that exploits and proves vulnerabilities…
SkillAFreshness: A★ 1Claude Code +9 - 0.587score
animate
mahik504
Build an animation from scratch, making the decisions in the order that determines whether it feels right — should it animate at all, what purpose, which…
SkillAFreshness: A★ 1Claude Code +9 - 0.587score
ci-security-scanning-with-strix
usestrix
Add security scanning to CI/CD with Strix — GitHub Actions, GitLab CI, or any pipeline — so every pull request gets a diff-scoped AI pentest that blocks…
SkillAFreshness: A★ 1Claude Code +9 - 0.586score
expo-upgrade
mahik504
Framework (OSS).
SkillAFreshness: A★ 1Claude Code +9 - 0.584score
orchestra-vault
mahik504
Maintain the private Orchestra workspace and its memory.
SkillAFreshness: A★ 1Claude Code +9 - 0.584score
expo-dev-client
mahik504
Framework (OSS).
SkillAFreshness: A★ 1Claude Code +9
Signals
- Stars
- 1
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Sep 4, 2026 (1 month ago)
- Last release
- Oct 24, 2026 (5 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/mahik504/orchestra-workflow
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from mahik504
- 0.592score
expo-data-fetching
mahik504
Framework (OSS).
SkillAFreshness: A★ 1Claude Code +9 - 0.592score
eas-app-stores
mahik504
EAS service (paid).
SkillAFreshness: A★ 1Claude Code +9 - 0.589score
expo-native-ui
mahik504
Framework (OSS).
SkillAFreshness: A★ 1Claude Code +9 - 0.589score
expo-router
mahik504
Framework (OSS).
SkillAFreshness: A★ 1Claude Code +9 - 0.587score
orchestra-docs
mahik504
College/product slides, reports, and papers.
SkillAFreshness: A★ 1Claude Code +9 - 0.587score
animate
mahik504
Build an animation from scratch, making the decisions in the order that determines whether it feels right — should it animate at all, what purpose, which…
SkillAFreshness: A★ 1Claude Code +9
Cite this page
expo-project-structure skill. Agent Mart. https://agentmart.dev/skills/mahik504-expo-project-structure (last updated 2026-10-24)