- Add base app structure, including Bootstrap setup and Alpine.js integration. - Implement authentication flow with session handling. - Integrate stock management and label creation functionalities. - Include responsive styling and theme using CSS variables and custom components. - Add API clients for Tryton-based backend. - Set up kitchen and dashboard navigation workflows. - Configure service worker for PWA support.
Lonc
Lonc is a responsive PWA frontend for household kitchen stock and labeling workflows backed by Tryton APIs.
Stack
- Vite for a lightweight client build
- Bootstrap 5 for layout and form styling
- Alpine.js for local component state and interaction
- Plain
fetch()service modules for backend communication - Static manifest and service worker for PWA installability
Scripts
npm installnpm run devnpm run buildnpm run preview
Production installation
Requirements
- Node.js 20 or newer
- npm 10 or newer
- A static web server for the generated
dist/directory - A Tryton backend that exposes the
kitchenuser application and kitchen endpoints
Build for production
-
Install dependencies:
npm install -
Create the production build:
npm run build -
Deploy the generated
dist/directory to your web server.
Serve the built app
Lonc is a static frontend. In production you do not run a Node.js application server for it. You build the app once and serve the files from dist/ with a normal static web server such as:
- Nginx
- Apache
- Caddy
- a CDN/static hosting platform
The frontend uses hash-based routing, so no special SPA history fallback is required for route handling.
Example deployment flow
npm install
npm run build
rsync -av dist/ /var/www/lonc/
Then configure your web server to serve /var/www/lonc as a static site.
Runtime configuration
The application does not require build-time environment variables for the Tryton connection. Users configure the following in the login screen:
- Tryton server base URL
- database name
- user login
Authentication is done with Tryton user application keys for the kitchen application, not with JSON-RPC session login.
Reverse proxy / browser requirements
If the frontend and Tryton backend are served from different origins, the Tryton server must allow cross-origin requests from the frontend origin.
At minimum, production should ensure:
Authorizationheaders are accepted for API requests- CORS is configured for the frontend origin when origins differ
- HTTPS is enabled in production
PWA notes
For installability and service worker support:
- serve
manifest.webmanifestwith an appropriate web manifest content type - make sure
service-worker.jsis reachable from the deployed site root - avoid aggressive caching on
index.htmlduring upgrades so new builds are picked up reliably
Smoke test after deployment
After deployment, verify that:
- the site loads from the production URL
- login can create a Tryton user application key
- kitchen selection loads successfully
- stock review and label creation can reach the backend
- the browser can install the app as a PWA
Project structure
public/
icons/
manifest.webmanifest
offline.html
service-worker.js
src/
api/
app/
components/
features/
styles/
main.js
index.html
package.json
Current MVP features
- Login/configuration screen for Tryton server URL and database
- Session restore and logout shell
- Active kitchen selection and switching
- Dashboard with quick actions
- Label creation flow with item lookup, location loading, preview, and stock entry creation
- Stock list with search and filters
- Stock detail page with stock adjustment workflow
- PWA manifest, icons, service worker, and offline fallback
Tryton integration assumptions
The frontend is intentionally organized around adapter-style API modules so the exact backend contract can be finalized without rewriting screens.
Default endpoint placeholders live in src/app/config.js, and the canonical URL builder lives in src/api/client.js.
Expected shapes today:
-
Kitchen-scoped application resources use:
/{database}/kitchen/{kitchen_id}/{resource} -
User application key management uses:
/{database}/user/application/ -
Non-kitchen-scoped authenticated resources currently assume:
/{database}/{resource} -
POST /{database}/user/application/Sends{ user, application: "kitchen" }and returns the application key as a JSON string. -
DELETE /{database}/user/application/Sends{ user, key, application: "kitchen" }and disconnects the client. -
GET /{database}/kitchen/kitchensRequiresAuthorization: Bearer <application_key>and is used as the current lightweight verification call after key approval. Returns{ data: [...] }or{ kitchens: [...] }. -
GET /{database}/kitchen/items?search_name=...Returns item definitions for autocomplete. -
POST /{database}/kitchen/items?label=1Creates a stock item plus label-related output on the backend side. -
POST /{database}/kitchen/items?label=1&preview=1Returns an image blob,{ imageUrl }, or{ imageSvg }for in-browser preview. -
GET /{database}/kitchen/locationsReturns a nested location tree. -
GET /{database}/kitchen/{kitchen_id}/stock,GET /{database}/kitchen/{kitchen_id}/stock/:id,POST /{database}/kitchen/{kitchen_id}/stock/:id/adjustBack the stock overview, creation, and adjustment workflows.
Notes
- Hash-based routing is used to keep static deployment simple.
- Local storage only keeps non-sensitive app config, session payload, active kitchen, and label draft state.
- Kitchen context now lives in the URL path instead of a custom header.
includeKitchen: falsein the API client only removes the kitchen path segment; it does not disable bearer authentication.