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 install`
-`npm run dev`
-`npm run build`
-`npm 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 `kitchen` user application and kitchen endpoints
### Build for production
1. Install dependencies:
```bash
npm install
```
2. Create the production build:
```bash
npm run build
```
3. 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
```bash
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:
If Lonc is served by the same nginx origin as the API, leave the server URL empty in the app settings so requests stay same-origin and avoid unnecessary browser CORS checks.
- `Authorization` headers 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.webmanifest` with an appropriate web manifest content type
- make sure `service-worker.js` is reachable from the deployed site root
- avoid aggressive caching on `index.html` during upgrades so new builds are picked up reliably
### Smoke test after deployment
After deployment, verify that:
1. the site loads from the production URL
2. login can create a Tryton user application key
3. kitchen selection loads successfully
4. stock review and label creation can reach the backend
5. the browser can install the app as a PWA
## Project structure
```text
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`](/Users/blaz/PycharmProjects/lonc/src/app/config.js), and the canonical URL builder lives in [`src/api/client.js`](/Users/blaz/PycharmProjects/lonc/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/`
- `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/kitchens`
Requires `Authorization: Bearer <application_key>` and is used as the current lightweight verification call after key approval.
Returns `{ data: [...] }` or `{ kitchens: [...] }`.