{"id":45629576,"url":"https://github.com/mighty840/kitchenasty","last_synced_at":"2026-02-23T23:39:09.230Z","repository":{"id":339177781,"uuid":"1160704540","full_name":"mighty840/kitchenasty","owner":"mighty840","description":"A self-hosted restaurant online ordering, table reservation, and management system. KitchenAsty enables restaurants, cafes, and takeaways to accept online orders for delivery and pickup, manage menus, handle table reservations, and run operations from a single admin panel ","archived":false,"fork":false,"pushed_at":"2026-02-18T14:22:32.000Z","size":656,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-18T15:52:37.716Z","etag":null,"topics":["delivery-app","kitchen","order-management","restaurant","self-hosted"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mighty840.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-18T09:18:20.000Z","updated_at":"2026-02-18T14:22:51.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mighty840/kitchenasty","commit_stats":null,"previous_names":["mighty840/kitchenasty"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/mighty840/kitchenasty","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mighty840%2Fkitchenasty","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mighty840%2Fkitchenasty/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mighty840%2Fkitchenasty/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mighty840%2Fkitchenasty/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mighty840","download_url":"https://codeload.github.com/mighty840/kitchenasty/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mighty840%2Fkitchenasty/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29760872,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-23T21:02:23.375Z","status":"ssl_error","status_checked_at":"2026-02-23T20:58:31.539Z","response_time":90,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["delivery-app","kitchen","order-management","restaurant","self-hosted"],"created_at":"2026-02-23T23:39:08.003Z","updated_at":"2026-02-23T23:39:09.225Z","avatar_url":"https://github.com/mighty840.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/mighty840/kitchenasty\"\u003e\n    \u003cimg src=\"assets/logo.svg\" alt=\"KitchenAsty Logo\" width=\"420\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eKitchenAsty\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cem\u003eSelf-hosted restaurant ordering, reservations, and management — all in one platform.\u003c/em\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/mighty840/kitchenasty/actions/workflows/ci.yml\"\u003e\u003cimg src=\"https://github.com/mighty840/kitchenasty/actions/workflows/ci.yml/badge.svg\" alt=\"CI\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://mighty840.github.io/kitchenasty/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Docs-GitHub%20Pages-blue?logo=readthedocs\u0026logoColor=white\" alt=\"Docs\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.typescriptlang.org/\"\u003e\u003cimg src=\"https://img.shields.io/badge/TypeScript-5.7-blue?logo=typescript\u0026logoColor=white\" alt=\"TypeScript\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://react.dev/\"\u003e\u003cimg src=\"https://img.shields.io/badge/React-18-61DAFB?logo=react\u0026logoColor=white\" alt=\"React\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://nodejs.org/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Node.js-22-339933?logo=nodedotjs\u0026logoColor=white\" alt=\"Node.js\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.postgresql.org/\"\u003e\u003cimg src=\"https://img.shields.io/badge/PostgreSQL-16-4169E1?logo=postgresql\u0026logoColor=white\" alt=\"PostgreSQL\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.docker.com/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Docker-blue?logo=docker\u0026logoColor=white\" alt=\"Docker\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://expressjs.com/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Express-4-000000?logo=express\u0026logoColor=white\" alt=\"Express\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.prisma.io/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Prisma-5-2D3748?logo=prisma\u0026logoColor=white\" alt=\"Prisma\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://socket.io/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Socket.IO-4-010101?logo=socketdotio\u0026logoColor=white\" alt=\"Socket.IO\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://tailwindcss.com/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Tailwind_CSS-3-06B6D4?logo=tailwindcss\u0026logoColor=white\" alt=\"Tailwind CSS\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://playwright.dev/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Playwright-E2E-2EAD33?logo=playwright\u0026logoColor=white\" alt=\"Playwright\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://vite.dev/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Vite-5-646CFF?logo=vite\u0026logoColor=white\" alt=\"Vite\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" alt=\"License: MIT\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#quick-start\"\u003eQuick Start\u003c/a\u003e \u0026middot;\n  \u003ca href=\"https://mighty840.github.io/kitchenasty/\"\u003eDocs\u003c/a\u003e \u0026middot;\n  \u003ca href=\"https://github.com/mighty840/kitchenasty/issues/new?template=bug_report.md\"\u003eReport Bug\u003c/a\u003e \u0026middot;\n  \u003ca href=\"https://github.com/mighty840/kitchenasty/issues/new?template=feature_request.md\"\u003eRequest Feature\u003c/a\u003e \u0026middot;\n  \u003ca href=\"https://github.com/mighty840/kitchenasty/discussions\"\u003eDiscussions\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\nKitchenAsty enables restaurants, cafes, and takeaways to accept online orders for delivery and pickup, manage menus, handle table reservations, and run day-to-day operations from a single admin panel. Built as a modern TypeScript monorepo with separate admin and storefront frontends, a REST API with real-time WebSocket updates, and a full test suite with 330+ tests.\n\n---\n\n## Features\n\n### Ordering \u0026 Payments\n\n- Online ordering with delivery/pickup, scheduling, and guest checkout\n- Stripe payment integration with webhooks, plus cash-on-delivery\n- Real-time order tracking with visual progress and Socket.IO updates\n- Kitchen display — live Kanban board with one-click status progression\n- Coupon system with percentage, fixed, and free-delivery discount types\n\n### Menu \u0026 Kitchen\n\n- Category management with nesting and menu item CRUD\n- Options, allergens, and mealtime tagging per item\n- Image uploads (JPEG/PNG/WebP/GIF, 5 MB max) with preview\n- Stock tracking with automatic availability updates\n\n### Reservations \u0026 Reviews\n\n- Customer booking with time-slot availability checking\n- Admin reservation workflow: pending, confirmed, seated, completed\n- Table assignment with capacity tracking and reservation protection\n- Customer reviews (1-5 stars) with admin moderation (approve/reject)\n\n### Staff Management\n\n- Three-tier role system: Super Admin, Manager, Staff\n- Email-based staff invitation with secure single-use tokens (7-day expiry)\n- Role-based admin navigation — each role sees only their permitted pages\n- Staff CRUD: list, search, filter by role, edit, activate/deactivate\n\n### Settings \u0026 Configuration\n\n- Centralized admin settings dashboard with clickable card grid\n- 7 settings groups: General, Orders, Reservations, Mail, Payments, Reviews, Advanced\n- DB-first config resolution for email, Stripe, and PayPal with env var fallback\n- Secret masking for sensitive fields (API keys, passwords) in the UI and API\n- Role-based settings access (MANAGER vs SUPER_ADMIN)\n- Test email functionality to verify SMTP configuration\n\n### Analytics \u0026 Automation\n\n- Dashboard with real-time metrics: orders, revenue, reservations, customers\n- Interactive charts: revenue trends, daily orders, hourly patterns, category breakdown\n- Branded HTML email notifications for order and reservation confirmations\n- API docs via Swagger UI at `/api/docs`\n\n### Internationalization\n\n- i18n with react-i18next and language switcher\n- English, Spanish, French, German, Italian, and Portuguese translations\n\n### Developer Experience\n\n- TypeScript strict mode across the entire monorepo\n- Vitest unit/integration + Playwright E2E (330+ tests)\n- GitHub Actions CI: lint, test, audit, build, and artifact packaging\n- Docker Compose for local PostgreSQL, npm workspaces for monorepo\n\n---\n\n## Tech Stack\n\n| Layer | Technology |\n|-------|-----------|\n| **Backend** | [Node.js](https://nodejs.org/) + [Express](https://expressjs.com/) |\n| **Frontend (Admin)** | [React 18](https://react.dev/) + [Vite](https://vite.dev/) |\n| **Frontend (Storefront)** | [React 18](https://react.dev/) + [Vite](https://vite.dev/) |\n| **Database** | [PostgreSQL](https://www.postgresql.org/) + [Prisma ORM](https://www.prisma.io/) |\n| **Auth** | JWT ([jsonwebtoken](https://github.com/auth0/node-jsonwebtoken)) + [bcrypt](https://github.com/dcodeIO/bcrypt.js) |\n| **Validation** | [Zod](https://zod.dev/) |\n| **Real-time** | [Socket.IO](https://socket.io/) |\n| **Charts** | [Recharts](https://recharts.org/) |\n| **File Upload** | [Multer](https://github.com/expressjs/multer) |\n| **Styling** | [Tailwind CSS](https://tailwindcss.com/) |\n| **Testing** | [Vitest](https://vitest.dev/) + [Supertest](https://github.com/ladjs/supertest) + [Playwright](https://playwright.dev/) |\n| **CI/CD** | [GitHub Actions](https://github.com/features/actions) |\n| **Language** | [TypeScript](https://www.typescriptlang.org/) (strict mode) |\n\n---\n\n## Quick Start\n\n### Prerequisites\n\n- **Node.js** 22+ \u0026nbsp;|\u0026nbsp; **Docker** (for PostgreSQL) \u0026nbsp;|\u0026nbsp; **npm** 10+\n\n### 1. Clone \u0026 install\n\n```bash\ngit clone git@github.com:mighty840/kitchenasty.git\ncd kitchenasty\nnpm install\n```\n\n### 2. Start the database\n\n```bash\ndocker compose up -d\n```\n\n### 3. Set up environment \u0026 migrate\n\n```bash\ncp packages/server/.env.example packages/server/.env\nnpx -w packages/server prisma migrate dev --schema ../../prisma/schema.prisma\nnpx -w packages/server prisma db seed\n```\n\n### 4. Start development servers\n\n```bash\nnpm run dev:server      # API server → http://localhost:3000\nnpm run dev:admin       # Admin panel → http://localhost:5173\nnpm run dev:storefront  # Storefront  → http://localhost:5174\n```\n\n---\n\n## Project Structure\n\n```\nkitchenasty/\n├── .github/workflows/     # CI pipeline\n├── assets/                # Logo and brand assets\n├── e2e/                   # Playwright E2E tests\n│   ├── admin/             #   Admin panel tests\n│   └── storefront/        #   Customer storefront tests\n├── packages/\n│   ├── admin/             # React admin panel (Vite, port 5173)\n│   ├── docs/              # VitePress documentation site\n│   ├── server/            # Express API server (port 3000)\n│   ├── shared/            # Shared types and constants\n│   └── storefront/        # React customer storefront (Vite, port 5174)\n├── prisma/\n│   ├── schema.prisma      # Database schema (20 models)\n│   └── seed.ts            # Sample data seeder\n├── docker-compose.yml     # PostgreSQL for local dev\n├── playwright.config.ts   # E2E test configuration\n└── PLAN.md                # Full feature roadmap\n```\n\n---\n\n## Documentation\n\nFull documentation is available at **[mighty840.github.io/kitchenasty](https://mighty840.github.io/kitchenasty/)**, including:\n\n- [Getting Started Guide](https://mighty840.github.io/kitchenasty/guide/introduction.html)\n- [Self-Hosting Guide](https://mighty840.github.io/kitchenasty/self-hosting/overview.html) — server setup, Docker, reverse proxy, SSL, backups\n- [Mobile App Publishing](https://mighty840.github.io/kitchenasty/mobile-app/overview.html) — developer accounts, building, app store submission\n- [API Reference](https://mighty840.github.io/kitchenasty/api/overview.html) — all endpoints with request/response schemas\n- [Configuration](https://mighty840.github.io/kitchenasty/configuration/environment-variables.html) — environment variables, payments, email, social login\n\nInteractive Swagger UI is served at [`/api/docs`](http://localhost:3000/api/docs) when the server is running.\n\n---\n\n## Contributing\n\nWe welcome contributions of all kinds! Please read our **[Contributing Guide](CONTRIBUTING.md)** to get started.\n\n1. Fork the repository and create a feature branch from `main`\n2. Make changes and add tests\n3. Ensure all tests pass: `npm test \u0026\u0026 npm run test:e2e`\n4. Push and open a pull request\n\nLooking for a good starting point? Check out issues labeled [`good first issue`](https://github.com/mighty840/kitchenasty/labels/good%20first%20issue).\n\nSee [`PLAN.md`](PLAN.md) for the full roadmap and feature ideas.\n\n---\n\n## Community\n\n- [GitHub Discussions](https://github.com/mighty840/kitchenasty/discussions) — Ask questions, share ideas, get help\n- [Issue Tracker](https://github.com/mighty840/kitchenasty/issues) — Report bugs and request features\n- [Security Policy](SECURITY.md) — Report vulnerabilities responsibly\n- [Code of Conduct](CODE_OF_CONDUCT.md) — Our community standards\n\n---\n\n## License\n\nThis project is licensed under the [MIT License](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmighty840%2Fkitchenasty","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmighty840%2Fkitchenasty","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmighty840%2Fkitchenasty/lists"}