1
0
Fork 0
mirror of https://github.com/mealie-recipes/mealie.git synced 2025-08-02 20:15:24 +02:00
This commit is contained in:
Hayden 2020-12-24 16:37:38 -09:00
commit beed8576c2
137 changed files with 40218 additions and 0 deletions

View file

@ -0,0 +1,46 @@
# Getting Started
To deploy docker on your local network it is highly recommended to use docker to deploy the image straight from dockerhub. Using the docker-compose below you should be able to get a stack up and running easily by changing a few default values and deploying.
Alternatively, this project is run in python. If you are deadset on deploying on a linux machine you can run this in an python enviromnet with a dedicated MongoDatabase. Provided that you know thats how you want to host the application, I'll assume you know how to do that.
[Get Docker](https://docs.docker.com/get-docker/)
### Installation - Docker
```yaml
# docker-compose.yml
version: "3.1"
services:
mealie:
build:
context: ./
dockerfile: Dockerfile
container_name: mealie
restart: always
ports:
- 9000:9000
environment:
db_username: root # Your Mongo DB Username - Please Change
db_password: example # Your Mongo DB Password - Please Change
db_host: mongo
db_port: 27017 # The Default port for Mongo DB
volumes:
- ./mealie/data/img:/app/data/img
- ./mealie/data/backups:/app/data/backups
mongo:
image: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root # Change!
MONGO_INITDB_ROOT_PASSWORD: example # Change!
mongo-express: # Optional Mongo GUI
image: mongo-express
restart: always
ports:
- 9091:8081
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: example
```

View file

@ -0,0 +1,95 @@
# Recipes
## URL Import
Adding a recipe can be as easy as copying the recipe URL into mealie and letting the web scrapper try to pull down the information. Currently this scraper is implemented with [scrape-schema-recipe package](https://pypi.org/project/scrape-schema-recipe/). You may have mixed results on some websites, especially with blogs or non specific recipe websites. See the bulk import Option below for another a convient way to add blog style recipes into Mealie.
![](gifs/url-demo.gif)
## Recipe Editor
Recipes can be edited and created via the UI. This is done with both a form based approach where you have a UI to work with as well as with a in browser JSON Editor. The JSON editor allows you to easily copy and paste data from other sources.
You can also add a custom recipe with the UI editor built into the web view. After logging in as a user you'll have access to the editor to make changes to all the content in the recipe.
![](gifs/editor-demo.gif)
## Bulk Import
Mealie also supports bulk import of recipe instructions and ingredients. Select "Bulk Add" in the editor and paste in your plain text data to be parsed. Each line is treated as one entry and will be appended to the existing ingredients or instructions if they exist. Empty lines will be stripped from the text.
![](gifs/bulk-add-demo.gif)
## Schema
Recipes are stored in the json-like format in mongoDB and then sent and edited in json format on the frontend. Each recipes uses [Recipe Schema](https://schema.org/Recipe) as a general guide with some additional properties specific to Mealie.
### Example
```json
{
_id: ObjectId('5fcdc3d715f131e8b191f642'),
name: 'Oat and Pecan Brittle Cookies',
description: 'A gorgeously textured cookie with crispy-edges, a chewy center, toasty pecans, and tiny crispy pecan brittle bits throughout.',
image: 'oat-and-pecan-brittle-cookies.jpg',
recipeYield: 'Makes about 18',
recipeIngredient: [
'1¼ cups (142 g) coarsely chopped pecans',
'¾ cup (150 g) granulated sugar',
'4 Tbsp. (½ stick) unsalted butter',
'½ tsp. baking soda',
'½ tsp. Diamond Crystal or ¼ tsp. Morton kosher salt',
'1 cup (2 sticks) unsalted butter, cut into 16 pieces, divided',
'1⅓ cups (173 g) all-purpose flour',
'2 tsp. Diamond Crystal or 1 tsp. Morton kosher salt',
'1 tsp. baking soda',
'2 cups (200 g) old-fashioned oats, divided',
'¾ cup (packed; 150 g) dark brown sugar',
'½ cup (100 g) granulated sugar',
'2 large eggs',
'1 Tbsp. vanilla extract'
],
recipeInstructions: [
{
'@type': 'HowToStep',
text: 'Place a rack in middle of oven; preheat to 350°. Toast pecans on a small rimmed baking sheet, tossing halfway through, until slightly darkened and fragrant, 810 minutes. Let cool.'
},
{
'@type': 'HowToStep',
text: 'Line another small rimmed baking sheet with a Silpat baking mat. Cook granulated sugar, butter, and 2 Tbsp. water in a small saucepan over medium-low heat, stirring gently with a heatproof rubber spatula, until sugar is dissolved. Increase heat to medium and bring syrup to a rapid simmer. Cook, without stirring, swirling pan often, until syrup turns a deep amber color, 810 minutes. Immediately remove saucepan from heat and stir in pecans. Once pecans are well coated, add baking soda and salt and stir to incorporate (mixture will foam and sputter as baking soda aerates caramel). Working quickly (it will harden fast), scrape mixture onto prepared baking sheet and spread into a thin layer. Let cool completely, 510 minutes. Chop into pea-size pieces; set aside.'
},
{
'@type': 'HowToStep',
text: 'Place half of butter (½ cup) in the bowl of a stand mixer. Bring remaining butter to a boil in a small saucepan over medium-low heat, stirring often with a heatproof rubber spatula. Cook, scraping bottom and sides of pan constantly, until butter sputters, foams, and, eventually, you see browned bits floating on the surface, 57 minutes. Pour brown butter over butter in stand mixer bowl, making sure to scrape in all the browned bits. Let sit until butter begins to resolidify, about 30 minutes.'
},
{
'@type': 'HowToStep',
text: 'Pulse flour, salt, and baking soda in a food processor to combine. Add half of reserved pecan brittle and 1 cup oats; process in long pulses until oats and brittle are finely ground.'
},
{
'@type': 'HowToStep',
text: 'Add brown sugar and granulated sugar to butter and beat with paddle attachment on medium speed until light and smooth but not fluffy, about 2 minutes. Scrape down sides of bowl and add eggs and vanilla. Beat until very light and satiny, about 1 minute. Scrape down sides of bowl and add flour mixture; beat on low speed until no dry spots remain and you have a soft, evenly mixed dough. Add remaining half of brittle and remaining 1 cup oats; mix on low speed just to distribute. Fold batter several times with a spatula to ensure everything is evenly mixed.'
},
{
'@type': 'HowToStep',
text: 'Using a 2-oz. scoop or ¼-cup measuring cup, scoop level portions of dough to make 18 cookies. Place on a parchment-lined baking sheet, spacing as close together as possible (youll space them out before baking). Cover tightly with plastic wrap and chill at least 12 hours and up to 2 days. (If youre pressed for time, a couple hours will do; cookies just wont be as chewy.)'
},
{
'@type': 'HowToStep',
text: 'When ready to bake, place racks in upper and lower thirds of oven; preheat to 350°. Line 2 large rimmed baking sheets with parchment paper. Arrange 6 cookies on each prepared baking sheet, spacing at least 3" apart.'
},
{
'@type': 'HowToStep',
text: 'Bake cookies, rotating baking sheets top to bottom and front to back after 12 minutes, until dark golden brown around the edges, 1620 minutes. Let cookies cool 5 minutes on baking sheets, then transfer cookies to a wire rack with a spatula and let cool completely.'
},
{
'@type': 'HowToStep',
text: 'Carefully move a rack to middle of oven. Arrange remaining dough on one of the baking sheets (its okay if its still warm). Bake as before (this batch might go a bit faster).\nDo ahead: Dough can be formed 2 months ahead; chill dough balls at least 2 hours before transferring to freezer. Once frozen solid, store in resealable plastic freezer bags and keep frozen. No need to thaw before baking, but you may need to add a minute or two to the baking time. Cookies can be baked 5 days ahead; store airtight at room temperature.'
}
],
slug: 'oat-and-pecan-brittle-cookies',
tags: [],
categories: [],
dateAdded: ISODate('2020-12-07T05:55:35.434Z'),
notes: [],
orgURL: 'https://www.bonappetit.com/recipe/oat-and-pecan-brittle-cookies',
rating: 3
}
```

View file

@ -0,0 +1,11 @@
# Meal Planner
## Working with Meal Plans
In Mealie you can create a mealplan based off the calendar inputs on the meal planner page. There is no limit to how long or how short a meal plan is. You may also create duplicate meal plans for the same date range. After selecting your date range, click on the card for each day and seach through recipes to find your choice. After selecting a recipe for all meals save the plan.
To edit the meal in a meal plan simply select the edit button on the card in the timeline. Similiarly, to delete a mealplan click the delete button on the card in the timeline. Currently there is no support to change the date range in a meal plan.
!!! warning
In coming a future release recipes for meals will be restricted to specific categories.
![](gifs/meal-plan-demo.gif)

View file

@ -0,0 +1,26 @@
# Admin Panel
!!! danger
As this is still a **BETA** It is reccomended that you backup your data often and store in more than one place. Adhear to backup best practies with the [3-2-1 Backup Rule](https://en.wikipedia.org/wiki/Backup)
### Theme Settings
![](img/admin-theme.png)
## Backup and Export
All recipe data can be imported and exported as necessary from the UI. Under the admin page you'll find the section for using Backups and Exports.
To create an export simple add the tag and the markdown template and click Backup Recipes and your backup will be created on the server. The backup is a standard zipfile containing all the images, json files, and rendered markdown files for each recipe. Markdown files are rendered from jinja2 templates. Adding your own markdown file into the templates folder will automatically show up as an option to select when creating a backup.
To import a backup it must be in your backups folder. If it is in the backup folder it will automatically show up as an source to restore from. Selected the desired backup and import the backup file.
![](img/admin-backup.png)
## Meal Planner Webhooks
In the webhooks section you can find a list of all your endpoint URLs that are used as part of the meal planner
![](img/admin-webhooks.png)
## SFTP Settings - Target Release 1.0
## User Settings - Target Release 1.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 MiB

BIN
docs/docs/gifs/url-demo.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

110
docs/docs/index.md Normal file
View file

@ -0,0 +1,110 @@
# About The Project
<p align="center">
<a href="https://github.com/hay-kot/mealie">
</a>
<p align="center">
<a href="https://github.com/hay-kot/mealie/issues">Report Bug</a>
·
<a href="https://github.com/hay-kot/mealie/issues">Request Feature</a>
</p>
</p>
<!-- ABOUT THE PROJECT -->
![Product Name Screen Shot][product-screenshot]
**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 relavent data or add a family recipe with the UI editor.
Melaie also provides a secure API for interactions from 3rd party applications. **Why does my recipe manager need 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 of Meal Plan data to remind you to defrost the chicken, marinade the steak, or start the CrockPot. Additionally, you can access any avaiable API from the backend server. To explore the API spin up your server and navigate to http://yourserver.com/docs for interactive API documentation.
!!! note
In some of the demo gifs the styling may be different than the finale application. demos were done during development prior to finale styling.
!!! warning
Note that this is a **BETA** release and that means things may break and or change down the line. I'll do my best to make sure that any API changes are thoughtful and necessary in order not to break things. Additionally, I'll do my best to provide a migration path if the database schema ever changes. That said, one of the nice things about MongoDB is that it's flexible!
### Main Features
#### Recipes
- Automatic web scrapping for common recipe platforms
- Interactive API Documentation thanks to [FastAPI](https://fastapi.tiangolo.com/) and [Swagger](https://petstore.swagger.io/)
- UI Recipe Editor
- JSON Recipe Editor in browser
- Custom tags and categories
- Rate recipes
- Add notes to recipes
#### Meal Planner
- Random Meal plan generation based off categories
- Expose notes in the API to allow external applications to access relavent information for meal plans
#### Database Import / Export
- Easily Import / Export your recipes from the UI
- Export recipes in markdown format for universal access
- Use the default or a custom jinja2 template
### Built With
* [Vue.js](https://vuejs.org/)
* [Vuetify](https://vuetifyjs.com/en/)
* [FastAPI](https://fastapi.tiangolo.com/)
* [MongoDB](https://www.mongodb.com/)
* [Docker](https://www.docker.com/)
<!-- ROADMAP -->
## Roadmap
#### Authentication - Target 1.0
- User Login
- Token Based API Access/Auth
#### Recipe Sharing
- Share Button / Email
- Export to PDF
- Print Button
- Git Repo Based Sharing (Import / Export / Search)
<!-- 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**. Especially test. Literally any tests.
<!-- LICENSE -->
## License
Distributed under the MIT License. See `LICENSE` for more information.
<!-- CONTACT -->
## Contact
Project Link: [https://github.com/hay-kot/mealie](https://github.com/hay-kot/mealie)
<!-- ACKNOWLEDGEMENTS -->
## Acknowledgements
* [Talk Python Training for helping me learn python](https://training.talkpython.fm/)
* [Academind for helping me learn Javascript and Vue.js](https://academind.com/)
<!-- MARKDOWN LINKS & IMAGES -->
<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->
[contributors-shield]: https://img.shields.io/github/contributors/hay-kot/mealie.svg?style=flat-square
[contributors-url]: https://github.com/hay-kot/mealie/graphs/contributors
[forks-shield]: https://img.shields.io/github/forks/hay-kot/mealie.svg?style=flat-square
[forks-url]: https://github.com/hay-kot/mealie/network/members
[stars-shield]: https://img.shields.io/github/stars/hay-kot/mealie.svg?style=flat-square
[stars-url]: https://github.com/hay-kot/mealie/stargazers
[issues-shield]: https://img.shields.io/github/issues/hay-kot/mealie.svg?style=flat-square
[issues-url]: https://github.com/hay-kot/mealie/issues
[license-shield]: https://img.shields.io/github/license/hay-kot/mealie.svg?style=flat-square
[license-url]: https://github.com/hay-kot/mealie/blob/master/LICENSE.txt
[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=flat-square&logo=linkedin&colorB=555
[linkedin-url]: https://linkedin.com/in/hay-kot
[product-screenshot]: img/home_screenshot.png

View file

@ -0,0 +1,8 @@
:root {
--md-primary-fg-color: #e58325;
--md-primary-fg-color--light: #e58325;
--md-primary-fg-color--dark: #e58325;
--md-accent-fg-color: #e58325;
--md-accent-fg-color--light: #e58325;
--md-accent-fg-color--dark: #e58325;
}