A React.js frontend template for building public digital restaurant menus with custom branding, layouts, and guest-facing experiences.
V-MENU is a restaurant software ecosystem for digital menus and guest services. It supports QR-based menu access, multilingual content, product customization, cart and ordering flows, waiter calls, promotional campaigns, online payments, and operational tools for restaurants.
This repository contains the public guest-facing frontend template. It is intended as a starting point for creating restaurant-specific themes and user interfaces that connect to the V-MENU API.
It does not include the complete V-MENU platform, backend services, restaurant administration tools, or payment infrastructure.
- QR-based restaurant and table initialization
- Restaurant categories, products, images, prices, and availability
- Product details, variants, add-ons, and quantity selection
- Shopping cart and checkout flow
- Promotional and discount code support
- Stripe card payment integration
- Multilingual guest interface
- Waiter call and guest action support
- Restaurant announcements and campaigns
- Guest profile and review screens
- Responsive layouts for mobile, tablet, and desktop
- Theme-ready component and Sass structure
Available features depend on the connected V-MENU API configuration and the services enabled for the restaurant.
- React 18
- Vite 5
- React Router
- React Bootstrap and Bootstrap 5
- Sass
- Stripe React
- Framer Motion
- Swiper
- Chart.js
- React Icons
- Native Fetch API for HTTP requests
- ESLint
- Node.js, preferably the current LTS release
- npm
- Access to a V-MENU-compatible API
- A valid restaurant ID and table ID for testing the public menu flow
git clone https://github.com/dayofpay/VMenu-App
cd VMenu-App
npm installnpm run devVite starts the application on its displayed local URL, normally:
http://localhost:5173
To initialize the menu with restaurant and table context, open:
http://localhost:5173/<restaurant-id>/<table-id>
The application stores this context locally and redirects the guest to the menu.
npm run buildThe production bundle is generated in dist/.
npm run previewnpm run lintThe current template selects its API endpoint and Stripe publishable key through:
src/utils/appData.jssrc/utils/pathList.js
Review these files before running or deploying a customized theme. The repository does not currently include an .env.example file or automatically read Vite environment variables.
For public forks and deployments, moving environment-specific values to Vite variables is recommended. A possible convention is:
VITE_VMENU_API_URL=https://your-api.example.com
VITE_STRIPE_PUBLIC_KEY=pk_test_your_publishable_keyTo use this convention, update the configuration code to read the values through import.meta.env.
Restaurant and table IDs are runtime route parameters, not build-time environment variables. Do not place Stripe secret keys, API secrets, backend credentials, or private tokens in frontend environment variables. Only publishable browser-safe values belong in the client application.
VMenu-App/
|-- public/ # Static assets, manifest, and public scripts
|-- src/
| |-- components/ # Shared UI and page-specific components
| | |-- AppMenus/
| | |-- Banners/
| | |-- Headers/
| | |-- Options/
| | |-- PageComponents/
| | |-- Sidebars/
| | `-- Styles/
| |-- contexts/ # Cart, restaurant state, and cooldown providers
| |-- handlers/ # Application behavior helpers
| |-- HOC/ # Higher-order components
| |-- hooks/ # Reusable React hooks
| |-- keys/ # Shared application keys and constants
| |-- lib/ # Request and integration utilities
| |-- locales/ # Translation and language resources
| |-- Pages/ # Route-level page components
| |-- services/ # V-MENU API service modules
| `-- utils/ # Configuration, storage, routes, and utilities
|-- index.html
|-- package.json
`-- vite.config.js
The template is designed to be adapted to a restaurant's visual identity.
- Start with the page composition in
src/components/PageComponents/. - Customize reusable navigation, headers, banners, menus, and sidebars in their component directories.
- Update the Sass and component styles under
src/components/Styles/and the relevant page folders. - Add or update guest-facing translations in
src/locales/. - Replace public images and brand assets with optimized restaurant assets.
- Test the complete guest journey on mobile, tablet, laptop, and desktop sizes.
When creating a theme, preserve the existing route contracts, API response handling, cart context, payment flow, local-storage keys, and restaurant/table initialization unless the connected backend is changed at the same time.
API requests are made through the shared request utility in src/lib/request.js. Domain-specific operations are grouped in src/services/, including:
- Restaurant and menu information
- Products, categories, and add-ons
- Discounts and promotional codes
- Orders and checkout
- Payments
- Announcements
- Guest actions and activity
The request layer reads the active restaurant and table context from local storage and sends it with applicable requests. API paths and response formats should remain compatible with the V-MENU backend contract.
For a custom backend integration, update the service modules and shared request utility together. Avoid calling backend endpoints directly from page components when an existing service module can own that responsibility.
- Follow the existing component, context, service, and routing patterns.
- Keep restaurant-specific styling isolated from shared business logic.
- Use service modules for API communication.
- Keep translations out of payment-provider-controlled elements and other third-party widgets.
- Preserve stable React keys when rendering translated or dynamic lists.
- Test cart totals, discounts, add-ons, checkout, and payment behavior after menu changes.
- Verify language switching after navigation between routes.
- Use responsive images and test long product names and translated text.
- Run
npm run lintandnpm run buildbefore submitting changes. - Never commit private credentials or payment secret keys.
Custom restaurant themes may change colors, typography, imagery, layout, and guest-facing content.
The V-MENU and V-DEVS names, logos, legal notices, platform attribution, and proprietary service identifiers must not be presented as belonging to another company. Do not imply that this frontend template includes ownership of the V-MENU backend, infrastructure, or commercial platform.
Third-party brands such as Stripe remain subject to their respective usage guidelines.
Contributions are welcome for bug fixes, accessibility improvements, responsive behavior, translations, documentation, and reusable frontend enhancements.
Before opening a contribution:
- Create a focused branch.
- Keep changes compatible with the existing V-MENU API contract.
- Test the affected guest flow across relevant screen sizes.
- Run the lint and production build commands.
- Describe the behavior change and testing performed.
Restaurant-specific branding and private credentials should not be included in general-purpose contributions.
License information will be added soon. Until then, all rights are reserved by V-MENU / V-DEVS.
- Website: https://v-menu.eu
- Company: V-DEVS
- Email: support@v-menu.eu
For integration access, commercial use, backend services, or restaurant onboarding, contact the V-MENU team.