{"id":39389060,"url":"https://github.com/tmlmt/cooklang-shopper","last_synced_at":"2026-04-27T01:02:41.206Z","repository":{"id":326597532,"uuid":"1103695185","full_name":"tmlmt/cooklang-shopper","owner":"tmlmt","description":"Self-hosted, Nuxt-powered app to manage recipes, create shopping list, fill in matching products in a cart and send it to an online store","archived":false,"fork":false,"pushed_at":"2026-04-26T00:06:00.000Z","size":3155,"stargazers_count":2,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-26T02:14:59.918Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Vue","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tmlmt.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-25T08:02:01.000Z","updated_at":"2026-04-26T00:06:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tmlmt/cooklang-shopper","commit_stats":null,"previous_names":["tmlmt/cooklang-shopper"],"tags_count":38,"template":false,"template_full_name":null,"purl":"pkg:github/tmlmt/cooklang-shopper","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmlmt%2Fcooklang-shopper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmlmt%2Fcooklang-shopper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmlmt%2Fcooklang-shopper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmlmt%2Fcooklang-shopper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tmlmt","download_url":"https://codeload.github.com/tmlmt/cooklang-shopper/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tmlmt%2Fcooklang-shopper/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32318417,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T23:26:28.701Z","status":"ssl_error","status_checked_at":"2026-04-26T23:26:25.802Z","response_time":129,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-18T03:07:35.947Z","updated_at":"2026-04-27T01:02:41.200Z","avatar_url":"https://github.com/tmlmt.png","language":"Vue","funding_links":[],"categories":["For Tinkerers"],"sub_categories":["Self-Hosting"],"readme":"# Cooklang Shopper\n\n\u003cpicture\u003e\u003cimg src=\"https://badges.ws/maintenance/yes/2026\" /\u003e\u003c/picture\u003e\n\u003cpicture\u003e\u003cimg src=\"https://badges.ws/github/release/tmlmt/cooklang-shopper\" /\u003e\u003c/picture\u003e\n\nSelf-hosted, Nuxt-powered web app to manage cooklang recipes, create a shopping list, fill a cart with matching products and send it to an online store. Using the [`@tmlmt/cooklang-parser`](https://cooklang-parser.tmlmt.com/v3) Typescript parser, in its v3 version (alpha stage).\n\nThe app is currently in pre-v1 i.e beta version and in active development. Only recipe management (browsing, viewing, creating, editing) and shopping lists are functional at the moment while the rest is partially developed and therefore hidden an `experimental` flag. Feel free to test it out and report issues or feature requests.\n\n## Features\n\n### 🍳 Cooklang-native\n\n- **File \u0026 folder based** — recipes live as plain `.cook` text files in regular directories — easy migration from/to other Cooklang-compatible tools\n- **Full spec compatibility** — powered by [`@tmlmt/cooklang-parser`](https://cooklang-parser.tmlmt.com/v3), with support for many useful [extensions](https://cooklang-parser.tmlmt.com/v3/guide/extensions) such as references, recipe variants, alternative ingredients, etc.\n\n### 📖 Recipe management\n\n- **Browse recipes** — navigate your Cooklang recipe collection in a folder structure with grid or list view\n- **View recipes** — read recipes with ingredients, cookware, preparation steps, metadata (tags, author, source, time), and variant support\n- **Create, edit, move \u0026 delete recipes** — full CRUD with in-app Cooklang editor and syntax validation\n- **Recipe images** — upload cover and per-step images, displayed in a carousel; powered by Nuxt Image with on-the-fly optimization\n- **Servings scaling** — dynamically adjust ingredient quantities by changing the serving count\n- **Recipe search** — fuzzy command-palette search across titles, tags, author, and description (\u003ckbd\u003e⌘/CTRL\u003c/kbd\u003e\u003ckbd\u003eK\u003c/kbd\u003e)\n- **Download `.cook` files** — export any recipe as a Cooklang file\n- **Cook mode** — full-screen step-by-step walkthrough with swipe navigation, progress bar, per-step ingredients/cookware, and built-in countdown timers with browser notifications\n\n### 🔗 Sharing \u0026 privacy\n\n- **Per-recipe visibility** — mark individual recipes as public or private (configurable default)\n- **Share links** — generate time-limited tokens that let anyone view a recipe without logging in\n- **Public browsing** — optionally allow unauthenticated visitors to browse all public recipes\n- **Atom feed** — expose public recipes via an Atom/XML feed for RSS readers and [federation](https://recipes.cooklang.org/about) (opt-in)\n\n### ⚙️ General\n\n- **🏠 Self-hosted** — runs on your own server with a single Node.js process and SQLite database\n- **🔒 Role-based authentication** — two roles (editor and viewer) with password auth (scrypt-hashed) and/or OIDC single sign-on\n- **🌗 Dark / light mode** — toggle between color themes\n- **📱 Responsive design** — optimized for both desktop and mobile\n- **Custom app title** — configurable application name shown in the header and SEO tags\n- **🛡️ Security hardening** — built-in HTTP security headers (CSP with nonce, HSTS, X-Frame-Options), request size limiting, rate limiting, and SRI via [nuxt-security](https://nuxt-security.vercel.app/)\n\n### 🛒 Shopping list\n\n\u003e Opt-in: requires `shopping.enabled: true` (or `\"editor-only\"`) in `config.yaml`.\n\n- **User-specific list** — add recipes from the browse view with per-recipe serving adjustments; add or remove free-hand items not tied to any recipe\n- **Store Run mode** — fullscreen checklist with a progress bar to tick off ingredients while shopping\n\n### ⚠️ Experimental (not stable and not recommended for use)\n\n\u003e Requires `experimental: true` in `config.yaml`.\n\n- **🛒 Shopping cart** — match aggregated ingredients against a product catalog (TOML-based) and identify unmatched items\n\n## Getting started\n\n### Prerequisites\n\n- [Node.js](https://nodejs.org/) (v22 or later)\n\n### Installation\n\n1. Download the latest release tarball from the [releases page](https://github.com/tmlmt/cooklang-shopper/releases)\n2. Extract it to your desired installation directory:\n   ```bash\n   mkdir -p /path/to/cooklang-shopper\n   tar -xzf cooklang-shopper-v*.tar.gz -C /path/to/cooklang-shopper\n   ```\n3. Create your configuration file by copying the provided example:\n   ```bash\n   cd /path/to/cooklang-shopper/dist\n   cp config.yaml.example config.yaml\n   ```\n4. Edit `config.yaml` — set the different parameters (see the file for instructions). For **password** authentication, generate hashed passwords for the editor and viewer roles:\n   ```bash\n   node hash-password.mjs \u003ceditor-password\u003e\n   node hash-password.mjs \u003cviewer-password\u003e\n   ```\n   For **OIDC** authentication, configure the `oidc` block with your identity provider's client credentials, issuer URL, and role mapping. Roles are assigned based on an OIDC claim in the token — either via scopes granted by the IdP or via group membership. See `config.yaml.example` for detailed examples of both strategies. Multiple OIDC providers can be configured, and password + OIDC can be enabled simultaneously.\n5. Add your `.cook` recipe files to `dist/public/recipes/`\n6. Start the server once to initialize the database (created automatically at `dist/data/cooklang-shopper.db`)\n7. Set up the systemd service:\n\n   ```bash\n   # Edit the service file to adjust User, WorkingDirectory, and ExecStart paths\n   sudo cp /path/to/cooklang-shopper/dist/cooklang-shopper.service /etc/systemd/system/\n   sudo systemctl daemon-reload\n   sudo systemctl enable --now cooklang-shopper\n   ```\n\n   Alternatively, start the server manually:\n\n   ```bash\n   cd /path/to/cooklang-shopper/dist\n   node server/index.mjs\n   ```\n\n### Upgrade\n\nThe release tarball includes an `upgrade.sh` script at the root of the installation directory. It downloads the latest release, replaces the application files, and restores your recipes, product catalog, and `config.yaml` automatically.\n\n```bash\ncd /path/to/cooklang-shopper\n./upgrade.sh\n```\n\nOptions:\n\n- `--edge` — include pre-releases when finding the latest version\n- `--tag \u003ctag\u003e` — download a specific version (e.g. `--tag v1.0.0`)\n\nThe previous version is kept in `dist.bak/` for easy rollback:\n\n```bash\nrm -rf dist \u0026\u0026 mv dist.bak dist\n```\n\nRollback preserves all user data including the database. If a newer version added schema changes, the older version safely ignores them.\n\n\u003e **Note:** Stop the server before upgrading and restart it afterward.\n\u003e\n\u003e ```bash\n\u003e sudo systemctl stop cooklang-shopper\n\u003e ./upgrade.sh\n\u003e sudo systemctl start cooklang-shopper\n\u003e ```\n\n## Roadmap\n\n1. ~~Multi-role (admin, editor, viewer) authorization incl. support for OIDC~~ (done — editor/viewer roles with password \u0026 OIDC support)\n2. Internationalization (i18n)\n3. Finalize shopping list features\n4. Finalize shopping cart features\n5. Develop feature to send cart to a pre-configured online store\n6. Add customization possibilities\n\n## Screenshots\n\n![Screenshot 01](screenshot-01.png)\n\n![Screenshot 02](screenshot-02.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmlmt%2Fcooklang-shopper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftmlmt%2Fcooklang-shopper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftmlmt%2Fcooklang-shopper/lists"}