* Add ability to inject into Python files
* Update outdated references to gen_global_components.py
* Add code gen for registration locale validation
* sort validators
* update for pydantic 2
* run generator again
---------
Co-authored-by: Gasper Gril <gasper@gril.si>
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
* New translations en-us.json (French)
* New translations en-us.json (Italian)
* New translations en-us.json (Slovenian)
* New translations en-us.json (Turkish)
* New translations en-us.json (Ukrainian)
* fix(deps): update dependency apprise to v1.7.3
* Pin paho-mqtt to match what Apprise has done.
---------
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Brendan <b.oconnell14@gmail.com>
* New translations en-us.json (Swedish)
* New translations en-us.json (French)
* New translations en-us.json (Bulgarian)
* New translations en-us.json (Danish)
* New translations en-us.json (Bulgarian)
* feat: sort by labels in shopping list copy if labels toggled
* fix: call parent validator in shopping list item out (#3227)
* fix: add a unit test for (#3227)
* fixed messy post_validate logic
* feat: label headings in shopping list copy
* feat: blank line for each group in shopping list copy
---------
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
* modify new item factory to default to zero qty and use last isFood value
* automatically set the label of an item when choosing a food
* fix when switching to a food with no label
* removed trivial type annotation
* more lint
* removed debug log
* Allow overriding of alembic config file path using environment variable
Signed-off-by: Litchi Pi <litchi.pi@proton.me>
* Allow overriding of MODEL_PATH using environment variable
Signed-off-by: Litchi Pi <litchi.pi@proton.me>
---------
Signed-off-by: Litchi Pi <litchi.pi@proton.me>
* add default group slug to app info if public
* redirect public user to default group
* added tests
---------
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
* try to match units when brute parsing and no amount is matched
* brute parser: better handle multiple word food items
Also checks the case when a food might have been split in a unit + ingredient
* fix formatting
* add test cases for ingredient parsing that don't start with an amount
* parametrized tests and added ingredient data fixture
* fixed group_id ref in tests
* fixed test inputs
* add extra tests for units as third token
---------
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
* add docker-compose with development dependencies
* delete old runtime.txt file
* specify specific group for postgres deps
* replace makefile with taskfile with new features
* drop template.env file in favor of defaults within taskfile
* use with github actions
* update docs for taskfile changes
* update task.json for vscode
* add taskfile to devcontainer.json
* pre-install taskfile so startup command works
* remove run command and fix desc for ui
* change node-> python->py for consistency
* add language direction to locale generation
* apply language direction when setting language
---------
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
* added more test data
* added missing pytest id
* add fk validation to backup restore
* removed bad type imports
* actually apply the invalid fk filter and clean up types
* fix key name
* added log when removing bad rows
* removed unused import
* bumped info to warning
* New translations en-us.json (Italian)
* New translations en-us.json (English, United Kingdom)
* New translations en-us.json (Icelandic)
* New translations en-us.json (Icelandic)
* New translations en-us.json (Icelandic)
* New translations en-us.json (Icelandic)
* New translations en-us.json (Icelandic)
* Add "next step" button to ingredient linker dialog
clicking button will save current step ingredient links and show the next step in the dialog
* unload ingredient linker dialog to reset scroll position
* cleanup forward button in linking ingredients dialog
* add vertical spacing between buttons on smaller screens - recipe linker dialog
* align buttons equally to match alignment of `cancel`
---------
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
* refactor normalized search migration to use dummy default
* changed group slug migration to use raw SQL
* updated comment
* added tests with anonymized backups (currently failing)
* typo
* fixed LDAP enum in test data
* fix for adding label settings across groups
* add migration data fixes
* fix shopping list label settings test
* re-run db init instead of just running alembic migration, to include fixes
* intentionally broke SQLAlchemy GUID handling
* safely convert between GUID types in different databases
* restore original test data after testing backup restores
* added missing group name update to migration
* added more info regarding public recipes
* fix broken info tag
* added more information to the 0.5.x migration
* added email banner to frontend codebase
* fix for AppButtonCopy
* add some logging
* fix if statement
* refactor, use .then
* check for copied
* Fix recipe share link
* refactor AppButtonCopy
* update tooltip text
* update use-copy
* logging
* fix is supported check
* more fixes for use-copy.ts
---------
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
* Correct grammar and typo
* Correct grammar
* Fix some words
* Correct formatting
* Correct grammar on v1 migration page
* Correct grammar, punctuation, and typos in faq
* Fix grammar in installation-checklist
* One last correction
* made migration more fault tolerant
* added edgecase for recipes with no ings/instructions
* keep log for debugging
---------
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
* prevent creating groups with no name
* add db fix fro groups with no name
* moved non-actionable fix logs to debug level
* 🧹
* use id as default name to avoid collisions
* simplified group name constraint
* removed redundant import
* Resolves GitHub Actions usage of deprecated command for setting output
* Updates action versions to the latest released versions
---------
Co-authored-by: Trenton Holmes <trenton.holmes@psware.com>
* add additional case for scraped image parsing
* made scraper more fault tolerant for missing images
* re-ordered case to favor better implementations
---------
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
* allow expections when fetching content
* removed extra bracket on import text
* added more fault tolerance and limited concurrency
* fix entries not being saved to report
* disable clicking into in-proress import
* conditionally render expansion
* set expire_on_commit false to avoid refresh
* converted deletes to raw SQL statements
* call update statements directly in sql
* parameterized text queries
* replace orm with raw sql to avoid db differences
* add document title to server spa meta
* removed conflicting useMeta
* replaced head with useMeta
* formalized metadata injection
* small injection refactor
* added tests
* added missing global tag
* fixed setting tab title for logged-in users
* simplified metadata update
* remove duplicate tag and fix for foreign users
* add metadata for shared recipes
* added default recipe image
* fixed shared URL
---------
Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com>
* fixed food/unit not updating to plural when scaled
* added test
* fixed weird edgecase that appears only after edits
---------
Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com>
* 'hide' default email and password env variables
* first login API endpoint
* run code-generators
* frontend indicators for default username and pw
* remove old env variables from docs
* fix env set variable
* remove password from tests
* added plural names and alias tables to foods/units
* updated models to include plural names and aliases
* updated parser to include plural and aliases
* fixed migrations
* fixed recursive models
* added plural abbreviation to migration
* updated parser and display prop
* update displays to use plurals
* fix display edgecase and remove print
* added/updated display tests
* fixed model bug and added parser tests
* added tests for aliases
* added new plural options to data management page
* removed unique constraint
* made base dialog more customizable
* added alias management to food and unit data pages
* removed unused awaits
* 🧹
* add groupSlug to most routes
* fixed more routing issues
* fixed jank and incorrect routes
* remove public explore links
* remove unused groupSlug and explore routes
* nuked explore pages
* fixed public toolstore bug
* fixed various routes missing group slug
* restored public app header menu
* fix janky login redirect
* 404 recipe API call returns to login
* removed unused explore layout
* force redirect when using the wrong group slug
* fixed dead admin links
* removed unused middleware from earlier attempt
* 🧹
* improve cookbooks sidebar
fixed sidebar link not working
fixed sidebar link target
hide cookbooks header when there are none
* added group slug to user
* fix $auth typehints
* vastly simplified groupSlug logic
* allow logged-in users to view other groups
* fixed some edgecases that bypassed isOwnGroup
* fixed static home ref
* 🧹
* fixed redirect logic
* lint warning
* removed group slug from group and user pages
refactored all components to use route groupSlug or user group slug
moved some group pages to recipe pages
* fixed some bad types
* 🧹
* moved groupSlug routes under /g/groupSlug
* move /recipe/ to /r/
* fix backend url generation and metadata injection
* moved shopping lists to root/other route fixes
* changed shared from /recipes/ to /r/
* fixed 404 redirect not awaiting
* removed unused import
* fix doc links
* fix public recipe setting not affecting public API
* fixed backend tests
* fix nuxt-generate command
---------
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
* New translations en-us.json (English, United Kingdom)
* New translations en-us.json (Catalan)
* New translations en-us.json (Hungarian)
* New translations en-us.json (Catalan)
* remove stale deployment docs
* remove from nav
* update tags
* update info on tags
* add note about dockerhub
* update features + formatting
* update PR template
* new maintainer docs
* change upgrade guide tag
* re-generate api docs
* fix user creation when signups are supposed to be diabled
* add user registration tests
* run formatter
* fix test filename
---------
Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com>
* fix new position calculataion
* ensure consistent list item ordering
* fix recipe ref overflow on small screens
* added recipe ref elevation
* tweaked line height (for long notes)
* removed unused user dependency
* remove old shopping list items when there's >100
* 🤷
* cleaned up function generator
* fixed test
* fix potential type error
* made max position calc more efficient
* fix(security): reset login attempts after successful login
Enforce a maximum number of consecutive failed logins. Successfully logging in should reset the
count.
#2569
* fix(security): fix when user is unlocked
The user should be unlocked when locked_at is set, but the lock has expired.
#2569
`email.com` is not a reserved domain, incorrect configuration could result in unintentional effects.
`example.com` is reserved by IANA for bogus purposes, see RFC 6761.
* added normalization to foods and units
* changed search to reference new normalized fields
* fix tests
* added parsed food matching to backend
* prevent pagination from ordering when searching
* added extra fuzzy matching to sqlite ing matching
* added tests
* only apply search ordering when order_by is null
* enabled post-search fuzzy matching for postgres
* fixed postgres fuzzy search test
* idk why this is failing
* 🤦
* simplified frontend ing matching
and restored automatic unit creation
* tightened food fuzzy threshold
* change to rapidfuzz
* sped up fuzzy matching with process
* fixed units not matching by abbreviation
* fast return for exact matches
* replace db searching with pure fuzz
* added fuzzy normalization
* tightened unit fuzzy matching thresh
* cleaned up comments/var names
* ran matching logic through the dryer
* oops
* simplified order by application logic
* WIP: proof of concept
* basic meta tag injection
* add support for scraping public/private links
* make tests go brrrrr
* cleanup initialization
* rewrite build config
* remove recipe meta on frontend
* make type checker happy
* remove other deployment methods
* fix issue with JSON response on un-authenticated request
* docs updates
* update tivy scanner
* fix linter stuff
* change registry tag
* build fixes
* fix same mistake I always make
* fixed incorrect var ref
* added public recipe pagination route
* refactored frontend public/explore API
* fixed broken public cards
* hid context menu from cards when public
* fixed public app header
* fixed random recipe
* added public food, category, tag, and tool routes
* not sure why I thought that would work
* added public organizer/foods stores
* disabled clicking on tags/categories
* added public link to profile page
* linting
* force a 404 if the group slug is missing or invalid
* oops
* refactored to fit sidebar into explore
* fixed invalid logic for app header
* removed most sidebar options from public
* added backend routes for public cookbooks
* added explore cookbook pages/apis
* codegen
* added backend tests
* lint
* fixes v-for keys
* I do not understand but sure why not
---------
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
* updated base button group
* added kitchen timer
* added missing icon
* usability tweaks
* for for menu rendering over app bar
* clean up types
* fix for mp3 loading, maybe?
* spooky linter fixes
* for real this time
---------
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
* feat: improve readability of notes in ingredients list
Makes the notes in the ingredients list more readable by making them slightly opaque. This creates a better visual separation between the notes and the rest of the ingredient.
* Use server display if available
* Move note to newline and make quantity more distinct
* Use safeMarkdown for shopping list
* Use component
* Wrap unit in accent color
* Update RecipeIngredientListItem to set food in bold
* improved UI responsiveness and added image preview
* added global image cropper component
* added image cropper to last made dialog
* style tweaks
* added more specific text for creating event
* mopped up some slop
* renamed height and width vars
---------
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
* added support for group slugs
* modified frontend to use links with group slug
* fixed test refs
* unused import
---------
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
* refactored recipe image paths/service
* added routes for updating/fetching timeline images
* make generate
* added event image upload and rendering
* switched update to patch to preserve timestamp
* added tests
* tweaked order of requests
* always reload events when opening the timeline
* re-arranged elements to make them look nicer
* delete files when timeline event is deleted
* fixed paprika url key
* fixed paprika total and prep time aliases
* added nextcloud time parsing
* mapped paprika categories to tags
* cleaned up netcloud parsetime
* validate user attributes on user creation
add logs for invalid or missing attributes
* only update admin flag when admin status changes
* move ldap functions into separate file
* fix linter issues
* actually use the search_user function
* fix types
* update dev docker poetry install
* Forward/Report IP through front and backend.
* Add fail2ban docs
* fix option name and iproute2 in omni entry
* Fix entry scripts -> gunicorn setting respected
* gunicorn off
* xfwd in nuxt proxy and handle multiple IPs
* New translations en-US.json (Norwegian)
* New translations en-US.json (Portuguese)
* New translations en-US.json (Portuguese)
* New translations en-US.json (Portuguese)
* New translations en-US.json (Polish)
* New translations en-US.json (Portuguese)
* New translations en-US.json (Polish)
* New translations en-US.json (Polish)
* New translations en-US.json (Portuguese)
* New translations en-US.json (Portuguese)
* New translations en-US.json (Portuguese)
* New translations en-US.json (Portuguese)
* New translations en-US.json (Portuguese)
* New translations en-US.json (Portuguese)
* New translations en-US.json (French)
* Add hook for random sorting
* Add random sorting to front page
* Add multiple tests for random sorting.
* Be extra sure that all recipes are returned.
* Too stable random. seed doesn't reach backend.
* add timestamp to useRecipeSearch
* Update randomization tests for timestamp seeding
* ruff cleanup
* pass timestamp separately in getAll
* remove debugging log items
* remove timestamp from address bar
* remove defaults from backend timestamps
* timestamp should be optional
* fix edge case: query without timestamp
* similar edge case: no timestamp in pagination
* ruff :/
* better edge case handling
* stabilize random search test w/more recipes
* better pagination seeding
* update pagination seed test
* remove redundant random/seed check
* Test for api routes to random sorting.
* please the typing gods
* hack to make query parameters throw correct exc
* ruff
* fix validator message typo
* black reformatting
---------
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
* Creating postgres migration script and starting to set up to detect database
* non-working placeholders for postgres pg_tgrm
* First draft of some indexes
* non-working commit of postgres indexing
* Further non-working edits to db-centric fuzzy search
* update alembic for extensions
* More non-working setup
* Move db type check to init_db
* fix typo in db name check
* Add sqlite token search and postgres full text search
* reorder search to hit exact matches faster
* Add settings and docs for POSTGRES_LANGUAGE (full text search)
* Use user-specified POSTGRES_LANGUAGE in search
* fix fuzzy search typo
* Remove full text search and instead order by trigram match
* cleaner adding of indices, remove fulltext
* Cleanup old import of getting app settings
* Fix typo in index
* Fix some alembic fuzzy typos
* Remove diagnostic printing from alembic migration
* Fix mixed up commutator for trigram operator and relax criteria
* forgot to remove query debug
* sort only on name
* token and fuzzy search tests
* Refactor recipe search test to avoid rare random string cross-matches.
* Add ability to quote parts of search for exact match
* Remove internal punctuation, unless it's quoted for literal search
* Add tests for special character removal and literal search
* Remove the outer double quotes from searches, but leave internal single quotes alone.
* Update tests to avoid intra-test name collisions
* Fixing leftovers highlighted by lint
* cleanup linting and mypy errors
* Fix test cross-matching on dirty db (leftovers from bulk import)
* forgot to cleanup something when debugging mypy errors
* re-order pg_trgm loading in postgres
* address comments
* Dev docs: tests, postgres/psycog2
* Update pull request process.
* Add Food/Unit parsing instructions to the FAQ
* Update docker composes: mealie-data now local to docker-compose rather than hidden in docker volume dir! postgres points to 1.0.0b5
* sqlite docker-compose: mealie-data now local rather than hidden in docker volumes
* Merge Intro FAQ into main FAQ
* Progress on docs
* Add Advanced and v1b5 to docs index
* v1b5 changelog consistency with other changelogs
* Features: fix wrong link, name buttons for clarity
* Migration: link to github releases
* Updating: link to migration page, format docker cmds
* FAQ: update smart ingredient formatting
* Intro: fix typos
* API: update for newbie clarity
* Roadmap: update feature request & progress mechanism
* iOS shortcut: fix broken image links
* installation: add SMTP google app passwords
* Postgres: add header note on why.
* Update Groups doc per Discord discussion
* mealie-data back into docker default volume path
* added support for SQL keywords IS, IN, LIKE, NOT
deprecated datetime workaround for "<> null"
updated frontend reference for "<> null" to "IS NOT NULL"
* tests
* refactored query filtering to leverage orm
* added CONTAINS ALL keyword
* tests
* fixed bug where "and" or "or" was in an attr name
* more tests
* linter fixes
* TIL this works
* extended query filter to accept nested tables
* decoupled timeline api from recipe slug
* modified frontend to use simplified events api
* fixed nested loop index ghosting
* updated existing tests
* gave mypy a snack
* added tests for nested queries
* fixed "last made" render error
* decoupled recipe timeline from dialog
* removed unused props
* tweaked recipe get_all to accept ids
* created group global timeline
added new timeline page to sidebar
reformatted the recipe timeline
added vertical option to recipe card mobile
* extracted timeline item into its own component
* fixed apploader centering
* added paginated scrolling to recipe timeline
* added sort direction config
fixed infinite scroll on dialog
fixed hasMore var not resetting during instantiation
* added sort direction to user preferences
* updated API docs with new query filter feature
* better error tracing
* fix for recipe not found response
* simplified recipe crud route for slug/id
added test for fetching by slug/id
* made query filter UUID validation clearer
* moved timeline menu option below shopping lists
---------
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
* New translations en-US.json (French)
* New translations en-US.json (Slovak)
* New translations en-US.json (Swedish)
* New translations en-US.json (Norwegian)
* New translations en-US.json (Norwegian)
* New translations en-US.json (German)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Ukrainian)
* New translations en-US.json (Ukrainian)
* New translations en-US.json (Ukrainian)
* New translations en-US.json (Ukrainian)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Catalan)
* New translations en-US.json (Catalan)
* New translations en-US.json (Spanish)
* New translations en-US.json (Catalan)
* New translations en-US.json (Spanish)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Romanian)
* New translations en-US.json (Romanian)
* New translations en-US.json (Romanian)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Polish)
* New translations en-US.json (Polish)
* New translations en-US.json (Polish)
* New translations en-US.json (Ukrainian)
* New translations en-US.json (Ukrainian)
* New translations en-US.json (Ukrainian)
* New translations en-US.json (Ukrainian)
* New translations en-US.json (German)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (German)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (German)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* New translations en-US.json (Hebrew)
* Remove some implicit lazy-loads from user serialization
* implement full backup restore across different database versions
* rework all custom getter dicts to not leak lazy loads
* remove some occurances of lazy-loading
* remove a lot of lazy loading from recipes
* add more eager loading
remove loading options from repository
remove raiseload for checking
* fix failing test
* do not apply loader options for paging counts
* try using selectinload a bit more instead of joinedload
* linter fixes
* expanded safe html tags and attrs
* removed style attr
* add note on sources of safe elements
---------
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
* implemented copymethat migration
* added migration tree
* added translation support
* genericized example jpgs
* added test data
* fixed test archive
* switched recipe create to service
added test for timeline event creation
* linting
* lxml go brrr
* add option to enable starttls for ldap
* add integration test for ldap service
* document new, optional environment variable
* fix: support anonymous bind
* id and mail attributes in LDAP_USER_FILTER should be implied
* remove print statement
* remove unused TS Ignores
* refactor planner into multiple pages
also includes some minor UI adjustments and some feature work to improve the date selector
* use mobile cards for meal-planner
* remove component
* New translations en-US.json (Danish)
* New translations en-US.json (German)
* New translations en-US.json (German)
* New translations en-US.json (Dutch)
* New translations en-US.json (Polish)
* New translations en-US.json (Turkish)
* New translations en-US.json (Dutch)
* New translations en-US.json (Polish)
* New translations en-US.json (Turkish)
* fixes cookbook ordering in frontend
* Revert "fixes cookbook ordering in frontend"
This reverts commit 1b5b172911.
* Fix cookbook ordering the proper way
* fix webhooks not firing due to missing session
* disable webhook test button because it doesnt do anything
* fix background task administration not working at all
* fix error in test
* added color back to labels
* improved mobile view
refactored layout to use grid
allowed text wrapping on item labels
removed label overflow
added completion date on checked items
* sort checked items by last updated
* made checking an item off more responsive
* optimized moving checked items
removed unnecessary updateAll call
removed jitter when shopping list refreshes
* adds authentication method for users
* fix db migration with postgres
* tests for auth method
* update migration ids
* hide auth method on user creation form
* (docs): Added documentation for the new authentication method
* update migration
* add to auto-form instead of having hidden fields
* fixed mealplan timeline event task
fixed indentation to only look at one group at a time
changed grumpy update to happy patch
* updated pytest to catch this error
* I don't know how this got past the pre-commit
* allow certain props to be updated on locked recipe
* pytest
* added "last_made" to hardcoded datetime fields
* refactored last made to its own route
* codegen/types
* updated pytest
* added backend for shopping list label config
* updated codegen
* refactored shopping list ops to service
removed unique contraint
removed label settings from main route/schema
added new route for label settings
* codegen
* made sure label settings output in position order
* implemented submenu for label order drag and drop
* removed redundant label and tweaked formatting
* added view by label to user preferences
* made items draggable within each label section
* moved reorder labels to its own button
* made dialog scrollable
* fixed broken model
* refactored labels to use a service
moved shopping list label logic to service
modified label seeder to use service
* added tests
* fix for first label missing the tag icon
* fixed wrong mapped type
* added statement to create existing relationships
* fix restore test, maybe
* New translations en-US.json (Ukrainian)
* New translations en-US.json (Ukrainian)
* New translations en-US.json (German)
* New translations en-US.json (Dutch)
* New translations en-US.json (Dutch)
* New translations en-US.json (Finnish)
* New translations en-US.json (Hungarian)
* New translations en-US.json (German)
* New translations en-US.json (Hungarian)
* New translations en-US.json (Dutch)
* feat: server side search API (#2112)
* refactor repository_recipes filter building
* add food filter to recipe repository page_all
* fix query type annotations
* working search
* add tests and make sure title matches are ordered correctly
* remove instruction matching again
* fix formatting and small issues
* fix another linting error
* make search test no rely on actual words
* fix failing postgres compiled query
* revise incorrectly ordered migration
* automatically extract latest migration version
* test migration orderes
* run type generators
* new search function
* wip: new search page
* sortable field options
* fix virtual scroll issue
* fix search casing bug
* finalize search filters/sorts
* remove old composable
* fix type errors
---------
Co-authored-by: Sören <fleshgolem@gmx.net>
* Update docker-compose.yml
ERROR: The Compose file './docker-compose.yml' is invalid because:
services.mealie.environment.WEB_GUNICORN contains true, which is an invalid type, it should be a string, number, or a null
* Update docker-compose.yml
Also fix SMTP settings, since they aren't in array format as in mealie-frontend.
* Once more, ironing out a few minor issues.
Server status reported this, I think this is the correct value, but I'm happy to revert and/or update the value as needed.
* Revert previous two commits
Per https://github.com/hay-kot/mealie/pull/2109#pullrequestreview-1294610637
* Stray newline
Missed a stray newline that was inadvertently added.
* add indices to all foreign keys and some fields that are used for ordering and filtering
* add missing migrations
* update migration orders
---------
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
* Corrected if statement to check if a results was returned by the LDAP search. And decoded the user_attributes from binary data to string
* removed trailing spaces
* Revert asserts in LDAP unit test back
Since an empty tuple is still a result, an user is created and the result should not be false.
* Simplified code
* Extended the LDAP implementation
* fix ldap authentication and user creation
* modified docs to include new LDAP environment variables
* update tests and linting
* add libldap-2.4-2 as runtime dependency for the api
---------
Co-authored-by: Erik Landkroon <eriklandkroon@gmail.com>
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (German)
* New translations en-US.json (German)
* New translations en-US.json (Danish)
* New translations en-US.json (German)
* New translations en-US.json (Dutch)
* added related user to mealplans
* made timeline event message actually optional
* added task to create events for mealplan recipes
* replaced fk constraint ops with bulk ops
* fixed event creation and adjusted query range
* indentation is hard
* added missing recipe id query filter
* added tests
* upgrade sqlalchemy to 2.0
* rewrite all db models to sqla 2.0 mapping api
* fix some importing and typing weirdness
* fix types of a lot of nullable columns
* remove get_ref methods
* fix issues found by tests
* rewrite all queries in repository_recipe to 2.0 style
* rewrite all repository queries to 2.0 api
* rewrite all remaining queries to 2.0 api
* remove now-unneeded __allow_unmapped__ flag
* remove and fix some unneeded cases of "# type: ignore"
* fix formatting
* bump black version
* run black
* can this please be the last one. okay. just. okay.
* fix repository errors
* remove return
* drop open API validator
---------
Co-authored-by: Sören Busch <fleshgolem@gmx.net>
* Scheduled tasks log to Debug, not Info
* Add LOG_LEVEL config to .env
* Update some other log levels and fix typos
* fix logger initializer
---------
Co-authored-by: Jakob Rubin <647846+Grygon@users.noreply.github.com>
* feat(lang): localize some views
* feat(lang): an attempt at localizing vuetify (WIP)
* feat(lang): localized some more screens
* feat(lang): localized some more screens again
* feat(lang): hack to localize vuetify
* feat(lang): localize data management pages
* fix linting errors
---------
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
* Upload recipe step images from mobile devices
This adds a button in the recipe step dropdown, as not all mobile
devices can drag and drop a file into the web page
See #885
* Add progress bar
* New translations en-US.json (Spanish)
* New translations en-US.json (Spanish)
* New translations en-US.json (Czech)
* New translations en-US.json (Czech)
* New translations en-US.json (Czech)
* New translations en-US.json (Czech)
* New translations en-US.json (Czech)
* Move recipe validations from RecipeSummary to Recipe
* fix RepositoryRecipes loading recipes with ingredients even when load_food is False
* Add eager loading of ingredient units
* fix trying to instantiate PaginationBase with concrete type not being valid for mypy
* fix linting issue
* tidied up shopping list item models
redefined recipe refs and updated models
added calculated display attribute to unify shopping list item rendering
added validation to use a food's label if an item's label is null
* fixed schema reference
* refactored shopping list item service
route all operations through one central method to account for edgecases
return item collections for all operations to account for merging
consolidate recipe items before sending them to the shopping list
* made fractions prettier
* replaced redundant display text util
* fixed edgecase for zero quantity items on a recipe
* fix for pre-merging recipe ingredients
* fixed edgecase for merging create_items together
* fixed bug with merged updated items creating dupes
* added test for self-removing recipe ref
* update items are now merged w/ existing items
* refactored service to make it easier to read
* added a lot of tests
* made it so checked items are never merged
* fixed bug with dragging + re-ordering
* fix for postgres cascade issue
* added prevalidator to recipe ref to avoid db error
* add httpx depedency for async http requests
* rework scraper strategies to download recipe html asynchronously
* rework recipe_data_service to download recipe images asynchronously
* fix recipe_parser test, so it can use async results
* fix bulk import so that it also works with async scraper
* fix broken recipe_parser tests
* Fix issues found by scanners
* Add additional checks for ingredient and instruction count in test_create_by_url
* Revert changes in test recipe_data
Since we are checking ingredients and instructions in test_create_url now, these would fail with the stored html of recipe data
* Add explicit type annotation in recipe_data_service.largest_content_len
* Fix typo in annotation
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (Slovak)
* New translations en-US.json (French)
* New translations en-US.json (French)
* New translations en-US.json (Finnish)
* New translations en-US.json (French)
* New translations en-US.json (French)
* New translations en-US.json (Portuguese)
* New translations en-US.json (French)
* New translations en-US.json (French)
* New translations en-US.json (Finnish)
* New translations en-US.json (Finnish)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Finnish)
* New translations en-US.json (Bulgarian)
* New translations en-US.json (Finnish)
* New translations en-US.json (Czech)
* New translations en-US.json (Czech)
* New translations en-US.json (Czech)
* New translations en-US.json (Czech)
* New translations en-US.json (Czech)
* New translations en-US.json (Italian)
* New translations en-US.json (Italian)
* New translations en-US.json (Finnish)
* New translations en-US.json (Finnish)
* New translations en-US.json (Italian)
* New translations en-US.json (Italian)
* New translations en-US.json (Finnish)
* New translations en-US.json (Italian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Hungarian)
* New translations en-US.json (Hungarian)
* New translations en-US.json (Hungarian)
* New translations en-US.json (Hungarian)
* Fix issue where recipes could not have all their ingredients/instructions removed
* Add test for removing all instructions and ingredients from a recipe
* prevent list refresh while re-ordering items
* update position of new items to stay at the bottom
* prevent refresh while loading
* copy item while editing so it isn't refreshed
* added loading count to handle overlapping actions
* fixed recipe reference throttling
* prevent merging checked and unchecked items
* Fix example postgres docker-compose setup in docs
Add a local volume to postgres container so changes get persisted between restarts
* Fix linked volume in postgres doc
* New translations en-US.json (Dutch)
* New translations en-US.json (Dutch)
* New translations en-US.json (Dutch)
* New translations en-US.json (Bulgarian)
* New translations en-US.json (Bulgarian)
* New translations en-US.json (Bulgarian)
* New translations en-US.json (Bulgarian)
* New translations en-US.json (Polish)
* New translations en-US.json (Bulgarian)
* New translations en-US.json (German)
* New translations en-US.json (Bulgarian)
* New translations en-US.json (Bulgarian)
* New translations en-US.json (Bulgarian)
* propogate scale changes to print view
* fixed incorrect variable reference
* refactored shopping list recipe routes
cleaned up existing logic
added support for recipe scaling
* updated current revision
* adding to shopping list respects UI recipe scale
* added field annotations
* added tests for recipe scaling
* made column nullable and set to 1 during migration
* New translations en-US.json (Danish)
* New translations en-US.json (Danish)
* New translations en-US.json (Dutch)
* New translations en-US.json (Turkish)
* New translations en-US.json (German)
* New translations en-US.json (Italian)
* New translations en-US.json (German)
* New translations en-US.json (Ukrainian)
* Filtering special characters during automatic linking of ingredients to instructions
Used a unicode group to have a set of all unicode punctuation marks
* allowing for linking of ingredients to instruction at the beginning of a newline in the instruction
* Extracted ingredient matching into a composable and added tests. Ignoring 2 letter words to avoid false matches.
While testing the code 2 letter matches were a large source of false positives.
* New translations en-US.json (Polish)
* New translations en-US.json (Polish)
* New translations en-US.json (Polish)
* New translations en-US.json (Dutch)
* New translations en-US.json (Dutch)
* New translations en-US.json (French)
* New translations en-US.json (Turkish)
* added new icons
* added timeline badge and dialog to action menu
* more icons
* implemented timeline dialog using temporary API
* added route for fetching all timeline events
* formalized API call and added mobile-friendly view
* cleaned tags
* improved last made UI for mobile
* added event context menu with placeholder methods
* adjusted default made this date
set time to 1 minute before midnight
adjusted display to properly interpret UTC
* fixed local date display
* implemented update/delete routes
* fixed formating for long subjects
* added api error handling
* made everything localizable
* fixed weird formatting
* removed unnecessary async
* combined mobile/desktop views w/ conditional attrs
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (German)
* changed default sort direction for certain attrs
* added workaround for filtering out null datetimes
* filtered out null-valued results for certain sorts
* removed unecessary parse
* used minyear instead of 1900
* add trivy image scanning
* implement as partial workflow
* support both the frontend and backend Dockerfiles for scanning
* fix docker build context location
* New translations en-US.json (German)
* New translations en-US.json (Dutch)
* New translations en-US.json (Dutch)
* New translations en-US.json (German)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Ukrainian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* New translations en-US.json (Lithuanian)
* added chef hat
* removed unnecessary log
* modified recipe and recipe timeline event schema
changed timeline event "message" -> "event_message"
added "last made" timestamp to recipe
* added "I made this" dialog to recipe action menu
* added missing field and re-ran code-gen
* moved dialog out of context menu and refactored
removed references in action menu and context menu
refactored dialog to be triggered by a button instead
added route to update recipe last made timestamp
added visual for last made timestamp to recipe header and title
* added sorting by last made
* switched event type to comment
* replaced alter column with pydantic alias
* added tests for event message alias
* New translations en-US.json (Czech)
* New translations en-US.json (Czech)
* New translations en-US.json (Czech)
* New translations en-US.json (Czech)
* updated the sidebar; on mobile devices, the sidebar will be closed by default
* updated the AppSideBar
* change variable name
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
* added polling for changes every 5 seconds
* fixed demi import
* stop polling if the refresh fails too many times
* only poll for changes when the user is active
* New translations en-US.json (Norwegian)
* New translations en-US.json (Norwegian)
* New translations en-US.json (Norwegian)
* New translations en-US.json (Dutch)
* added recipe_timeline_events table to db
* added schema and routes for recipe timeline events
* added missing mixin and fixed update schema
* added tests
* adjusted migration revision tree
* updated alembic revision test
* added initial timeline event for new recipes
* added additional tests
* added event bus support
* renamed event_dt to timestamp
* add timeline_events to ignore list
* run code-gen
* use new test routes implementation
* use doc string syntax
* moved event type enum from db to schema
Co-authored-by: Hayden <64056131+hay-kot@users.noreply.github.com>
* New translations en-US.json (Dutch)
* New translations en-US.json (Dutch)
* New translations en-US.json (Dutch)
* New translations en-US.json (German)
* New translations en-US.json (Polish)
Please confirm and check all the following prior to submission. If you do not do this, your
issue may be closed.
options:
- label:I used the GitHub search to find a similar requests and didn't find it.
required:true
- label:Checked the [tasks tagged](https://github.com/mealie-recipes/mealie/issues?q=is%3Aissue+is%3Aopen+label%3Atask+) issues and verified my feature is not covered
required:true
- type:textarea
id:problem
attributes:
label:Please provide a concise description of the problem that would be addressed by this feature.
validations:
required:true
- type:textarea
id:solution
attributes:
label:Please provide a concise description of the feature that would resolve your issue.
validations:
required:true
- type:textarea
id:considerations
attributes:
label:Please consider and list out some caveats or tradeoffs made in your design decision
validations:
required:true
- type:checkboxes
id:additional-information
attributes:
label:Additional Information
options:
- label:If this is accepted I'm willing to submit a PR to provide this feature
- label:If this is accepted I'm willing to help maintain this feature
- label:I'm willing to sponsor/pay a developer to do this work
description:"submit a bug report for the current release"
name:Bug Report
description:"Submit a bug for the latest version of Mealie"
title:"[BUG] - YOUR DESCRIPTIVE TITLE GOES HERE"
labels:["bug","triage"]
body:
- type:checkboxes
id:checks
attributes:
label:First Check
description:Please confirm and check all the following options.
description:|
Please confirm and check all the following prior to submission. If you do not do this, your
issue may be closed.
options:
- label:This is not a feature request
- label:This is not a feature request.
required:true
- label:I added a very descriptive title to this issue.
- label:I added a very descriptive title to this issue (title field is above this).
required:true
- label:I used the GitHub search to find a similar issue and didn't find it.
required:true
@@ -18,8 +22,8 @@ body:
required:true
- label:I already read the docs and didn't find an answer.
required:true
- label:I have checked for existing issues that have been resolved in v1-beta
required:true
- label:This issue can be replicated on the demo site (https://demo.mealie.io/).
required:false
- type:textarea
id:description
attributes:
@@ -27,6 +31,25 @@ body:
placeholder:A clear and concise description of what the bug is.
validations:
required:true
- type:textarea
id:reproduction
attributes:
label:Steps to Reproduce
placeholder:1) ... 2) ... 3) ...
validations:
required:true
- type:textarea
id:logs
attributes:
label:Please provide relevant logs
placeholder:For example from `docker compose logs` or other system logs.
validations:
required:true
- type:textarea
id:version
attributes:
label:Mealie Version
placeholder:Docker image, as well as 'Build' tag from https://yourmealieurl/admin/site-settings, if UI is working
- type:dropdown
id:os
attributes:
@@ -38,17 +61,11 @@ body:
- Docker (Windows)
- Docker (Synology)
- Unraid
- Other
- TrueNAS
- Other (please specify below)
validations:
required:true
- type:textarea
id:os-details
id:other
attributes:
label:Deployment Details
description:You can add more details about your operating system here, in particular if you chose "Other". If you are experiencing issues with deployment, please provide your docker-compose or docker commands
description:Please confirm and check all the following options.
options:
- label:This is not a feature request
required:true
- label:I added a very descriptive title to this issue.
required:true
- label:I used the GitHub search to find a similar issue and didn't find it.
required:true
- label:I searched the Mealie documentation, with the integrated search.
required:true
- label:I already read the docs and didn't find an answer.
required:true
- type:textarea
id:description
attributes:
label:What is the issue you are experiencing?
placeholder:A clear and concise description of what the bug is.
validations:
required:true
- type:dropdown
id:os
attributes:
label:Deployment
description:What Deployment system are you using?
multiple:true
options:
- Docker (Linux)
- Docker (Windows)
- Docker (Synology)
- Unraid
- Other
validations:
required:true
- type:textarea
id:os-details
attributes:
label:Deployment Details
description:You can add more details about your operating system here, in particular if you chose "Other". If you are experiencing issues with deployment, please provide your docker-compose or docker commands
# Use only 'java-kotlin' to analyze code written in Java, Kotlin or both
# Use only 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name:Checkout repository
uses:actions/checkout@v3
# Initializes the CodeQL tools for scanning.
- name:Initialize CodeQL
uses:github/codeql-action/init@v2
with:
languages:${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift).
# If this step fails, then you should remove it and run the build manually (see below)
- name:Autobuild
uses:github/codeql-action/autobuild@v2
# ℹ️ Command-line programs to run using the OS shell.
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
# If the Autobuild fails above, remove it and uncomment the following three lines.
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
args:"🚀 Version {{ EVENT_PAYLOAD.release.tag_name }} of Mealie has been released. See the release notes https://github.com/hay-kot/mealie/releases/tag/{{ EVENT_PAYLOAD.release.tag_name }}"
args:"🚀 Version {{ EVENT_PAYLOAD.release.tag_name }} of Mealie has been released. See the release notes https://github.com/mealie-recipes/mealie/releases/tag/{{ EVENT_PAYLOAD.release.tag_name }}"
update-image-tags:
name:Update image tag in sample docker-compose files
needs:
- build-release
runs-on:ubuntu-latest
permissions:
contents:write
pull-requests:write
steps:
- name:Checkout 🛎
uses:actions/checkout@v4
- name:Modify version strings
run:|
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:${{ github.event.release.tag_name }}/' docs/docs/documentation/getting-started/installation/sqlite.md
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:${{ github.event.release.tag_name }}/' docs/docs/documentation/getting-started/installation/postgres.md
- name:Create Pull Request
uses:peter-evans/create-pull-request@v6
# This doesn't currently work for us because it creates the PR but the workflows don't run.
# TODO: Provide a personal access token as a parameter here, that solves that problem.
stale-issue-message:'This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.'
days-before-issue-stale:30
days-before-issue-close:5
stale-pr-label:'stale'
stale-pr-message:'This PR is stale because it has been open 45 days with no activity.'
days-before-pr-stale:45
# This stops a PR from ever getting closed automatically.
days-before-pr-close:-1
# If an issue/PR has a milestone, it's exempt from being marked as stale.
exempt-all-milestones:true
# How many API calls will we allow the action to make, essentially.
Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the url and Mealie will automatically import the relevant data or add a family recipe with the UI editor. Mealie also provides an API for interactions from 3rd party applications.
Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the URL and Mealie will automatically import the relevant data, or add a family recipe with the UI editor. Mealie also provides an API for interactions from 3rd party applications.
- [Remember to join the Discord](https://discord.gg/QuStdQGSGK)!
- [Documentation](https://nightly.mealie.io)
@@ -48,7 +47,7 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a
<!-- CONTRIBUTING -->
## Contributing
Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are **greatly appreciated**. If you're going to be working on the code-base, you'll want to use the nightly documentation to ensure you get the latest information.
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**. If you're going to be working on the code-base, you'll want to use the nightly documentation to ensure you get the latest information.
- See the [Contributors Guide](https://nightly.mealie.io/contributors/developers-guide/code-contributions/) for help getting started.
- We use [VSCode Dev Containers](https://code.visualstudio.com/docs/remote/containers) to make it easy for contributors to get started!
@@ -57,37 +56,42 @@ If you are not a coder, you can still contribute financially. Financial contribu
<a href="https://www.buymeacoffee.com/haykot" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-green.png" alt="Buy Me A Coffee" style="height: 30px !important;width: 107px !important;" ></a>
### Translations
Translations can be a great way for **non-coders** to contribute to project. We use [Crowdin](https://crowdin.com/project/mealie) to allow several contributors to work on translating Mealie. You can simply help by voting for your preferred translations, or even by completely translating Mealie into a new language.
For more information, check out the translation page on the [contributor's guide](https://nightly.mealie.io/contributors/translating/).
<!-- LICENSE -->
## License
Distributed under the MIT License. See `LICENSE` for more information.
Distributed under the AGPL License. See `LICENSE` for more information.
## Sponsors
Huge thanks to all the sponsors of this project on [Github Sponsors](https://github.com/sponsors/hay-kot) and Buy Me a Coffee. Without you, this project would surely not be possible.
Thanks to Linode for providing Hosting for the Demo, Beta, and Documentation sites! Another big thanks to JetBrains for providing their IDEs for development.
Thanks to Depot for providing build instances for our Docker image builds.
1. With a recent refactor some users been experiencing issues with an environmental variable not being set correct. If you are experiencing issues, please provide your comments [Here](https://github.com/hay-kot/mealie/issues/281).
1. With a recent refactor some users been experiencing issues with an environmental variable not being set correct. If you are experiencing issues, please provide your comments [Here](https://github.com/mealie-recipes/mealie/issues/281).
2. If you are a developer, you may experience issues with development as a new environmental variable has been introduced. Setting `PRODUCTION=false` will allow you to develop as normal.
@@ -31,4 +31,4 @@
- Unify Logger across the backend
- mealie.log and last_recipe.json are now downloadable from the frontend from the /admin/about
- New download schema where you request a token and then use that token to hit a single endpoint to download a file. This is a notable change if you are using the API to download backups.
- Recipe images can now be added directly from a URL - [See #117 for details](https://github.com/hay-kot/mealie/issues/117)
- Recipe images can now be added directly from a URL - [See #117 for details](https://github.com/mealie-recipes/mealie/issues/117)
- [#1140](https://github.com/hay-kot/mealie/issues/1140) - Error in processing the quantity of ingredients #1140 - UI Now prevents entering not-allowed characters in quantity field
- [#1140](https://github.com/mealie-recipes/mealie/issues/1140) - Error in processing the quantity of ingredients #1140 - UI Now prevents entering not-allowed characters in quantity field
- UI now allows no value to be set in addition to a zero (0) value.
- [#1237](https://github.com/hay-kot/mealie/issues/1237) - UI: Saving a 0 quantity ingredient displays 0 until the page is refreshed #1237 - UI Now properly reacts to changes in the quantity field.
- [#1237](https://github.com/mealie-recipes/mealie/issues/1237) - UI: Saving a 0 quantity ingredient displays 0 until the page is refreshed #1237 - UI Now properly reacts to changes in the quantity field.
- Consolidated Frontend Types thanks to [@PFischbeck](https://github.com/Fischbeck)
- Added support for SSL/No Auth Email [@nkringle](https://github.com/nkringle)
- [Implement several notifications for server actions ](https://github.com/hay-kot/mealie/pull/1234)[@miroito](https://github.com/Miroito)
- [Implement several notifications for server actions ](https://github.com/mealie-recipes/mealie/pull/1234)[@miroito](https://github.com/Miroito)
- Fix display issue for shared recipe rendering on server [@PFischbeck](https://github.com/Fischbeck)
## v1.0.0b - 2022-05-09
@@ -36,7 +36,7 @@
- Mealie now stores the original text from parsed ingredients, with the ability to peak at the original text from a recipe. [@miroito](https://github.com/Miroito)
- Added some management / utility functions for administrators to manage data and cleanup artifacts from the file system.
- Fix clear url action in recipe creation [#1101](https://github.com/hay-kot/mealie/pull/1101) [@miroito](https://github.com/Miroito)
- Fix clear url action in recipe creation [#1101](https://github.com/mealie-recipes/mealie/pull/1101) [@miroito](https://github.com/Miroito)
- Add group statistics calculations and data storage measurements
- No hard limits are currently imposed on groups - though this may be implemented in the future.
- Properly use pagination for group event notifies ([#1512](https://github.com/hay-kot/mealie/pull/1512))
- For erroneously-translated datetime config ([#1362](https://github.com/mealie-recipes/mealie/issues/1362))
- Fixed text color on RecipeCard in RecipePrintView and implemented ingredient sections ([#1351](https://github.com/mealie-recipes/mealie/issues/1351))
- Ingredient sections lost after parsing ([#1368](https://github.com/mealie-recipes/mealie/issues/1368))
- Increased float rounding precision for CRF parser ([#1369](https://github.com/mealie-recipes/mealie/issues/1369))
- Infinite scroll bug on all recipes page ([#1393](https://github.com/mealie-recipes/mealie/issues/1393))
- Fast fail of bulk importer ([#1394](https://github.com/mealie-recipes/mealie/issues/1394))
- Bump @mdi/js from 5.9.55 to 6.7.96 in /frontend ([#1279](https://github.com/mealie-recipes/mealie/issues/1279))
- Bump @nuxtjs/i18n from 7.0.3 to 7.2.2 in /frontend ([#1288](https://github.com/mealie-recipes/mealie/issues/1288))
- Bump date-fns from 2.23.0 to 2.28.0 in /frontend ([#1293](https://github.com/mealie-recipes/mealie/issues/1293))
- Bump fuse.js from 6.5.3 to 6.6.2 in /frontend ([#1325](https://github.com/mealie-recipes/mealie/issues/1325))
- Bump core-js from 3.17.2 to 3.23.1 in /frontend ([#1383](https://github.com/mealie-recipes/mealie/issues/1383))
- All-recipes page now sorts alphabetically ([#1405](https://github.com/mealie-recipes/mealie/issues/1405))
- Sort recent recipes by created_at instead of date_added ([#1417](https://github.com/mealie-recipes/mealie/issues/1417))
- Only show scaler when ingredients amounts enabled ([#1426](https://github.com/mealie-recipes/mealie/issues/1426))
- Add missing types for API token deletion ([#1428](https://github.com/mealie-recipes/mealie/issues/1428))
- Added "last-modified" header to supported record types ([#1379](https://github.com/mealie-recipes/mealie/issues/1379))
- Re-write get all routes to use pagination ([#1424](https://github.com/mealie-recipes/mealie/issues/1424))
- Advanced filtering API ([#1468](https://github.com/mealie-recipes/mealie/issues/1468))
- Restore frontend sorting for all recipes ([#1497](https://github.com/mealie-recipes/mealie/issues/1497))
- Implemented local storage for sorting and dynamic sort icons on the new recipe sort card ([1506](https://github.com/mealie-recipes/mealie/pull/1506))
- create new foods and units from their Data Management pages ([#1511](https://github.com/mealie-recipes/mealie/pull/1511))
### Miscellaneous Tasks
- Bump dev deps ([#1418](https://github.com/hay-kot/mealie/issues/1418))
- Bump @vue/runtime-dom in /frontend ([#1423](https://github.com/hay-kot/mealie/issues/1423))
We use github to host code, to track issues and feature requests, as well as accept pull requests.
## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests
Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests:
## We Use [Github Flow](https://docs.github.com/en/get-started/using-github/github-flow), So All Code Changes Happen Through Pull Requests
Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://docs.github.com/en/get-started/using-github/github-flow)). We actively welcome your pull requests:
1. Fork the repo and create your branch from `dev`.
1. Fork the repo and create your branch from `mealie-next`.
2. Checkout the Discord, the PRs page, or the Projects page to get an idea of what's already being worked on.
3. If you're interested on working on major changes please get in touch on discord and coordinate with other developers. No sense in doubling up on work if someones already on it.
3. If you're interested on working on major changes please get in touch on discord and coordinate with other developers. No sense in doubling up on work if someones already on it.
4. Once you've got an idea of what changes you want to make, create a draft PR as soon as you can to let us know what you're working on and how we can help!
5. If you've changed APIs, update the documentation.
6.Issue that pull request!
7. If you make changes to the dev branch reflect those changes in the active changelog to keep track of changes. Don't forget to add your name/handle/identifier!
6.Run tests, including `task py:check`.
6. Issue that pull request! First make a draft PR, make sure that the automated github tests all pass, then mark as ready for review.
7. Be sure to add release notes to the pull request.
## Any contributions you make will be under the MIT Software License
In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern.
## Any contributions you make will be under the AGPL Software License
In short, when you submit code changes, your submissions are understood to be under the same [AGPL License](https://choosealicense.com/licenses/agpl-3.0/) that covers the project. Feel free to contact the maintainers if that's a concern.
## Report bugs using Github's [issues](https://github.com/hay-kot/mealie/issues)
We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/hay-kot/mealie/issues/new); it's that easy!
## Report bugs using Github's [issues](https://github.com/mealie-recipes/mealie/issues)
We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/mealie-recipes/mealie/issues/new); it's that easy!
## Write bug reports with detail, background, and sample code
**Great Bug Reports** tend to have:
- A quick summary and/or background
- Steps to reproduce
- Be specific!
- Give sample code if you can. [This stackoverflow question](http://stackoverflow.com/q/12488905/180626) includes sample code that *anyone* with a base R setup can run to reproduce what I was seeing
* Be specific!
* Give sample code if you can. [This stackoverflow question](http://stackoverflow.com/q/12488905/180626) includes sample code that *anyone* with a base R setup can run to reproduce what I was seeing
- What you expected would happen
- What actually happens
- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
@@ -37,7 +38,7 @@ People *love* thorough bug reports. I'm not even kidding.
## License
By contributing, you agree that your contributions will be licensed under its MIT License.
By contributing, you agree that your contributions will be licensed under its AGPL License.
## References
This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md)
This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebookarchive/draft-js/blob/main/CONTRIBUTING.md)
This is the start of the maintainers guide for Mealie developers. Those who have been invited to the GitHub organization and/or those who wish to play a bigger part in the Mealie developers community may find this helpful.
## Managing Issues
If you are working on issues, it can be helpful to understand the workflow for our repository. When an issue comes in it is tagged with the `bug` and `triage` flags. This is to indicate that they need to be reviewed by a maintainer to determine validity.
After you've reviered an issue it will generally move into one of two states:
`bug:confirmed`
: Your were able to verify the issue and we determined we need to fix it
`needs more info`
: The original post does not contain enough information, and if the reporter does not provide additional information, the issue will be automatically closed.
Once you've reviewed an issue and moved it into another category, you should remove the triage label.
### While going through issues try to keep the following in mind
- It is perfectly okay to ignore an issue if it is low quality
- You should close any issues that ignore the standard report template and request they reopen the issue using the proper template
- You should **not** try to reproduce issues that don't have clear reproduction steps, don't have a version provided, or are generally unclear.
- Issues that are not bugs, should likely be converted to discussions.
## Drafting Releases
### Tags
Mealie is published via GitHub actions to the GitHub container registry with the follow tags:
`ghcr.io/mealie-recipes/mealie:nightly`
: published with every push to `mealie-next` branch - [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/nightly.yml)
`ghcr.io/mealie-recipes/mealie:latest`
: published when a new GitHub Release is created - [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/release.yml)
`ghcr.io/mealie-recipes/mealie:{version}`
: published when a new GitHub Release is created - [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/release.yml)
!!! note
Both the latest, and {version} tags will be the same image on the release of a new version
### Process
Because we've built all our publishing efforts on GitHub Actions we rely primarily on automations to perform our releases. As such creating a new build of Mealie is as simple as creating a new GitHub release. Here are the general steps we take to create a new release
1. Navigate to the [Github Release Page](https://github.com/mealie-recipes/mealie/releases) and click the 'Draft a new release' button.
2. Choose a tag and increment the version according to the semver specification. i.e, **major** version for breaking changes, **minor** for feature updates, and **patch** for bug fixes.
3. Name the Release, usually just the tag is fine, however if there is a special feature you'd like to highlight this would be a great place to do it.
4. Click the "Generate release notes" button which will pull in all the Git Commits as a changelog. For bug fix only releases this is sufficient, however if there are major features, or good quality of life improvements it's good to provide those prior to listing the full changelog.
!!! tip
Don't worry about setting the version number in the container or code, it's set during the build process and uses the tag you specified when drafting a new release.
You can see how this is done in the [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/partial-builder.yml#L35-L37)
### Tags and Releases
Mealie tries to adhere to a strict [Semver](https://semver.org/) policy. This means that we try to keep our releases as stable as possible, and only introduce breaking changes when absolutely necessary. As such we try to keep our releases as follows:
- **Major** releases are reserved for breaking changes, and are not expected to be frequent. Ideally, we will remain at v1.x.x for the forseeable future.
- **Minor** releases are reserved for new features, and are expected to be frequent.
- **Patch** releases are reserved for bug fixes, and are expected to be frequent.
Any maintainer who has privileges on GitHub to create a new release can create a release at any time they feel it is necessary. However, it is recommended that you reach out in the discord to other maintainers and get at least one other maintainer to approve the release.
An important caveat to this is that we _may_ make breaking changes in a minor release if it is security related. In this case, the releaser should headline the release notes with the notice and impact of the breaking change, however we may not bump the major version depending on user impact.
### Release Notes
When drafting a new release, GitHub will automatically pull in all the commits since the last release. This is a great start. After pulling in all of the commits, you should add sections for
- New Features - Any new features that are being introduced in this release (screenshots are great here)
- Bug Fixes - Significant bug fixes that are being introduced in this release, smaller bug fixes can be left out if they are noted in a commit message
- Breaking Changes - Any breaking changes that are being introduced in this release (should be rare)
First ensure that docker is running. Then when you clone the repo and open with VS Code you should see a popup asking you to reopen the project inside a development container. Click yes and it will build the development container and run the setup required to run both the backend API and the frontend webserver. This also pre-configures pre-commit hooks to ensure that the code is up to date before committing.
Checkout the makefile for all of the available commands.
### Windows
Make sure the VSCode Dev Containers extension is installed, then select "Dev Containers: Clone Repository in Container Volume..." in the command palette (F1). Select your forked repo and choose the `mealie-next` branch, which contains the latest changes. This mounts your repository directly in WSL2, which [greatly improves the performance of the container](https://code.visualstudio.com/docs/devcontainers/containers#_quick-start-open-a-git-repository-or-github-pr-in-an-isolated-container-volume), and enables hot-reloading for the frontend. Running the container on a mounted volume may not work correctly on Windows due to WSL permission mapping issues.
!!! tip
For slow terminal checkout the solution in this [GitHub Issue](https://github.com/microsoft/vscode/issues/133215)
@@ -25,16 +29,18 @@ Checkout the makefile for all of the available commands.
Once the prerequisites are installed you can cd into the project base directory and run `make setup` to install the python and node dependencies.
Once the prerequisites are installed you can cd into the project base directory and run `task setup` to install the python and node dependencies, and download the NLP model.
=== "Linux / macOS"
@@ -42,75 +48,54 @@ Once the prerequisites are installed you can cd into the project base directory
# Naviate To The Root Directory
cd /path/to/project
# Utilize the Makefile to Install Dependencies
make setup
# Utilize the Taskfile to Install Dependencies
task setup
```
=== "Windows"
## Postgres
``` powershell
# Install Python Dependencies
Set-Directory -Path "C:\path\to\project"
poetry install
The taskfile has two commands that need to be run to run the development environment against a postgres database.
# Install Node Dependencies
Set-Directory frontend
yarn install
```
- `task dev:services` - This will start the postgres database, and a smtp server for email testing.
- `task py:postgres` - This will run that backend API configured for the local postgres database.
### Setting ENV Variables
## Starting The Server
Before you start the server you MUST copy the `template.env` and `frontend/template.env` files to their respective locations with the name `.env` and `frontend/.env` respectively. The application will-not run without these files.
### Starting The Server
Once that is complete you're ready to start the servers. You'll need two shells open, One for the server and one for the frontend.
Now you're ready to start the servers. You'll need two shells open, One for the server and one for the frontend.
=== "Linux / macOS"
```bash
# Terminal #1
make backend
task py
# Terminal #2
make frontend
task ui
```
=== "Windows"
## Internationalization
``` powershell
# Terminal # 1
poetry run python mealie/db/init_db.py # Initialize the database
poetry run python mealie/app.py # start application
### Frontend
# Terminal # 2
Set-Directory frontend
yarn run dev
```
We use vue-i18n package for internationalization. Translations are stored in json format located in [frontend/lang/messages](https://github.com/mealie-recipes/mealie/tree/mealie-next/frontend/lang/messages).
## Make File Reference
### Backend
Run `make help` for reference. If you're on a system that doesn't support makefiles in most cases you can use the commands directly in your terminal by copy/pasting them from the Makefile.
Translations are stored in json format located in [mealie/lang/messages](https://github.com/mealie-recipes/mealie/tree/mealie-next/mealie/lang/messages).
### Quick frontend localization with VS Code
[i18n Ally for VScode](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally) is helpful for generating new strings to translate using Code Actions. It also has a nice feature, which shows translations in-place when editing code.
A few settings must be tweaked to make the most of its features. Some settings are stored on project level, but most of them have to be set manually in your workspace or user settings.\
We've found that the following settings work best:
```
docs 📄 Start Mkdocs Development Server
code-gen 🤖 Run Code-Gen Scripts
setup 🏗 Setup Development Instance
setup-model 🤖 Get the latest NLP CRF++ Model
clean-data ⚠️ Removes All Developer Data for a fresh server start
clean-pyc 🧹 Remove Python file artifacts
clean-test 🧹 Remove test and coverage artifacts
backend-clean 🧹 Remove all build, test, coverage and Python artifacts
backend-test 🧪 Run tests quickly with the default Python
backend-format 🧺 Format, Check and Flake8
backend-all 🧪 Runs all the backend checks and tests
backend-coverage ☂️ Check code coverage quickly with the default Python
backend 🎬 Start Mealie Backend Development Server
frontend 🎬 Start Mealie Frontend Development Server
frontend-build 🏗 Build Frontend in frontend/dist
frontend-generate 🏗 Generate Code for Frontend
frontend-lint 🧺 Run yarn lint
docker-dev 🐳 Build and Start Docker Development Stack (currently not functional, see #756, #1072)
docker-prod 🐳 Build and Start Docker Production Stack
Translations can be a great way **for non-coders** to contribute to project.
We use **[Crowdin](https://crowdin.com/project/mealie)** to allow several contributors to work on translating Mealie.
We use **[Crowdin](https://crowdin.com/project/mealie)** to allow several contributors to work on translating Mealie.
You can simply help by voting for your preferred translations, or even by completely translating Mealie into a new language.
Translations are regularly pulled from Crowdin and included in each new release.
@@ -8,14 +8,9 @@ Translations are regularly pulled from Crowdin and included in each new release.
Please use Crowdin as much as possible if you have any question/issue regarding a particular string. You can take a look at [Crowdin Knowledge base](https://support.crowdin.com/for-volunteer-translators/) if you want to know more about how to use this tool.
## My language is missing in Mealie
Once your language is translated on Crowdin, we need to manually add it in Mealie. If you believe your language is ready for use, please create an issue on GitHub.
Once your language is translated on Crowdin, we need to manually add it in Mealie. If you believe your language is ready for use, please create an issue on GitHub.
## I can't find a particular text in Crowdin
There can be several reasons:
- The text you're looking for is outdated: someone has already changed it or it will be removed/changed in the next release.
- It is possible some texts are not translatable (yet) for technical reasons. If you spot one, please reach out to us on [Discord](https://discord.gg/QuStdQGSGK) or raise an issue on GitHub.
## Technical information
We use vue-i18n package for internationalization. Translations are stored in json format located in [frontend/src/locales/messages](https://github.com/hay-kot/mealie/tree/master/frontend/src/locales/messages).
[i18n Ally for VScode](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally) is helpful for generating new strings to translate. It also has a nice feature, which shows translations in-place when editing code.
This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed!
This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed!
In a lot of ways, Home Assistant is why this project exists! Since Mealie has a robust API it makes it a great fit for interacting with Home Assistant and pulling information into your dashboard.
### Get Todays Meal in Lovelace
Starting in v0.4.1 you are now able to use the uri `/api/meal-plans/today/image?group_name=Home` to directly access the image to todays meal. This makes it incredibly easy to include the image into your Home Assistant Dashboard using the picture entity.
### Display Today's Meal in Lovelace
Here's an example where `sensor.mealie_todays_meal` is pulling in the meal-plan name and I'm using the url to get the image.
You can use the Mealie API to get access to mealplans in Home Assistant like in the image below.
Create an API token from Mealie's User Settings page (https://hay-kot.github.io/mealie/documentation/users-groups/user-settings/#api-key-generation)
#### 2. Create Home Assistant Sensors
Create REST sensors in home assistant to get the details of today's meal.
We will create sensors to get the name and ID of the first meal in today's meal plan (note that this may not be what is wanted if there is more than one meal planned for the day). We need the ID as well as the name to be able to retreive the image for the meal.
Make sure the url and port (`http://mealie:9000` ) matches your installation's address and _API_ port.
Under the entity page for the new camera, rename it.
e.g. `camera.mealie_todays_meal_image`
#### 4. Create a Lovelace Card
Create a picture entity card and set the entity to `mealie_todays_meal` and the camera entity to `camera.mealie_todays_meal_image` or set in the yaml directly.
The Bearer token can be created from the User Settings page (https://hay-kot.github.io/mealie/documentation/users-groups/user-settings/#api-key-generation)
!!! tip
Due to how Home Assistant works with images, I had to include the additional styling to get the images to not appear distorted. This includes and [additional installation](https://github.com/thomasloven/lovelace-card-mod) from HACS.
Due to how Home Assistant works with images, I had to include the additional styling to get the images to not appear distorted. This requires an [additional installation](https://github.com/thomasloven/lovelace-card-mod) from HACS.
This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed!
You can use bookmarklets to generate a bookmark that will take your current location, and open a new tab that will try to import that URL into Mealie.
You can use a [bookmarklet generator site](https://caiorss.github.io/bookmarklet-maker/) and the code below to generate a bookmark for your site. Just change the `http://localhost:8080` to your sites web address and follow the instructions.
```js
varurl=document.URL;
varmealie="http://localhost:8080";
vargroup_slug="home"// Change this to your group slug. You can obtain this from your URL after logging-in to Mealie
varuse_keywords="&use_keywords=1"// Optional - use keywords from recipe - update to "" if you don't want that
varedity="&edit=1"// Optional - keep in edit mode - update to "" if you don't want that
This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed!

User [brasilikum](https://github.com/brasilikum) opened an issue on the main repo about how they had created an [iOS shortcut](https://github.com/hay-kot/mealie/issues/103) for interested users. This is a useful utility for iOS users who browse for recipes in their web browser from their devices. Recent updates to Mealie has made this original shortcut break. Reddit user [BooNooBooNooB](https://www.reddit.com/user/BooNooBooNooB/) has helped to create a new working version.
Don't know what an iOS shortcut is? Neither did I! Experienced iOS users may already be familiar with this utility but for the uninitiated, here is the official Apple explanation:
> A shortcut is a quick way to get one or more tasks done with your apps. The Shortcuts app lets you create your own shortcuts with multiple steps. For example, build a “Surf Time” shortcut that grabs the surf report, gives an ETA to the beach, and launches your surf music playlist.
Basically it is a visual scripting language that lets a user build an automation in a guided fashion. The automation can be [shared with anyone](https://www.icloud.com/shortcuts/4c40fcc6f39549f9a189995a449cd44f) but if it is a user creation, you'll have to jump through a few hoops to make an untrusted automation work on your device.
Basically it is a visual scripting language that lets a user build an automation in a guided fashion. The automation can be [shared with anyone](https://www.icloud.com/shortcuts/94aa272af5ff4d2c8fe5e13a946f89a9) but if it is a user creation, you'll have to jump through a few hoops to make an untrusted automation work on your device.
You need to replace `username` and `password` with the login information for your mealie instance.
You should now be able to share a website to the shortcut and have mealie grab all the necessary information!
### Prerequisites
Before setting up the shortcut, make sure you have the following information ready and easily accessable on your Apple device.
1. The URL of your Mealie instance
2. An API Key for your user
3. A Gemini API Key from [Google AI Studio](https://makersuite.google.com)
!!! note
A Gemini API Key is not required for importing URLs from Safari or your Camera, however you will not be able to take a photo of a recipe and import it without a Gemini key.
Google AI Studio is currently only available in [certain countries and languages](https://ai.google.dev/available_regions). Most notably it is not currently available in Europe.
### Setup
On the Apple device you wish to add the shortcut to, click on [this link](https://www.icloud.com/shortcuts/94aa272af5ff4d2c8fe5e13a946f89a9) to begin the setup of the shortcut.

Next, you need to replace `url` and `port` with the information for your Mealie instance.
If you have a domain that you use (e.g. `https://mealie.example.com`), put that here. If you just run local, then you need to put in your Mealie instance IP and the port you use (e.g. the default is `9925`).

Next, you need to replace `MEALIE_API_KEY` with your API token.

Finally, replace `GEMINI_API_KEY` with the one you got from [Google AI Studio](https://makersuite.google.com)

You may wish to [add the shortcut to your home screen](https://support.apple.com/guide/shortcuts/add-a-shortcut-to-the-home-screen-apd735880972/ios) for easier access.
## Features
- Share a website from Safari with Mealie to import via URL.
- Share a recipe photo from photos to perform OCR and import a physical recipe.
- Trigger the shortcut and take a photo of a physical recipe to import.
- Trigger the shortcut to select a photo from your Photos app to import.
- Trigger the shortcut to take a picture of a URL (like on the bottom of a printed recipe) to import.
## Troubleshooting
Sometimes Gemini will not be able to parse a recipe, and you will get an error. Users have found success with a combination of the following:
1. #### Try Again
Sometimes Gemini returns the wrong information which causes the import to fail. Often, trying again will be successful.
2. #### Photo Quality
Make sure there is no large glare or shadow over the picture, and you have all the text in frame.
3. #### Edit the Photo
Users have found success by cropping the picture to just the recipe card, adding a "mono" filter, and cranking up the exposure before importing.
## History
User [brasilikum](https://github.com/brasilikum) opened an issue on the main repo about how they had created an [iOS shortcut](https://github.com/mealie-recipes/mealie/issues/103) for interested users.
This original method broke after the transition to version 1.X and an issue was raised on [Github](https://github.com/mealie-recipes/mealie/issues/2092) GitHub user [Zippyy](https://github.com/zippyy) has helped to create a working shortcut for version 1.X.
When OCR was removed from Mealie, GitHub user [hunterjm](https://github.com/zippyy) created a new shortcut that uses Apple's built-in OCR and Google Gemini to enhance and replace that functionality.
To make the setup of a Reverse Proxy much easier, Linuxserver.io developed [SWAG](https://github.com/linuxserver/docker-swag)
To make the setup of a Reverse Proxy much easier, Linuxserver.io developed [SWAG](https://github.com/linuxserver/docker-swag)
SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx web server and reverse proxy with PHP support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention.
## Step 1: Get a domain
@@ -14,39 +14,38 @@ The first step is to grab a dynamic DNS if you don't have your own subdomain alr
## Step 2: Set-up SWAG
Then you will need to set up SWAG, the variables of the docker-compose are explained on the Github page of [SWAG](https://github.com/linuxserver/docker-swag).
This is an example of how to set it up using duckdns and docker-compose.
Then you will need to set up SWAG, the variables of the docker-compose.yaml file are explained on the Github page of [SWAG](https://github.com/linuxserver/docker-swag).
This is an example of how to set it up using duckdns and dockercompose.
!!! example "docker-compose.yml"
!!! example "docker-compose.yaml"
```yaml
version:"3.1"
services:
swag:
image:ghcr.io/linuxserver/swag
container_name:swag
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Brussels
- URL=<mydomain.duckdns>
- SUBDOMAINS=wildcard
- VALIDATION=duckdns
- CERTPROVIDER=#optional
- DNSPLUGIN=#optional
- DUCKDNSTOKEN=<duckdnstoken>
- EMAIL=<e-mail>#optional
- ONLY_SUBDOMAINS=false#optional
- EXTRA_DOMAINS=<extradomains>#optional
- STAGING=false#optional
volumes:
- /etc/config/swag:/config
ports:
- 443:443
- 80:80#optional
restart:unless-stopped
swag:
image:ghcr.io/linuxserver/swag
container_name:swag
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Brussels
- URL=<mydomain.duckdns>
- SUBDOMAINS=wildcard
- VALIDATION=duckdns
- CERTPROVIDER=#optional
- DNSPLUGIN=#optional
- DUCKDNSTOKEN=<duckdnstoken>
- EMAIL=<e-mail>#optional
- ONLY_SUBDOMAINS=false#optional
- EXTRA_DOMAINS=<extradomains>#optional
- STAGING=false#optional
volumes:
- /etc/config/swag:/config
ports:
- 443:443
- 80:80#optional
restart:unless-stopped
```
Don't forget to change the <code>mydomain.duckns</code> into your personal domain and the <code>duckdnstoken</code> into your token and remove the brackets.
@@ -61,26 +60,25 @@ Alternatively, you can create a new file <code>mealie.subdomain.conf</code> in p
Mealie supports long-live api tokens in the user frontend. See [user settings page](../users-groups/user-settings.md)
Mealie supports long-live api tokens in the user frontend. These can be created on the `/user/profile/api-tokens` page.
## Key Components
### Exploring Your Local API
On your local installation you can access interactive API documentation that provides `curl` examples and expected results. This allows you to easily test and interact with your API to identify places to include your own functionality. You can visit the documentation at `http://mealie.yourdomain.com/docs` or see the example at the [Demo Site](https://demo.mealie.io/docs).
On your local installation you can access interactive API documentation that provides `curl` examples and expected results. This allows you to easily test and interact with your API to identify places to include your own functionality. You can visit the documentation at `http://<your-mealie-site>/docs` or see the example at the [Demo Site](https://demo.mealie.io/docs).
### Extras
#### Recipe Extras
@@ -73,6 +72,33 @@ This filter will find all recipes created on or after a particular date: <br>
This filter will find all units that have `useAbbreviation` disabled: <br>
`useAbbreviation = false`
This filter will find all foods that are not named "carrot": <br>
`name <> "carrot"`
##### Keyword Filters
The API supports many SQL keywords, such as `IS NULL` and `IN`, as well as their negations (e.g. `IS NOT NULL` and `NOT IN`).
Here is an example of a filter that returns all recipes where the "last made" value is not null: <br>
`lastMade IS NOT NULL`
This filter will find all recipes that don't start with the word "Test": <br>
`name NOT LIKE "Test%"`
> **_NOTE:_** for more information on this, [check out the SQL "LIKE" operator](https://www.w3schools.com/sql/sql_like.asp)
This filter will find all recipes that have particular slugs: <br>
`slug IN ["pasta-fagioli", "delicious-ramen"]`
##### Nested Property filters
When querying tables with relationships, you can filter properties on related tables. For instance, if you want to query all recipes owned by a particular user: <br>
`user.username = "SousChef20220320"`
This timeline event filter will return all timeline events for recipes that were created after a particular date: <br>
`recipe.createdAt >= "2023-02-25"`
This recipe filter will return all recipes that contains a particular set of tags: <br>
`tags.name CONTAINS ALL ["Easy", "Cajun"]`
##### Compound Filters
You can combine multiple filter statements using logical operators (`AND`, `OR`).
@@ -90,3 +116,31 @@ You can have multiple filter groups combined by logical operators. You can defin
Here's a filter that will find all recipes updated between two particular times, but exclude the "Pasta Fagioli" recipe: <br>
`(updatedAt > "2022-07-17T15:47:00Z" AND updatedAt < "2022-07-17T15:50:00Z") AND name <> "Pasta Fagioli"`
#### Advanced Ordering
Pagination supports `orderBy`, `orderByNullPosition`, and `orderDirection` params to change how you want your query results to be ordered. These can be fine-tuned for more advanced use-cases.
##### Order By
The pagination `orderBy` attribute allows you to sort your query results by a particular attribute. Sometimes, however, [you may want to sort by more than one attribute](https://www.w3schools.com/sql/sql_orderby.asp). This can be achieved by passing a comma-separated string to the `orderBy` parameter. For instance, if you want to sort recipes by their last made datetime, then by their created datetime, you can pass the following `orderBy` string: <br>
`lastMade, createdAt`
Similar to the standard SQL `ORDER BY` logic, your attribute orders will be applied sequentially. In the above example, *first* recipes will be sorted by `lastMade`, *then* any recipes with an identical `lastMade` value are sorted by `createdAt`. In addition, standard SQL rules apply when handling results with null values (such as when joining related tables). You can apply the `NULLS FIRST` and `NULLS LAST` SQL expressions by setting the `orderByNullPosition` to "first" or "last". If left empty, the default SQL behavior is applied, [which is different depending on which database you're using](https://learnsql.com/blog/how-to-order-rows-with-nulls/).
##### Order Direction
The query will be ordered in ascending or descending order, depending on what you pass to the pagination `orderDirection` param. You can either specify "asc" or "desc".
When sorting by multiple attributes, if you *also* want one or more of those sorts to be different directions, you can specify them with a colon. For instance, if, like our previous example, say you want to sort by `lastMade` and `createdAt`. However, this time, you want to sort by `lastMade` ascending, but `createdAt` descending. You could pass this `orderBy` string: <br>
`lastMade:asc, createdAt:desc`
In the above example, whatever you pass to `orderDirection` will be ignored. If, however, you only specify the direction on one attribute, all other attributes will use the `orderDirection` value.
Consider this `orderBy` string: <br>
`lastMade:asc, createdAt, slug`
And this `orderDirection` value: <br>
`desc`
This will result in a recipe query where all recipes are sorted by `lastMade` ascending, then `createdAt` descending, and finally `slug` descending.
Similar to query filters, when querying tables with relationships, you can order by properties on related tables. For instance, if you want to query all foods with labels, sorted by label name, you could use this `orderBy` value: <br>
You might have noticed that scaling up a recipe or making a shopping list doesn't by default handle the ingredients in a way you might expect. Depending on your settings, scaling up might yield things like `2 1 cup broth` instead of `2 cup broth`. And making shopping lists from reciepes that have shared ingredients can yield multiple lines of the same ingredient. **But**, mealie has a mechanism to intelligently handle ingredients and make your day better. How?
### Set up your Foods and Units
Do the following just **once**. Doing this applies to your whole group, so be careful.
1. Click on your name in the upper left corner to get to your settings
2. In the bottom right, select `Manage Data`
3. In the Management page, make sure that a little orange button says `Foods`
4. If your Foods database is empty, click `Seed` and choose your language. You should end up with a list of foods. (Wait bit for seeding to happen, and try not to seed more than once or you will have duplicates)
5. Click the little orange `Foods` button and now choose `Units`.
6. Click `Seed` and choose your language. You should end up with a list of units (e.g. `tablespoon`)
Initial seeding of Units is pretty complete, but there are many Foods in the world. You'll probably find that you need to add Foods to the database during parsing for the first several recipes. Once you have a well-populated Food database, there are API routes to parse ingredients automatically in bulk. But this is not a good idea without a very complete set of Foods.
### Set up Recipes to use Foods and Units
Do the following for each recipe you want to intelligently handle ingredients.
1. Go to a recipe
2. Click the Edit button/icon
3. Click the Recipe Settings gear and deselect `Disable Ingredient Amounts`
4. Save
5. The ingredients should now look a little weird (`1 1 cup broth` and so on)
6. Click the Edit button/icon again
7. Scroll to the ingredients and you should see new fields for Amount, Unit, Food, and Note. The Note in particular will contain the original text of the Recipe.
8. Click `Parse` and you will be taken to the ingredient parsing page.
9. Choose your parser. The `Natural Language Parser` works very well, but you can also use the `Brute Parser`.
10. Click `Parse All`, and your ingredients should be separated out into Units and Foods based on your seeding in Step 1 above.
11. For ingredients where the Unit or Food was not found, you can click a button to accept an automatically suggested Food to add to the database. Or, manually enter the Unit/Food and hit `Enter` (or click `Create`) to add it to the database
12. When done, click `Save All` and you will be taken back to the recipe. Now the Unit and Food fields of the recipe should be filled out.
Scaling up this recipe or adding it to a Shopping List will now smartly take care of ingredient amounts and duplicate combinations.
## Is it Safe to Upgrade Mealie?
Yes. If you are using the v1 branches (including beta), you can upgrade to the latest version of Mealie without performing a site Export/Restore. This process was required in previous versions of Mealie, however we've automated the database migration process to make it easier to upgrade. Not that if you were using the v0.5.x version, you CANNOT upgrade to the latest version automatically. You must follow the migration instructions in the documentation.
**Links**
- [Migration From v0.5.x](./migrating-to-mealie-v1.md)
## How can I change the theme?
You can change the theme by settings the environment variables on the frontend container.
You can change the theme by settings the environment variables.
@@ -37,14 +57,91 @@ No. Due to limitations from the Javascript Framework, mealie doesn't support ser
## Can I install Mealie without docker?
Yes, you can install Mealie on your local machine. HOWEVER, it is recommended that you don't. Managing non-system versions of python, node, and npm is a pain. Moreover updating and upgrading your system with this configuration is unsupported and will likely require manual interventions. If you insist on installing Mealie on your local machine, you can use the links below to help guide your path.
Yes, you can install Mealie on your local machine. HOWEVER, it is recommended that you don't. Managing non-system versions of python, node, and npm is a pain. Moreover, updating and upgrading your system with this configuration is unsupported and will likely require manual interventions.
Mealie can use fuzzy search, which is robust to minor typos. For example, searching for "brocolli" will still find your recipe for "broccoli soup". But fuzzy search is only functional on a Postgres database backend. To enable fuzzy search you will need to migrate to Postgres:
## How I can attach an Image or Video to a Recipe?
1. Backup your database and download the .zip file (same as when [migrating](./migrating-to-mealie-v1.md))
2. Set up a [Postgres](./installation/postgres.md) instance of Mealie
3. Upload the backup .zip and click to apply it (as as migration)
Yes. Mealie's Recipe Steps and other fields support the markdown syntax and therefor supports images and videos. To attach an image to the recipe, you can upload it as an asset and use the provided copy button to generate the html image tag required to render the image. For videos, Mealie provides no way to host videos. You'll need to host your videos with another provider and embed them in your recipe. Generally, the video provider will provide a link to the video and the html tag required to render the video. For example, youtube provides the following link that works inside a step. You can adjust the width and height attributes as necessary to ensure a fit.
## How can I attach an imageor video to a Recipe?
Mealie's Recipe Steps and other fields support markdown syntax and therefore support images and videos. To attach an image to the recipe, you can upload it as an asset and use the provided copy button to generate the html image tag required to render the image. For videos, Mealie provides no way to host videos. You'll need to host your videos with another provider and embed them in your recipe. Generally, the video provider will provide a link to the video and the html tag required to render the video. For example, YouTube provides the following link that works inside a step. You can adjust the width and height attributes as necessary to ensure a fit.
```html
<iframewidth="560"height="315"src="https://www.youtube.com/embed/nAUwKeO93bY"title="YouTube video player"frameborder="0"allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"allowfullscreen></iframe>
```
## How can I unlock my account?
If your account has been locked by bad password attempts, you can use an administrator account to unlock another account. Alternatively, you can unlock all accounts via a script within the container.
```shell
docker exec -it mealie-next bash
python /app/mealie/scripts/reset_locked_users.py
```
## How can I change my password?
You can change your password by going to the user profile page and clicking the "Change Password" button. Alternatively you can use the following script to change your password via the CLI if you are locked out of your account.
```shell
docker exec -it mealie-next bash
python /app/mealie/scripts/change_password.py
```
## How do private groups and recipes work?
Managing private groups and recipes can be confusing. The following diagram and notes should help explain how they work to determine if a recipe can be shared publicly.
- Private links that are generated from the recipe page using the `Share` button bypass all group and recipe permissions
- Private groups block all access to recipes, including those that are public, except as noted above.
- Groups with "Allow users outside of your group to see your recipes" disabled block all access to recipes, except as noted above.
- Private recipes block all access to the recipe from public links. This does not affect Private Links.
```mermaid
stateDiagram-v2
r1: Request Access
p1: Using Private Link?
p2: Is Group Private?
p3: Is Recipe Private?
s1: Deny Access
n1: Allow Access
r1 --> p1
p1 --> p2: No
p1 --> n1: Yes
p2 --> s1: Yes
p2 --> p3: No
p3 --> s1: Yes
p3 --> n1: No
```
For more information, check out the [Permissions and Public Access guide](./usage/permissions-and-public-access.md).
## Can I use fail2ban with mealie?
Yes, mealie is configured to properly forward external IP addresses into the `mealie.log` logfile. Note that due to restrictions in docker, IP address forwarding only works on Linux.
Your fail2ban usage should look like the following:
```
Use datepattern : %d-%b-%y %H:%M:%S : Day-MON-Year2 24hour:Minute:Second
Use failregex line : ^ERROR:\s+Incorrect username or password from <HOST>
```
## Why An API?
An API allows integration into applications like [Home Assistant](https://www.home-assistant.io/) that can act as notification engines to provide custom notifications based on Meal Plan data to remind you to defrost the chicken, marinade the steak, or start the CrockPot. Additionally, you can access nearly any backend service via the API giving you total control to extend the application. To explore the API spin up your server and navigate to http://yourserver.com/docs for interactive API documentation.
## Why a Database?
Some users of static-site generator applications like ChowDown have expressed concerns about their data being stuck in a database. Considering this is a new project, it is a valid concern to be worried about your data. Mealie specifically addresses this concern by provided automatic daily backups that export your data in json, plain-text markdown files, and/or custom Jinja2 templates. **This puts you in control of how your data is represented** when exported from Mealie, which means you can easily migrate to any other service provided Mealie doesn't work for you.
As to why we need a database?
- **Developer Experience:** Without a database, a lot of the work to maintain your data is taken on by the developer instead of a battle-tested platform for storing data.
- **Multi User Support:** With a solid database as backend storage for your data, Mealie can better support multi-user sites and avoid read/write access errors when multiple actions are taken at the same time.
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.