{"id":31693777,"url":"https://github.com/alloy-lab/overland","last_synced_at":"2026-05-04T09:32:36.182Z","repository":{"id":317206070,"uuid":"1060361705","full_name":"alloy-lab/overland","owner":"alloy-lab","description":"A full-stack starter with React Router + Payload CMS stack.","archived":false,"fork":false,"pushed_at":"2025-11-24T09:54:06.000Z","size":7580,"stargazers_count":2,"open_issues_count":16,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-14T11:46:51.049Z","etag":null,"topics":["cms","coolify","docker","payloadcms","react-router","self-hosted","stack","tailwindcss","typescript"],"latest_commit_sha":null,"homepage":"https://github.com/alloy-lab/overland","language":"TypeScript","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/alloy-lab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-19T19:30:45.000Z","updated_at":"2025-11-06T03:13:17.000Z","dependencies_parsed_at":"2025-09-29T15:30:09.912Z","dependency_job_id":"df29f91b-761a-4495-8d62-309a5484bf44","html_url":"https://github.com/alloy-lab/overland","commit_stats":null,"previous_names":["alloy-lab/overland"],"tags_count":0,"template":true,"template_full_name":null,"purl":"pkg:github/alloy-lab/overland","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alloy-lab%2Foverland","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alloy-lab%2Foverland/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alloy-lab%2Foverland/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alloy-lab%2Foverland/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alloy-lab","download_url":"https://codeload.github.com/alloy-lab/overland/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alloy-lab%2Foverland/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32601527,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T22:12:39.696Z","status":"online","status_checked_at":"2026-05-04T02:00:06.625Z","response_time":58,"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":["cms","coolify","docker","payloadcms","react-router","self-hosted","stack","tailwindcss","typescript"],"created_at":"2025-10-08T15:53:06.593Z","updated_at":"2026-05-04T09:32:36.160Z","avatar_url":"https://github.com/alloy-lab.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"apps/web/public/stratos.png#gh-light-mode-only\" alt=\"Stratos the sky bison\" width=\"400\" style=\"max-width: 100%; height: auto;\" /\u003e\n  \u003cimg src=\"apps/web/public/stratos-dark.png#gh-dark-mode-only\" alt=\"Stratos the sky bison\" width=\"400\" style=\"max-width: 100%; height: auto;\" /\u003e\n  \u003cbr /\u003e\n  \u003cimg src=\"apps/web/app/welcome/logo-light.svg#gh-light-mode-only\" alt=\"Overland Stack\" width=\"400\" style=\"max-width: 100%; height: auto;\" /\u003e\n  \u003cimg src=\"apps/web/app/welcome/logo-dark.svg#gh-dark-mode-only\" alt=\"Overland Stack\" width=\"400\" style=\"max-width: 100%; height: auto;\" /\u003e\n\u003c/div\u003e\n\nA full-stack starter with React Router v7, Payload CMS, and PostgreSQL. Ready to deploy.\n\n\u003cdiv align=\"center\"\u003e\n\n[![CI](https://github.com/alloy-lab/overland/actions/workflows/ci.yml/badge.svg)](https://github.com/alloy-lab/overland/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n\u003c/div\u003e\n\n## What's included\n\n- **React Router v7** with SSR and file-based routing\n- **Payload CMS v3** with PostgreSQL and rich content management\n- **TypeScript** with strict type checking and auto-generated types\n- **Security Package** (`@alloylab/security`) with CORS, rate limiting, and CSRF protection\n- **SEO Package** (`@alloylab/seo`) with structured data, meta tags, and sitemaps\n- **Collection Registry** (`@alloylab/collection-registry`) for automated type generation\n- **Testing** with Vitest (unit) and Playwright (E2E)\n- **Development Tools** including ESLint, Prettier, and Lefthook git hooks\n- **Docker** setup for development and production deployment\n\n## Features\n\n- **Security**: Built-in security middleware with CORS, rate limiting, and CSRF protection\n- **SEO**: Comprehensive SEO package with structured data, meta tags, and sitemaps\n- **Type Safety**: Auto-generated TypeScript types from CMS collections\n- **Testing**: Unit tests with Vitest and E2E tests with Playwright\n- **Performance**: Image optimization and performance monitoring\n- **Development**: Hot reload, auto-formatting, and comprehensive linting\n\n## Optional features (Coming soon)\n\n- Email integration\n- Error monitoring\n- i18n support\n- Dark/light theme\n- Stripe payments\n\n## 📁 Project Structure\n\n```\noverland/\n├── apps/\n│   ├── cms/                 # Payload CMS application\n│   │   ├── src/\n│   │   │   ├── app/         # Next.js app directory\n│   │   │   │   ├── (frontend)/ # Frontend routes\n│   │   │   │   └── (payload)/  # Payload admin routes\n│   │   │   ├── collections/ # Content collections (Pages, Users, Media)\n│   │   │   ├── globals/    # Global settings (SiteSettings)\n│   │   │   └── migrations/ # Database migrations\n│   │   ├── tests/          # CMS tests (unit, E2E)\n│   │   └── Dockerfile\n│   └── web/                 # React Router v7 SSR application\n│       ├── app/\n│       │   ├── routes/     # React Router v7 file-based routes\n│       │   ├── lib/        # Utilities and auto-generated API clients\n│       │   │   ├── clients/ # Auto-generated collection clients\n│       │   │   └── types/  # Auto-generated TypeScript types\n│       │   └── welcome/    # Welcome page components\n│       ├── tests/          # Web app tests (unit, E2E)\n│       └── Dockerfile\n├── packages/\n│   └── ui/                  # Shared UI components\n├── scripts/                 # Development and build scripts\n│   └── collection-registry.js # Automated type/client generation\n├── docker-compose.yml       # Production deployment\n├── docker-compose.dev.yml   # Development environment\n├── pnpm-workspace.yaml     # pnpm workspace configuration\n├── lefthook.yml            # Git hooks configuration\n└── package.json            # Root workspace configuration\n```\n\n### pnpm Workspace\n\n- Root workspace with shared dependencies\n- Apps: `cms` and `web`\n- Packages: `@acme/ui` for shared components\n\n## Tech Stack\n\n- TypeScript\n- pnpm workspaces\n- React Router v7, Vite SSR\n- Payload CMS v3, PostgreSQL\n- Docker\n\n## Quick Start\n\n### Prerequisites\n\n- Node.js 24.8.0+\n- pnpm 10.17.1+\n- Docker \u0026 Docker Compose\n\n### Setup\n\n```bash\n# Clone and setup\ngit clone https://github.com/alloy-lab/overland.git\ncd overland\ncp env.example .env\n\n# Generate a secure PAYLOAD_SECRET\nnode -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"\n# Copy the output and update PAYLOAD_SECRET in .env\n\n# Install and start\npnpm install\npnpm dev\n```\n\n### Access\n\n- Web App: http://localhost:3000\n- CMS Admin: http://localhost:3001/admin\n\n## Content Management\n\n### Collections\n\n- **Pages**: Static pages with rich text and SEO\n- **Users**: CMS administrators\n- **Media**: File uploads\n\n### Features\n\n- Rich text editor (Lexical)\n- SEO fields\n- Draft/published workflow\n- Auto-generated TypeScript types\n\n## Auto-generated Types\n\nTypes and API clients are automatically generated from CMS collections:\n\n```bash\npnpm generate:types\n```\n\nThis creates:\n\n- TypeScript interfaces in `apps/web/app/lib/types/`\n- API client classes in `apps/web/app/lib/clients/`\n- Route files in `apps/web/app/routes/`\n\n## Deployment\n\n### Build\n\n```bash\npnpm build\n```\n\n### Docker\n\n```bash\n# Development environment\ndocker compose -f docker-compose.dev.yml --profile development up -d\n\n# Production environment\ndocker compose up -d\n```\n\n### Database Sync to Coolify\n\nSync your local database changes to your Coolify-hosted environment:\n\n```bash\n# Setup (one-time)\ncp env.coolify.example .env.coolify\n# Edit .env.coolify with your Coolify details\n\n# Sync database\npnpm db:sync\n\n# Or create backup only\npnpm db:backup\n```\n\nSee [DATABASE_SYNC.md](./DATABASE_SYNC.md) for detailed instructions.\n\n### Environment Variables\n\n```env\nDATABASE_URI=postgresql://user:password@host:port/database\nPAYLOAD_SECRET=your-secure-secret-key\nPAYLOAD_PUBLIC_SERVER_URL=https://your-domain.com\nPAYLOAD_PUBLIC_CMS_URL=https://your-domain.com/admin\n```\n\n## Testing\n\n### Unit Tests\n\n- Vitest with jsdom\n- Location: `apps/web/tests/unit/`\n- Run: `pnpm test:unit`\n\n### E2E Tests\n\n- Playwright\n- Location: `apps/web/tests/e2e/`\n- Run: `pnpm test:e2e`\n\n### Commands\n\n- `pnpm test` - All tests\n- `pnpm test:unit` - Unit tests only\n- `pnpm test:e2e` - E2E tests only\n\n## Development\n\n### Adding Collections\n\n1. Create collection in `apps/cms/src/collections/`\n2. Add to `payload.config.ts`\n3. Run `pnpm generate:types`\n\n### AlloyLab Packages\n\nThe template includes several published packages from the AlloyLab ecosystem:\n\n#### Collection Registry (`@alloylab/collection-registry` v1.1.2)\n\nAutomatically generates TypeScript types, API client methods, and React Router route files from your Payload CMS collections.\n\n#### Security Package (`@alloylab/security` v1.0.2)\n\nProvides comprehensive security middleware including CORS, rate limiting, CSRF protection, and request sanitization.\n\n#### SEO Package (`@alloylab/seo` v1.0.1)\n\nHandles structured data generation, meta tags, sitemaps, and SEO optimization for your web application.\n\n#### Package Dependencies\n\n```json\n{\n  \"dependencies\": {\n    \"@alloylab/collection-registry\": \"^1.1.2\",\n    \"@alloylab/security\": \"^1.0.2\",\n    \"@alloylab/seo\": \"^1.0.1\"\n  }\n}\n```\n\nThe collection registry automatically:\n\n- Scans your Payload collections\n- Generates TypeScript types in `apps/web/app/lib/types/`\n- Creates API client methods in `apps/web/app/lib/clients/`\n- Generates React Router route files in `apps/web/app/lib/routes/`\n\n### Adding Routes\n\nCreate route files in `apps/web/app/routes/` (React Router v7 file-based routing).\n\n### Scripts\n\n- `pnpm dev` - Start development\n- `pnpm build` - Build all apps\n- `pnpm test` - Run tests\n- `pnpm generate:types` - Generate types from CMS\n- `pnpm format` - Format code\n- `pnpm db:sync` - Sync local database to Coolify\n- `pnpm db:backup` - Create local database backup\n\n## Customization\n\n### Styling\n\nUses Tailwind CSS v4 with the new `@theme` directive. Customize in `apps/web/app/app.css` or replace with your preferred framework.\n\n### CMS\n\n- Add custom fields in `apps/cms/src/fields/`\n- Add collection hooks for custom logic\n- Install Payload plugins\n\n### API\n\n- Add custom routes in `apps/cms/src/app/(payload)/api/`\n- Extend web app API in `apps/web/server/`\n\n## Contributing\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.\n\n## License\n\nMIT License - see [LICENSE](./LICENSE).\n\n## Troubleshooting\n\n### Common Issues\n\n#### Type Generation Errors\n\nIf you encounter type generation errors, ensure your database is running and accessible:\n\n```bash\n# Check database connection\npnpm generate:types\n```\n\n#### Test Failures\n\nIf tests are failing, ensure all environment variables are set:\n\n```bash\n# Copy environment template\ncp env.example .env\n\n# Run tests with proper environment\nNODE_ENV=test pnpm test:unit\n```\n\n#### Build Errors\n\nIf builds fail, ensure all dependencies are installed and types are generated:\n\n```bash\n# Clean install\nrm -rf node_modules\npnpm install\n\n# Generate types\npnpm generate:types\n\n# Build\npnpm build\n```\n\n### Getting Help\n\n- [Discord Community](https://discord.gg/8NeX7C7V)\n- [Payload CMS Docs](https://payloadcms.com/docs)\n- [React Router Docs](https://reactrouter.com)\n- Create GitHub issues for bugs and features\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falloy-lab%2Foverland","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falloy-lab%2Foverland","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falloy-lab%2Foverland/lists"}