External dashboards

Give an LLM the Grocery dashboard skill to adapt the built-in operator experience or create a separate client.

To create a custom Grocery dashboard, copy the skill and give it to your LLM. The skill will explain how features/dashboard supplies the Keystone administration shell while features/platform contains Grocery's product-specific operator experience.

After that source orientation, it will ask what you dislike, what should stay, what workflows and users matter, and what the replacement should look and feel like. It then traces the exact routes, feature slices, GraphQL calls, schema, access rules, sessions, and provider boundaries in the supplied Grocery codebase before proposing work.

Skill file: /skills/openfront-grocery-custom-dashboard/SKILL.md

Current platform pages

Routes are app/dashboard/(admin)/platform/<route>/page.tsx. Each route file only re-exports a screen from features/platform/<slice>. Navigation is defined in features/platform/lib/navigation.ts. The sidebar lists every page; each page checks its capability on the server.

PageCapabilityWhat operators do thereMain operations
/dashboard/platform/orderscanManageOrdersOrder queue. Start picking, mark packed or ready for pickup, cancel with a reason, refund, recover interrupted checkoutsgroceryPlatformOrders, advanceOrderFulfillment, cancelGroceryOrder, refundPayment, reconcileCheckoutAttempts
/dashboard/platform/fulfillmentcanManageOrdersPick and pack board. Record actual weights or quantities, record or propose substitutions, finalize the salegroceryPlatformFulfillment, resolveOrderLineFulfillment, recordOrderItemSubstitution, proposeOrderLineSubstitution, finalizeGroceryOrderActuals
/dashboard/platform/deliverycanManageDeliveryDelivery windows and capacity, build routes from orders, move route status, resolve stops with proof and condition, reschedule returned deliveriesgroceryPlatformDelivery, configureDeliverySlot, createDeliveryRouteFromOrders, updateDeliveryRouteWorkflow, resolveDeliveryStop, groceryDeliveryRescheduleSlots, rescheduleReturnedGroceryDelivery
/dashboard/platform/pickupcanManageDeliveryPickup slot capacity, parking spots, curbside arrivals, handoffgroceryPlatformPickup, configurePickupSlot, configureParkingSpot, completeOrderHandoff
/dashboard/platform/paymentscanManagePaymentsPayments and refunds. Refund by line, void an authorization, recover payment creation, replay stored webhooksgroceryPlatformPayments, getGroceryOrderRefundLines, refundGroceryOrderLines, voidGroceryPaymentAuthorization, recoverGroceryPaymentCreation, groceryPaymentWebhookRecovery, replayPaymentWebhookEvent
/dashboard/platform/products, /create, /[id]canManageProductsProduct list, create a draft product, edit price, unit, department, supplier, tax rate, shelf life, low-stock level, statusGenerated products, product, createProduct, updateProduct
/dashboard/platform/inventorycanManageInventoryLots and expiry. Adjust a lot, count and recount, convert cases, hold, quarantine, recall, releasegroceryPlatformInventory, adjustInventoryLot, manageInventoryCount, convertInventoryCases, manageInventorySafety
/dashboard/platform/supplierscanManageSuppliersSupplier roster, payment terms, minimum ordergroceryPlatformSuppliers, updateSupplierMinimumOrder
/dashboard/platform/purchasingcanManageInventoryCreate purchase orders, send, confirm, or cancel, receive into lots, capture supplier invoices, claims, and settlementgroceryPlatformPurchasing, groceryPurchasingOptions, createPurchaseOrderDraft, transitionPurchaseOrder, receivePurchaseOrder, manageSupplierSettlement
/dashboard/platform/merchandisingcanManageProductsDepartments, coupons, product information versions, CSV catalog importgroceryPlatformMerchandising, createDepartment, updateDepartment, updateCoupon, updateProductInformation, importGroceryCatalog
/dashboard/platform/customers, /[id]canManageUsersCustomer directory and detail with recent orders; provision a customer accountgroceryPlatformCustomers, groceryPlatformCustomer, provisionGroceryCustomer
/dashboard/platform/subscriptionscanManageOrdersRecurring baskets and preparation history; run due baskets; configure the loyalty programgroceryRecurringOverview, processDueGrocerySubscriptions, configureGroceryLoyalty
/dashboard/platform/staffcanManageUsersStaff directory, invitations, capability changes, review customer erasure requestsgroceryStaffDirectory, inviteGroceryStaff, revokeGroceryStaffInvitation, updateGroceryStaffAccess, reviewGroceryCustomerErasure
/dashboard/platform/settingscanManageOnboardingStore profile, address, contact, hours, delivery policy and postal prefixes, tax rate, logo, brand huegroceryPlatformSettings, updateGroceryStoreProfile, updateGroceryDeliveryPolicy, updateGroceryStoreLogo, updateGroceryStorefrontBrandHue
/dashboard/platform/reportscanManagePaymentsClose a trading period, import a settlement statement CSV, review matches, export a closegroceryFinancialCloses, createGroceryFinancialClose, importGrocerySettlementStatement, resolveGrocerySettlementMatch, groceryFinancialCloseExport
/dashboard/platform/messagescanManageOrdersCustomer inbox for Help-page messages, with status and internal notesGenerated contactMessages, updateContactMessage
/dashboard/platform/communicationscanManageOnboardingQueued customer emails and outbox event health; send now, replay, or reconcilegroceryOutboxStatus, deliverGroceryOutboxNow, replayGroceryOutboxEvent, reconcileGroceryCustomerDelivery

Onboarding is not a route. It is a dialog and cards in the dashboard layout (features/platform/onboarding) that call runGroceryOnboarding.

Lists without a dedicated page, such as Role, Recipe, LoyaltyTransaction, or PaymentProvider, use the generic Keystone pages at /dashboard/<list-key>, /dashboard/<list-key>/create, and /dashboard/<list-key>/<id>. Auth pages are /dashboard/init, /dashboard/signin, /dashboard/signup (only when PUBLIC_SIGNUPS_ALLOWED=true), /dashboard/reset, and /dashboard/no-access.

Notes for a custom dashboard

  • Projections and commands recheck the user's current Store and capability from the database. Do not rely on the session snapshot alone.
  • Lifecycle changes go through the named commands. Generated updates to order status, lot quantities, and role fields are blocked or restricted.
  • Most commands take an idempotencyKey. Reuse it on retry.
  • Server actions in each slice (actions.ts, features/platform/lib/taskActions.ts) show the exact GraphQL documents the built-in pages send.

On this page