Skip to content

Commit 8343b98

Browse files
committed
Initial commit.
0 parents  commit 8343b98

23 files changed

+3652
-0
lines changed

.gitignore

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Pycharm
2+
.idea/
3+
4+
# Python-generated files
5+
__pycache__/
6+
*.py[oc]
7+
build/
8+
dist/
9+
wheels/
10+
*.egg-info
11+
12+
# Virtual environments
13+
.venv
14+
15+
# Build artifacts
16+
publish/
17+
main.build/
18+
main.dist/
19+
main.onefile-build/

.python-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3.13

LICENSE

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
Permission to use, copy, modify, and/or distribute this software for
2+
any purpose with or without fee is hereby granted.
3+
4+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
5+
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
6+
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE
7+
FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
8+
DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
9+
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
10+
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

README.md

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
# Recipe Box
2+
3+
Recipe Box is a desktop recipe manager for organizing your collection using a simple markup language.
4+
5+
![Recipe Box - Dark Theme](docs/screenshot.png)
6+
7+
## Features
8+
9+
* Edit recipes in a custom markup language with syntax highlighting and validation on save.
10+
* Import recipes from any website that supports JSON-LD metadata.
11+
* Use an AI assistant for recipe modifications, with changes shown in a diff view.
12+
* Export single recipes or your entire library as beautifully typeset PDFs via Typst.
13+
* Personalize the application with customizable UI fonts, editor fonts, and color schemes.
14+
* Cross platform. Runs on macOS, Linux, and Windows.
15+
16+
## Installation
17+
18+
[Download the latest release](https://github.com/kkestell/recipe-box/releases) from the releases page on GitHub.
19+
20+
## Recipe Format
21+
22+
The Recipe Box format is a simple, structured way to write recipes in plain text files that's easy for both humans and computers to read and write. A recipe consists of a title, optional metadata, and a series of steps, which can be grouped into named components.
23+
24+
```smidge
25+
= Classic Brownies
26+
27+
# Melt 1 cup butter and mix with 2 cups sugar.
28+
29+
- 1 cup butter
30+
- 2 cups sugar
31+
32+
# Beat in 4 eggs, one at a time.
33+
34+
- 4 eggs
35+
36+
# Fold in 3/4 cup cocoa powder and 1 cup flour.
37+
38+
- 3/4 cup cocoa powder
39+
- 1 cup flour
40+
41+
# Bake 25 minutes at 350°F.
42+
```
43+
44+
### Ingredients
45+
46+
Ingredients are prefixed with a dash (`-`) and are listed immediately following the step they belong to.
47+
48+
### Steps
49+
50+
Steps are marked with a hash symbol (`#`).
51+
52+
### Multiple Components
53+
54+
For more complex recipes, you can use a plus (`+`) prefix to create named components.
55+
56+
```smidge
57+
= Chicken Parmesan
58+
59+
+ Chicken
60+
61+
# Pound 4 chicken breasts thin.
62+
63+
- 4 chicken breasts
64+
65+
# Dip in 2 eggs, then 1 cup breadcrumbs.
66+
67+
- 2 eggs
68+
- 1 cup breadcrumbs
69+
70+
# Pan fry until golden.
71+
72+
+ Sauce
73+
74+
# Sauté 3 cloves garlic in 1 tbsp olive oil until fragrant.
75+
76+
- 3 cloves garlic
77+
- 1 tbsp olive oil
78+
79+
# Add 1 can crushed tomatoes and 1 tsp oregano, then simmer.
80+
81+
- 1 can crushed tomatoes
82+
- 1 tsp oregano
83+
```
84+
85+
### Metadata
86+
87+
Recipe metadata uses YAML frontmatter format with `lower_snake_case` keys.
88+
89+
```
90+
---
91+
prep_time: 20 minutes
92+
cook_time: 45 minutes
93+
servings: 6
94+
---
95+
```
96+
97+
Metadata must appear at the very beginning of your recipe file.
98+
99+
## License
100+
101+
Permission to use, copy, modify, and/or distribute this software for
102+
any purpose with or without fee is hereby granted.
103+
104+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
105+
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
106+
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE
107+
FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
108+
DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
109+
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
110+
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

docs/screenshot.png

56 KB
Loading

install.iss

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#define SourceDir "C:\Users\Kyle\Source\recipe-box"
2+
3+
[Setup]
4+
AppId={{d8266f16-378b-44ee-8082-933aea8c3609}}
5+
AppName=Recipe Box
6+
AppVersion=0.1.0
7+
AppVerName=Recipe Box
8+
AppPublisher=Kyle Kestell
9+
AppPublisherURL=https://github.com/kkestell/recipe-box
10+
AppSupportURL=https://github.com/kkestell/recipe-box
11+
AppUpdatesURL=https://github.com/kkestell/recipe-box
12+
DefaultDirName={autopf}\RecipeBox
13+
ArchitecturesAllowed=x64compatible
14+
ArchitecturesInstallIn64BitMode=x64compatible
15+
DisableProgramGroupPage=yes
16+
LicenseFile={#SourceDir}\LICENSE
17+
PrivilegesRequired=lowest
18+
OutputDir={#SourceDir}\publish
19+
OutputBaseFilename=RecipeBox_0.1.0_Setup
20+
Compression=lzma
21+
SolidCompression=yes
22+
WizardStyle=modern
23+
UninstallDisplayIcon={app}\RecipeBox.exe
24+
25+
[Languages]
26+
Name: "english"; MessagesFile: "compiler:Default.isl"
27+
28+
[Tasks]
29+
Name: "desktopicon"; Description: "Create a Desktop shortcut"; GroupDescription: "Additional shortcuts:"
30+
Name: "startmenuicon"; Description: "Create a Start Menu shortcut"; GroupDescription: "Additional shortcuts:"
31+
32+
[Files]
33+
Source: "{#SourceDir}\publish\RecipeBox.exe"; DestDir: "{app}"; Flags: ignoreversion
34+
35+
[Icons]
36+
Name: "{group}\RecipeBox"; Filename: "{app}\RecipeBox.exe"; Tasks: startmenuicon
37+
Name: "{userdesktop}\RecipeBox"; Filename: "{app}\RecipeBox.exe"; Tasks: desktopicon

install.ps1

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
$ErrorActionPreference = 'Stop'
2+
3+
uv run python -m nuitka .\src\recipe_box\main.py --windows-console-mode=disable --mode=onefile --enable-plugin=pyside6
4+
5+
if (Test-Path -Path "main.exe" -PathType Leaf) {
6+
Copy-Item -Path "main.exe" -Destination "publish\RecipeBox.exe" -Force
7+
}
8+
9+
if ($LASTEXITCODE -ne 0) {
10+
Write-Error "Nuitka build failed with exit code $LASTEXITCODE"
11+
exit $LASTEXITCODE
12+
}
13+
14+
& "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" install.iss

pyproject.toml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
[project]
2+
name = "recipe-box"
3+
version = "0.1.0"
4+
description = "A desktop recipe manager for organizing your collection using a simple markup language."
5+
readme = "README.md"
6+
requires-python = ">=3.13"
7+
dependencies = [
8+
"beautifulsoup4>=4.13.4",
9+
"instructor>=1.10.0",
10+
"pydantic>=2.11.7",
11+
"pyside6>=6.9.1",
12+
]
13+
14+
[dependency-groups]
15+
dev = [
16+
"nuitka>=2.7.12",
17+
"pytest>=8.4.1",
18+
"ruff>=0.12.7",
19+
]

src/__init__.py

Whitespace-only changes.

src/recipe_box/__init__.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from src.recipe_box.models import Recipe, Component, Step
2+
from src.recipe_box.library import Library
3+
from src.recipe_box.browser import RecipeTreeView, RecipeTreeModel, RecipeBrowser
4+
from src.recipe_box.editor import RecipeEditor
5+
from src.recipe_box.diff import DiffViewer
6+
from src.recipe_box.assistant import AssistantDialog
7+
from src.recipe_box.rendering import TypstRenderer
8+
9+
# from src.recipe_box.theme import Theme
10+
from src.recipe_box.jsonld import recipe_from_url
11+
from src.recipe_box.preferences import Preferences

0 commit comments

Comments
 (0)