Thanks for your interest in contributing! GEO AI Shopify is an open-source Shopify app and we welcome pull requests, bug reports, and feature suggestions.
# Clone the repository
git clone https://github.com/madeburo/geo-ai-shopify.git
cd geo-ai-shopify
# Install dependencies
npm install
# Generate Prisma client
npx prisma generate
# Run database migrations
npx prisma migrate dev
# Start development server
shopify app dev- Node.js 20+
- Shopify Partner account
- Shopify CLI (
npm install -g @shopify/cli)
geo-ai-shopify/
├── app/
│ ├── components/ # React (Polaris) UI components
│ ├── routes/ # Remix file-based routing
│ ├── services/ # Server-side business logic (.server.ts)
│ └── utils/ # Shared utilities and constants
├── extensions/
│ └── geo-ai-seo/ # Theme Extension (Liquid templates)
├── prisma/
│ └── schema.prisma # Database schema
└── package.json
This project uses TypeScript with strict mode and follows these conventions:
- TypeScript strict mode enabled
- ESLint with Remix config (
npm run lint) - Path aliases:
~/maps to./app/ - Server-only code uses
.server.tssuffix (never bundled to client) - Services are stateless classes, instantiated per-request (no singletons)
- All admin routes authenticate via
authenticate.admin(request) - All proxy routes verify HMAC via
verifyProxySignature()
- Files:
kebab-case.tsfor utils/services,PascalCase.tsxfor components - Route files: Remix flat-file convention (
app.settings.tsx,api.llms.tsx) - Metafield namespace:
geo_aiwith keysdescription,keywords,exclude - Database models:
PascalCase(Prisma convention)
Tests use Vitest with fast-check for property-based testing:
# Run all tests
npm test
# Watch mode
npm run test:watchTest files live alongside source code in __tests__/ directories.
Open an issue with:
- Node.js version
- Shopify CLI version
- Steps to reproduce
- Expected vs. actual behavior
- Fork the repository
- Create a feature branch from
main:git checkout -b feature/your-feature - Make your changes following the coding standards above
- Add tests for new functionality
- Run
npm testandnpm run lintto verify - Commit with a clear message:
git commit -m "Add: brief description" - Push and open a PR against
main
Add: new feature description
Fix: bug description
Update: what was changed
Remove: what was removed
When modifying the Prisma schema:
- Edit
prisma/schema.prisma - Create a migration:
npx prisma migrate dev --name describe-change - Include the migration file in your PR
The extensions/geo-ai-seo/ directory contains Liquid templates injected into the storefront <head>. Changes here require shopify app deploy to take effect.
- Remix v2 with Vite and file-based routing
- Shopify App Remix SDK handles OAuth, session management, and API access
- Prisma ORM with SQLite for development (any Prisma-supported DB in production)
- GraphQL wrapper (
ShopifyApiService) handles retries, throttling, and pagination - Webhook-driven cache invalidation with DB-based debounce (5s)
- AES-256-GCM encryption for API keys via
CryptoService
By contributing, you agree that your contributions will be licensed under the GPL v2.