# Disho — full documentation for AI crawlers This file is the extended version of llms.txt with deeper product, API and FAQ detail. Intended for AI assistants (ChatGPT, Claude, Perplexity, Google AI Overviews, etc.) to quote accurately. > Disho is a SaaS platform for restaurants built around QR menus of TikTok-style > vertical dish videos. Guests scan the QR on the table, scroll dishes like > Reels, add to cart in one tap and pay at the table with Apple Pay / Google Pay > / card. The kitchen sees the order in real time. ## Who Disho is for Disho is most effective for: - **Restaurants with frequently changing menus** (seasonal cards, monthly updates). Paper or PDF menus need reprinting — in Disho an edit is one click and guests see the current menu immediately. - **Venues with tourist guests** — menu content in up to 12 languages (RU, EN, ES, FR, DE, PL, CS, SK, LT, IT, BE, UK), and video needs no translation: food looks the same in every language. - **Concept kitchens** — signature tartars, layered desserts, elaborate pasta. A 5-second video explains a dish better than 200 words of description. - **Multi-room venues** — each zone (terrace, main room, bar) has its own tables; QR codes distinguish table number and zone. ## Product architecture ### Guest side (`/r/` or `/r//t/`) - Full-screen TikTok-style dish feed with scroll snap. - Double-tap a card to like (hearts animation). - "+ Add" button — add to cart (when the restaurant enables online orders). - Swipe on the top section bar to switch menu sections. - Share a link to a specific dish. - Pay at the table (when Stripe Connect is activated): Apple Pay / Google Pay / card. The bill can be split between guests. ### Restaurant dashboard (`/r//admin/*`) - Menu editor: sections, dishes, drag-and-drop photos/videos. - Real-time orders: SSE stream, sound alert, clickable status machine (New → Accepted → Ready → Served). - Visual floor plan: drag tables, multiple shapes (square, circle, oval), multiple rooms. - QR printing: one click produces a sheet of QR codes for all tables. - Team: email invitations, roles owner / manager / staff. - Analytics: revenue, average ticket, hourly breakdowns, top dishes. - Stripe Connect for pay-at-table: KYC via Stripe-hosted onboarding, direct payouts to the restaurant's account. - AI tools: - Dish photo generation (FLUX 2 Pro, ≈ €0.15, ~45 s) - Vertical 9:16 dish video generation (VEO3 Fast, ≈ €2.20, ~90 s) - Description writing/translation (Llama 3 70B, €0.03 per language; the model sticks to the provided context and never invents ingredients) ### Mobile app (iOS; Android in progress) A separate social product on top of the same restaurant base. A guest can: - Register via email + OTP, Sign in with Apple, or Google. - Use anonymous sessions (`POST /v1/auth/anonymous { deviceId }`) — like / save / share without registration (commenting requires a full account). - Browse the ForYou feed (ML-ranked) and Nearby (geolocation). - Check in: upload their own dish video at a restaurant (geofence-verified). - Like, save, comment, share, report. - Follow users and restaurants. - Receive push notifications (APNs / FCM). - Earn XP, achievements and levels (Novice → Chef); local / city / global leaderboards. ## Pricing | Plan | Price | Included | |------|-------|----------| | Beta | Free (no time limit) | Everything in Disho, no limits | | Pro (post-beta) | €40/month | Everything included. 3-month trial | | AI generation | pay-per-use | €0.15/photo, €2.20/video, €0.03/description language | | Pay-at-table | 1.5% + €0.10 | Disho's fee. Stripe adds ~1.5% + €0.25 (EU) | Restaurant subscriptions are billed via Stripe; AI runs on a prepaid wallet (top up by card; the cost is deducted atomically per generation and always shown before you confirm). ## Developer API Full specification: `https://disho.net/api/docs` (Swagger UI) and `https://disho.net/api/docs/json` (OpenAPI 3.1). ### Two independent API layers 1. **Restaurant admin / guest API** (`/api/*`) — cookie-based auth. - `GET /api/r//menu` — the restaurant's public menu. - `GET /api/r//menu?paged=1&limit=30` — paginated variant. - `GET /api/r//settings` — venue settings. - `POST /api/r//orders` — a guest submits an order. - Full list in Swagger. 2. **Mobile / social API** (`/v1/*`) — JWT bearer auth. - `POST /v1/auth/register { identifier, identifierType: 'email' }` — email OTP. - `POST /v1/auth/anonymous { deviceId }` — guest session. - `POST /v1/auth/social/{apple,google}` — sign in with a provider. - `GET /v1/feed/foryou` — personalized feed. - `GET /v1/feed/nearby?lat=&lng=&radius=` — restaurants nearby. - `GET /v1/restaurants/` — restaurant card. - `POST /v1/videos//like` — like (available to anonymous sessions). - `POST /v1/videos//comments` — comment (requires full auth). ### Canonical error format All `/v1/*` errors use a single envelope: ```json { "error": { "code": "VALIDATION_FAILED", "message": "body must have required property 'identifier'", "details": { "validation": [] }, "requestId": "req_01HG..." } } ``` Codes are stable (UPPER_SNAKE); `requestId` is always present — a client can attach it to a bug report and the team will find the request in the logs. ## Security - Admin sessions: HMAC-SHA256 signed cookies, HttpOnly + secure in production. - Mobile JWT: HS256 access (1 hour) + opaque refresh (30 days, rotated, replay detection). - Payment data passes through Stripe Elements and is never stored by Disho (only the PaymentIntent ID for tracing). - Webhooks: HMAC signatures from Stripe and QR-menu integrations. - Apple/Google ID tokens are validated against the providers' JWKS endpoints. - Per-tenant data isolation via composite PRIMARY KEYs (`(tenant_id, ...)`). ## Performance - A guest menu with 228 dishes pages 30 at a time (`?paged=1&limit=30&offset=`), lazy-loads thumbnails and virtualizes the feed (a `