Merge branch 'LukeSmithxyz:master' into master

This commit is contained in:
Jake Keast 2021-06-26 12:55:05 +00:00 committed by GitHub
commit bb67d1f357
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
342 changed files with 6096 additions and 456 deletions

12
.github/workflows/pr.yaml vendored Normal file
View File

@ -0,0 +1,12 @@
on: pull_request
jobs:
check_files:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Check files for compliance
run: .github/workflows/scripts/check-files.sh

153
.github/workflows/scripts/check-files.sh vendored Executable file
View File

@ -0,0 +1,153 @@
#!/bin/sh
set -eu
SIZE_LIMIT=150000
FAIL=0
check_size() {
size="$(stat --printf="%s" "$1")"
if [ "$size" -gt "$SIZE_LIMIT" ]; then
echo "File $1 is bigger than specified $SIZE_LIMIT limit"
FAIL=1
fi
}
check_file_name() {
fileName="$1"
expectedFolder="$2"
shouldname="${expectedFolder}/$(basename "$fileName" |
iconv --to-code=utf-8 |
tr '[:upper:]' '[:lower:]' |
tr '_ ' '-')"
if [ "$shouldname" != "$fileName" ]; then
echo "$1 should be named $shouldname."
FAIL=1
fi
}
check_webp_name() {
check_file_name "$1" "data/pix"
}
check_recipe_name() {
check_file_name "$1" "src"
}
check_recipe_content() {
errMsgs="$(awk '
BEGIN {
HAS_TITLE = 0;
HAS_TAGS = 0;
HAS_INVALID_TAGS = 0;
NUM_TAGS = 0;
HAS_INGREDIENTS = 0;
HAS_DIRECTIONS = 0;
HAS_CONSECUTIVE_EMPTY_LINES = 0;
CONSECUTIVE_EMPTY_LINES = 0;
}
# First line should be the title
NR == 1 && /^# / {
HAS_TITLE = 1;
next;
}
$0 == "## Ingredients" {
HAS_INGREDIENTS = 1;
}
$0 == "## Directions" {
HAS_DIRECTIONS = 1;
}
$0 == "" {
CONSECUTIVE_EMPTY_LINES++
if (CONSECUTIVE_EMPTY_LINES >= 2) {
HAS_CONSECUTIVE_EMPTY_LINES = 1;
}
}
$0 != "" {
CONSECUTIVE_EMPTY_LINES = 0;
}
END {
# Last line should be the tags list
if ($1 == ";tags:") {
HAS_TAGS = 1;
NUM_TAGS = NF - 1;
# Loop through all the tags
for (i = 2; i <= NF; i++) {
# Make sure that each tag only contains lowercase letters and hyphens
if ($i !~ "^[a-z-]+$") {
HAS_INVALID_TAGS = 1;
break;
}
}
}
if (!HAS_TITLE) {
print "Recipe does not have a properly formatted title on the first line."
}
if (!HAS_TAGS) {
print "Recipe does not have a properly formatted tags on the last line."
} else {
if (HAS_INVALID_TAGS) {
print "Recipe has invalid tags. Tags must be separated by spaces and contain only lowercase letters or hyphens (-)";
}
if (NUM_TAGS < 2) {
print "Recipe only has " NUM_TAGS " tags. Add some more."
} else if (NUM_TAGS > 5) {
print "Recipe has " NUM_TAGS " tags which is too many. Remove some tags."
}
}
if (!HAS_INGREDIENTS) {
print "Recipe does not have an ingredients list."
}
if (!HAS_DIRECTIONS) {
print "Recipe does not have a directions section."
}
if (HAS_CONSECUTIVE_EMPTY_LINES) {
print "Recipe has at least 2 consecutive empty lines.";
}
}
' "$1")"
if [ -n "$errMsgs" ]; then
echo "$errMsgs"
FAIL=1
fi
}
while IFS= read -r file; do
echo "Checking '$file'"
case "$file" in
# Ignore these files
index.md) ;;
.github/*.md) ;;
*.webp)
check_size "$file"
check_webp_name "$file"
;;
*.md)
check_recipe_name "$file"
check_recipe_content "$file"
;;
esac
# Separate each file for easier reading.
echo ""
done <<EOF
$(git diff --name-only "$(git merge-base origin/master HEAD)")
EOF
exit $FAIL

View File

@ -28,5 +28,6 @@ jobs:
port: ${{ secrets.based_port }}
script: |
cd repo
git stash
git pull --force origin master
make clean deploy
make deploy

121
LICENSE Normal file
View File

@ -0,0 +1,121 @@
Creative Commons Legal Code
CC0 1.0 Universal
CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
HEREUNDER.
Statement of Purpose
The laws of most jurisdictions throughout the world automatically confer
exclusive Copyright and Related Rights (defined below) upon the creator
and subsequent owner(s) (each and all, an "owner") of an original work of
authorship and/or a database (each, a "Work").
Certain owners wish to permanently relinquish those rights to a Work for
the purpose of contributing to a commons of creative, cultural and
scientific works ("Commons") that the public can reliably and without fear
of later claims of infringement build upon, modify, incorporate in other
works, reuse and redistribute as freely as possible in any form whatsoever
and for any purposes, including without limitation commercial purposes.
These owners may contribute to the Commons to promote the ideal of a free
culture and the further production of creative, cultural and scientific
works, or to gain reputation or greater distribution for their Work in
part through the use and efforts of others.
For these and/or other purposes and motivations, and without any
expectation of additional consideration or compensation, the person
associating CC0 with a Work (the "Affirmer"), to the extent that he or she
is an owner of Copyright and Related Rights in the Work, voluntarily
elects to apply CC0 to the Work and publicly distribute the Work under its
terms, with knowledge of his or her Copyright and Related Rights in the
Work and the meaning and intended legal effect of CC0 on those rights.
1. Copyright and Related Rights. A Work made available under CC0 may be
protected by copyright and related or neighboring rights ("Copyright and
Related Rights"). Copyright and Related Rights include, but are not
limited to, the following:
i. the right to reproduce, adapt, distribute, perform, display,
communicate, and translate a Work;
ii. moral rights retained by the original author(s) and/or performer(s);
iii. publicity and privacy rights pertaining to a person's image or
likeness depicted in a Work;
iv. rights protecting against unfair competition in regards to a Work,
subject to the limitations in paragraph 4(a), below;
v. rights protecting the extraction, dissemination, use and reuse of data
in a Work;
vi. database rights (such as those arising under Directive 96/9/EC of the
European Parliament and of the Council of 11 March 1996 on the legal
protection of databases, and under any national implementation
thereof, including any amended or successor version of such
directive); and
vii. other similar, equivalent or corresponding rights throughout the
world based on applicable law or treaty, and any national
implementations thereof.
2. Waiver. To the greatest extent permitted by, but not in contravention
of, applicable law, Affirmer hereby overtly, fully, permanently,
irrevocably and unconditionally waives, abandons, and surrenders all of
Affirmer's Copyright and Related Rights and associated claims and causes
of action, whether now known or unknown (including existing as well as
future claims and causes of action), in the Work (i) in all territories
worldwide, (ii) for the maximum duration provided by applicable law or
treaty (including future time extensions), (iii) in any current or future
medium and for any number of copies, and (iv) for any purpose whatsoever,
including without limitation commercial, advertising or promotional
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
member of the public at large and to the detriment of Affirmer's heirs and
successors, fully intending that such Waiver shall not be subject to
revocation, rescission, cancellation, termination, or any other legal or
equitable action to disrupt the quiet enjoyment of the Work by the public
as contemplated by Affirmer's express Statement of Purpose.
3. Public License Fallback. Should any part of the Waiver for any reason
be judged legally invalid or ineffective under applicable law, then the
Waiver shall be preserved to the maximum extent permitted taking into
account Affirmer's express Statement of Purpose. In addition, to the
extent the Waiver is so judged Affirmer hereby grants to each affected
person a royalty-free, non transferable, non sublicensable, non exclusive,
irrevocable and unconditional license to exercise Affirmer's Copyright and
Related Rights in the Work (i) in all territories worldwide, (ii) for the
maximum duration provided by applicable law or treaty (including future
time extensions), (iii) in any current or future medium and for any number
of copies, and (iv) for any purpose whatsoever, including without
limitation commercial, advertising or promotional purposes (the
"License"). The License shall be deemed effective as of the date CC0 was
applied by Affirmer to the Work. Should any part of the License for any
reason be judged legally invalid or ineffective under applicable law, such
partial invalidity or ineffectiveness shall not invalidate the remainder
of the License, and in such case Affirmer hereby affirms that he or she
will not (i) exercise any of his or her remaining Copyright and Related
Rights in the Work or (ii) assert any associated claims and causes of
action with respect to the Work, in either case contrary to Affirmer's
express Statement of Purpose.
4. Limitations and Disclaimers.
a. No trademark or patent rights held by Affirmer are waived, abandoned,
surrendered, licensed or otherwise affected by this document.
b. Affirmer offers the Work as-is and makes no representations or
warranties of any kind concerning the Work, express, implied,
statutory or otherwise, including without limitation warranties of
title, merchantability, fitness for a particular purpose, non
infringement, or the absence of latent or other defects, accuracy, or
the present or absence of errors, whether or not discoverable, all to
the greatest extent permissible under applicable law.
c. Affirmer disclaims responsibility for clearing rights of other persons
that may apply to the Work or any use thereof, including without
limitation any person's Copyright and Related Rights in the Work.
Further, Affirmer disclaims responsibility for obtaining any necessary
consents, permissions or other rights required for any use of the
Work.
d. Affirmer understands and acknowledges that Creative Commons is not a
party to this document and has no duty or obligation with respect to
this CC0 or use of the Work.

View File

@ -18,7 +18,7 @@ BLOG_SRC ?= articles
.PHONY: help init build deploy clean taglist
ARTICLES = $(shell git ls-tree HEAD --name-only -- $(BLOG_SRC)/ 2>/dev/null)
ARTICLES = $(shell git ls-tree HEAD --name-only -- $(BLOG_SRC)/*.md 2>/dev/null)
TAGFILES = $(patsubst $(BLOG_SRC)/%.md,tags/%,$(ARTICLES))
help:
@ -59,7 +59,7 @@ config:
tags/%: $(BLOG_SRC)/%.md
mkdir -p tags
grep -i '^; *tags:' "$<" | cut -d: -f2- | sed 's/ */\n/g' | sed '/^$$/d' | sort -u > $@
grep -ih '^; *tags:' "$<" | cut -d: -f2- | tr -c '[^a-z\-]' ' ' | sed 's/ */\n/g' | sed '/^$$/d' | sort -u > $@
blog/index.html: index.md $(ARTICLES) $(TAGFILES) $(addprefix templates/,$(addsuffix .html,header index_header tag_list_header tag_entry tag_separator tag_list_footer article_list_header article_entry article_separator article_list_footer index_footer footer))
mkdir -p blog
@ -107,7 +107,7 @@ tagpages: $(TAGFILES)
blog/@%.html: $(TAGFILES) $(addprefix templates/,$(addsuffix .html,header tag_index_header tag_list_header tag_entry tag_separator tag_list_footer article_list_header article_entry article_separator article_list_footer tag_index_footer footer))
mkdir -p blog
PAGE_TITLE="Articles tagged $* $(BLOG_TITLE)"; \
PAGE_TITLE="Articles tagged $* -- $(BLOG_TITLE)"; \
TAGS="$*"; \
TITLE="$(BLOG_TITLE)"; \
export PAGE_TITLE; \
@ -117,7 +117,7 @@ blog/@%.html: $(TAGFILES) $(addprefix templates/,$(addsuffix .html,header tag_in
envsubst < templates/tag_index_header.html >> $@; \
envsubst < templates/article_list_header.html >> $@; \
first=true; \
for f in $(shell grep -FH '$*' $(TAGFILES) | sed 's,^tags/\([^:]*\):.*,$(BLOG_SRC)/\1.md,'); do \
for f in $(shell awk '$$0 == "$*" { gsub("tags", "$(BLOG_SRC)", FILENAME); print FILENAME ".md"; nextfile; }' $(TAGFILES)); do \
printf '%s ' "$$f"; \
git log -n 1 --diff-filter=A --date="format:%s $(BLOG_DATE_FORMAT_INDEX)" --pretty=format:'%ad%n' -- "$$f"; \
done | sort | cut -d" " -f1,3- | while IFS=" " read -r FILE DATE; do \
@ -137,7 +137,7 @@ blog/%.html: $(BLOG_SRC)/%.md $(addprefix templates/,$(addsuffix .html,header ar
mkdir -p blog
TITLE="$(shell head -n1 $< | sed 's/^# \+//')"; \
export TITLE; \
PAGE_TITLE="$${TITLE} $(BLOG_TITLE)"; \
PAGE_TITLE="$${TITLE} Recipe -- $(BLOG_TITLE)"; \
export PAGE_TITLE; \
AUTHOR="$(shell git log --format="%an" -- "$<" | tail -n 1)"; \
export AUTHOR; \
@ -167,12 +167,12 @@ blog/rss.xml: $(ARTICLES)
printf '%s ' "$$f"; \
git log -n 1 --diff-filter=A --date="format:%s %a, %d %b %Y %H:%M:%S %z" --pretty=format:'%ad%n' -- "$$f"; \
done | sort -k2nr | head -n $(BLOG_FEED_MAX) | cut -d" " -f1,3- | while IFS=" " read -r FILE DATE; do \
printf '<item>\n<title>%s</title>\n<link>%s</link>\n<guid>%s</guid>\n<pubDate>%s</pubDate>\n<description>%s</description>\n</item>\n' \
printf '<item>\n<title>%s</title>\n<link>%s</link>\n<guid>%s</guid>\n<pubDate>%s</pubDate>\n<description><![CDATA[%s]]></description>\n</item>\n' \
"`head -n 1 $$FILE | sed 's/^# //'`" \
"$(BLOG_URL_ROOT)`basename $$FILE | sed 's/\.md/\.html/'`" \
"$(BLOG_URL_ROOT)`basename $$FILE | sed 's/\.md/\.html/'`" \
"$$DATE" \
"`tail -n+3 < $$FILE`"; \
"`markdown < $$FILE`"; \
done >> $@
printf '</channel>\n</rss>\n' >> $@
@ -183,14 +183,14 @@ blog/atom.xml: $(ARTICLES)
printf '%s ' "$$f"; \
git log -n 1 --diff-filter=A --date="format:%s %Y-%m-%dT%H:%M:%SZ" --pretty=format:'%ad %aN%n' -- "$$f"; \
done | sort -k2nr | head -n $(BLOG_FEED_MAX) | cut -d" " -f1,3- | while IFS=" " read -r FILE DATE AUTHOR; do \
printf '<entry>\n<title type="text">%s</title>\n<link rel="alternate" type="text/html" href="%s"/>\n<id>%s</id>\n<published>%s</published>\n<updated>%s</updated>\n<author><name>%s</name></author>\n<summary type="text">%s</summary>\n</entry>\n' \
printf '<entry>\n<title type="text">%s</title>\n<link rel="alternate" type="text/html" href="%s"/>\n<id>%s</id>\n<published>%s</published>\n<updated>%s</updated>\n<author><name>%s</name></author>\n<summary type="html"><![CDATA[%s]]></summary>\n</entry>\n' \
"`head -n 1 $$FILE | sed 's/^# //'`" \
"$(BLOG_URL_ROOT)`basename $$FILE | sed 's/\.md/\.html/'`" \
"$(BLOG_URL_ROOT)`basename $$FILE | sed 's/\.md/\.html/'`" \
"$$DATE" \
"`git log -n 1 --date="format:%Y-%m-%dT%H:%M:%SZ" --pretty=format:'%ad' -- "$$FILE"`" \
"$$AUTHOR" \
"`tail -n+3 $$FILE`"; \
"`markdown < $$FILE`"; \
done >> $@
printf '</feed>\n' >> $@

View File

@ -2,22 +2,24 @@
[https://based.cooking](https://based.cooking)
## To-do
This is a simple cooking website where users can submit recipes here for credit.
There are no ads, trackers, cookies (unless recipes thereof) or javascript.
- get many recipes
- make and take pictures of recipes
- decide on CSS/styling, something good-looking and readable, but nothing too complicated
- search function? See below
- keep it simple
## Ways to contribute
- By adding a recipe.
- Make a recipe and take a nice picture of it if no nice picture already
exists. Submitted images should be small `.webp` files ideally less than 100K
or so.
- Fix errors in recipes or add minor improvements.
## Rules for submission
- Model submission files after [example.md](example.md). Put them in `src/`.
- Recipes should start with a title, with a single `#`, *on the first line*. No
empty line at the top, not trailing line at the end. The file needs to be `\n`
empty line at the top, no trailing line at the end. The file needs to be `\n`
terminated in linux-fashion (if you're on linux you don't need to care, it
should be automatic).
- Recipes should be `.md` files in the `src/` directory. Look at already
existing `.md` files for examples or see [example](example.md).
- File names should be the name of the dish with words separated by hyphens
(`-`). Not underscores, and definitely not spaces.
- Recipe must be based, i.e. good traditional and substantial food. Nothing
@ -47,12 +49,14 @@ List of special, categorical tags to use if relevant:
to be incorporated in another recipe.
- `breakfast`
- `dessert`
- `drink`
- `quick`: for recipes that can be cooked in under ~20 minutes.
- `side`: side dishes such as mash, fries, etc.
- `snack`
- `spread`
If your recipe contains no meat or dairy, include the `fasting` tag.
If it includes dairy but no milk, incude the `cheesefare` tag.
### Images
Images are stored in `data/pix`.
@ -66,8 +70,6 @@ If you see a bad or substandard image, you may submit a better one.
Images should be in `.webp` format and with as small file size as possible.
If you submit an image for say, `chicken-parmesan.md`, it should be added as `pix/chicken-parmesan.webp`.
I will create smaller images from that which is seen on the page,
and upon being clicked, the user will see the full-size image.
If you would like to add additional directional images,
they should be numbered with two digits like: `pix/chicken-parmesan-01.webp`, etc.
@ -83,18 +85,6 @@ This is not necessary yet though.
I don't really want images of recipes on the mainpage yet.
I'll think about how best to do it to minimize bandwidth if possible.
## curl/Search function in the future
I eventually want a command-line/curl interface to this site.
Part of this would be an implicit search function.
So suppose someone wants a recipe with chicken, I'd like
`curl based.cooking/chicken` to return articles with that title.
If there is only one result, that page is opened.
Just something to think about.
Then people could make a simple two or three character alias to get a simple text recipe.
## License
This website and all its content is in the public domain.

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
data/pix/apple-pie.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
data/pix/assam-tea.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
data/pix/beef-kidney.webP Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

View File

Before

Width:  |  Height:  |  Size: 558 B

After

Width:  |  Height:  |  Size: 558 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

BIN
data/pix/borscht.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

7
data/pix/btc.svg Normal file
View File

@ -0,0 +1,7 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="64" width="64" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
<g transform="translate(0.00630876,-0.00301984)">
<path fill="#f7931a" d="m63.033,39.744c-4.274,17.143-21.637,27.576-38.782,23.301-17.138-4.274-27.571-21.638-23.295-38.78,4.272-17.145,21.635-27.579,38.775-23.305,17.144,4.274,27.576,21.64,23.302,38.784z"/>
<path fill="#FFF" d="m46.103,27.444c0.637-4.258-2.605-6.547-7.038-8.074l1.438-5.768-3.511-0.875-1.4,5.616c-0.923-0.23-1.871-0.447-2.813-0.662l1.41-5.653-3.509-0.875-1.439,5.766c-0.764-0.174-1.514-0.346-2.242-0.527l0.004-0.018-4.842-1.209-0.934,3.75s2.605,0.597,2.55,0.634c1.422,0.355,1.679,1.296,1.636,2.042l-1.638,6.571c0.098,0.025,0.225,0.061,0.365,0.117-0.117-0.029-0.242-0.061-0.371-0.092l-2.296,9.205c-0.174,0.432-0.615,1.08-1.609,0.834,0.035,0.051-2.552-0.637-2.552-0.637l-1.743,4.019,4.569,1.139c0.85,0.213,1.683,0.436,2.503,0.646l-1.453,5.834,3.507,0.875,1.439-5.772c0.958,0.26,1.888,0.5,2.798,0.726l-1.434,5.745,3.511,0.875,1.453-5.823c5.987,1.133,10.489,0.676,12.384-4.739,1.527-4.36-0.076-6.875-3.226-8.515,2.294-0.529,4.022-2.038,4.483-5.155zm-8.022,11.249c-1.085,4.36-8.426,2.003-10.806,1.412l1.928-7.729c2.38,0.594,10.012,1.77,8.878,6.317zm1.086-11.312c-0.99,3.966-7.1,1.951-9.082,1.457l1.748-7.01c1.982,0.494,8.365,1.416,7.334,5.553z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

BIN
data/pix/cinque-pi.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

BIN
data/pix/crab-salad.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
data/pix/french-toast.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

BIN
data/pix/lamb-biriyani.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
data/pix/lasagna.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 KiB

BIN
data/pix/lentejas.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
data/pix/lenten-chili.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
data/pix/limoncello.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

BIN
data/pix/mapo-tofu-01.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

BIN
data/pix/mapo-tofu-02.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

BIN
data/pix/meatloaf.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 765 B

BIN
data/pix/naan-bread.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
data/pix/pan-pizza.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

BIN
data/pix/pancake.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

BIN
data/pix/pate-chinois.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
data/pix/pho-soup.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
data/pix/quesadilla.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

BIN
data/pix/ravioli-01.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
data/pix/ravioli-02.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
data/pix/ravioli-03.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

BIN
data/pix/ravioli-04.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

BIN
data/pix/roesti.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

BIN
data/pix/schnitzel.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

BIN
data/pix/shakshouka-01.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
data/pix/shakshouka-02.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
data/pix/soleier.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

BIN
data/pix/torrijas.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
data/pix/tuna-salad.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

7
data/pix/xmr.svg Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="256px" height="256px" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" preserveAspectRatio="xMidYMid">
<g>
<path d="M127.9983,0.0005 C57.3183,0.0005 0.0003,57.3155 0.0003,127.9975 C0.0003,142.1255 2.2893,155.7145 6.5183,168.4275 L44.7993,168.4275 L44.7993,60.7335 L127.9983,143.9335 L211.1973,60.7335 L211.1973,168.4275 L249.4793,168.4275 C253.7103,155.7145 256.0003,142.1255 256.0003,127.9975 C256.0003,57.3155 198.6813,0.0005 127.9983,0.0005" fill="#FF6600"></path>
<path d="M108.8673,163.0617 L72.5573,126.7507 L72.5573,194.5157 L58.6773,194.5157 L44.7973,194.5157 L18.6233,194.5157 C41.0923,231.3787 81.6743,255.9967 127.9963,255.9967 C174.3183,255.9967 214.9033,231.3787 237.3703,194.5157 L211.1933,194.5157 L186.3673,194.5157 L183.4373,194.5157 L183.4373,126.7507 L147.1263,163.0617 L127.9963,182.1897 L108.8693,163.0617 L108.8673,163.0617 Z" fill="#4C4C4C"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1022 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -1,14 +1,29 @@
body {
background: #151515 ;
color: #ccc ;
max-width: 800px ;
margin: auto ;
padding: 0 16px ;
margin-bottom: 500px ;
font-family: sans-serif ;
}
a {
color: lightblue ;
}
a:visited {
color: gray ;
}
h1 {
text-align: center ;
}
h2 {
color: tomato ;
}
footer {
text-align: center ;
}
@ -25,25 +40,29 @@ code {
color: lime ;
}
li img {
img[alt="BTC logo"],
img[alt="XMR Logo"] {
max-width: 1em ;
max-height: 1em ;
display: inline ;
}
@media (prefers-color-scheme: dark) {
@media (prefers-color-scheme: light) {
body {
background: #151515 ;
color: white ;
background: white ;
color: black ;
}
a {
color: lightblue ;
color: blue ;
}
a:visited {
color: gray ;
color: purple ;
}
h2 {
color: tomato ;
color: inherit ;
}
code {
color: forestgreen ;
}
}

View File

@ -6,11 +6,12 @@ If there is a title image of this dish, it should be above this paragraph.
You may also include prep/cook time and the number of servings as below:
- ⏲️ Prep time: 10 min
- 🍳Cook time: 30 min
- 🍳 Cook time: 30 min
- 🍽️ Servings: 4
## Ingredients
- There must be a blank line above all lists.
- List the ingredients
- in an unordered list
- similar to this.
@ -30,13 +31,16 @@ You may also include prep/cook time and the number of servings as below:
Here, just put your name and links to yourself (maybe a website or donation link) if you want.
You may say "Anonymous" or a screenname if desired.
If you add something substantial to an already existing recipe (including and image) you may add your name below with the contribution in parens.
If you add something substantial to an already existing recipe (including an image) you may add your name below with the contribution in parens.
Note that your commit name will be used to sign the recipe, so for full
anonymity either commit with a name that can't be traced back to you, or ask
someone else to commit for you.
If you add a Bitcoin/Monero address, put it in "code" between \`'s, like below. This is for formatting, especially with long Monero addresses.
- Luke Smith - [website](https://lukesmith.xyz), [donate](https://lukesmith.xyz/donate)
- Luke Smith (photo credit) - [website](https://lukesmith.xyz), [donate](https://lukesmith.xyz/donate)
- Billy Smith - btc: `bc1q763s4ud0hgfa66ce64gyh6tsss49vyk5cqcm6w`
- Sally Smith (photo credit) - [website](https://lukesmith.xyz), [donate](https://lukesmith.xyz/donate)
;tags: tag1 tag2 tag3 (see README for tag guidelines)

View File

@ -1,12 +1,23 @@
## About this site
Founded to provide a simple online cookbook without ads and obese web design.
See the story of this site unfold in three videos:
1. [A Demonstration of Modern Web Bloat](https://odysee.com/@Luke:7/a-demonstration-of-modern-web-bloat:f)
2. [The War against Web Bloat Continues](https://odysee.com/@Luke:7/the-war-against-web-bloat-continues...:a)
3. [SoyDevs DESTROYED Epic Style by Based Cooking](https://odysee.com/@Luke:7/soydevs-destroyed-epic-style-by-based:6)
### It's easy to contribute!
- Submit new recipes via git via [Github](https://github.com/lukesmithxyz/based.cooking) or [Gitlab](https://gitlab.com/lukesmithxyz/based.cooking).
- If a recipe has no image for it, make the recipe as presented and submit a picture above or to [luke@lukesmith.xyz](mailto:luke@lukesmith.xyz).
- Submit new recipes using git via [GitHub](https://github.com/lukesmithxyz/based.cooking).
- You may also improve recipes or add an image to those without them.
- Donate to the individual people who contribute pages whose names are at the bottom of each page.
- Donate to the site's long-term maintenance fund:
- ![BTC logo](https://lukesmith.xyz/pix/btc.svg) Bitcoin: `bc1q763s4ud0hgfa66ce64gyh6tsss49vyk5cqcm6w` ([QR code](pix/bitcoin-based-cooking.webp))
- ![XMR Logo](https://lukesmith.xyz/pix/xmr.svg) Monero: `48jewbtxe4jU3MnzJFjTs3gVFWh2nRrAMWdUuUd7Ubo375LL4SjLTnMRKBrXburvEh38QSNLrJy3EateykVCypnm6gcT9bh` ([QR code](https://lukesmith.xyz/pix/xmr.png))
### Donate to the Based.Cooking maintenance fund
We are funded by you only, not 20MB of ads or privacy-violating trackers per page.
- ![BTC logo](pix/btc.svg) Bitcoin ([QR code](pix/bitcoin-based-cooking.png)): `bc1q763s4ud0hgfa66ce64gyh6tsss49vyk5cqcm6w`
- ![XMR Logo](pix/xmr.svg) Monero ([QR code](pix/monero-based-cooking.png)): `84N9N3DMWhQ9cstHwGEjo8hEvm9bjeYgjV5fLrGK6TmA9iVPjnU7NMUT7gyAc22UgGAVTCUgReQ1J67znhWP3L52Usfw6jg`
- [Donate to Luke](https://lukesmith.xyz/donate) and add a comment saying it's for Based.Cooking.
- Brave users may also donate BAT to this website.

View File

@ -1,32 +1,35 @@
# Älplermagronen (Alpine macaroni)
![Älplermagronen](pix/aelplermagronen.webp)
A swiss favorite, _Älplermagronen_ combines pretty much everything you have at your disposal in your alpine chalet.
It's the definition of comfort food for the Swiss.
Serves 5-6.
Cooking time: ~30 minutes
- 🍳 Cook time: ~30 minutes
- 🍽️ Servings: 4
## Ingredients
- ~150g (1/3 lb) bacon cubes
- 3 onions (medium size)
- 400g (15 oz) potatoes (firm/waxy)
- 2L (1/2 gal) milk
- 200g (7oz) macaroni (dry weight)
- 1 - 2L (1/4 - 1/2 gal) milk
- 400g (15 oz) macaroni (dry weight)
- ~150g (1/3 lb) medium soft cheese. Appenzeller works best. Gruyère would be my go-to alternative.
- a jar of apple sauce
Feel free to vary these amounts, it's not like this is anything strict.
## Directions
1. Fry bacon cubes in pot (this pot will be used for everything so choose an appropriately large one)
1. Fry bacon cubes in pot (this pot will be used for everything so choose an appropriately large one).
2. Cut onions into half-rings and let them sweat in the same pot. Add some butter if your bacon was not fatty enough.
3. Peel potatoes and cut them into ~1 cm/half inch cubes
3. Peel potatoes and cut them into ~1 cm/half inch cubes.
4. When the onions have become sufficiently cooked, add potatoes.
5. Top everything with milk and let the potatoes cook for about 10 minutes.
7. Add macaroni and the remaining milk to cover everything. Most of the milk will be absorbed by the macaroni.
8. Shred your cheese.
9. A minute or two before the macaroni are done, add the shredded cheese into the pot. It should appear a bit too runny in the pot. While cooling it will increase in viscosity quite a bit. If the final texture is not creamy enough it is most likely due to using the wrong cheese.
9. A minute or two before the macaroni are done, add the shredded cheese into the pot. It should appear a bit too runny in the pot. While cooling it will increase in viscosity quite a bit. If the final texture is not creamy enough, it is most likely due to using the wrong cheese.
10. Season to taste. (Needs quite a bit of salt). Nutmeg also works well here.
11. Serve with apple sauce. Should be eaten together, not as a dessert.

30
src/aglio-e-olio.md Normal file
View File

@ -0,0 +1,30 @@
# Spaghetti aglio e olio
Aglio e olio, pasta with garlic and olive oil, is one of the simplest yet greatest pasta dishes of all time. It's quick, easy, and uses a lot of basic pantry ingredients which makes this a convenient weeknight meal.
- 🍳 Cook time: 15 min
- 🍽️ Servings: 4
## Ingredients
- 1 pound (500g) spaghetti (or similarly shaped pasta)
- 1/2 cup (110g) extra virgin olive oil
- 5-6 cloves of garlic
- 1/4 tsp red pepper flakes
- A bunch of fresh parsley
## Directions
1. Heat a large skillet on medium-high heat, start [cooking the pasta](pasta.html).
2. Finely slice or mince the garlic and finely chop the parsley.
3. Add the oil and garlic to the skillet and gently cook it until it's lightly golden brown.
4. Add the red pepper flakes to the skillet and turn down the heat to let its flavor infuse the oil.
5. When the pasta has finished cooking, drain it, and reserve at least around a cup of the cooking water.
6. Now add the drained pasta with some of the cooking water to the skillet and toss vigorously. The starch in the pasta water will help the sauce emulsify and get it to the right consistency.
7. At the very last second add the parsley, to preserve its freshness. Adjust the seasoning to taste if necessary.
## Contribution
- Robert [github](https://github.com/robert5800)
;tags: italian pasta

35
src/aljotta.md Normal file
View File

@ -0,0 +1,35 @@
# Aljotta
Aljotta ("jo" as in "Yo!") is a light fish soup with roots in french bouillabaisse and similarly refers to the method of serving the fish that are cooked in it. The most appropriate fish to use for both the stock and the accompanying meal are 'clean' white fish that don't turn the broth cloudy, ideally stargazers, monkfish, red gurnard, and moray eels but also hake, mullets, cod and haddock. There are a some variants; restaurant versions could very well include lemon juice and shellfish which I don't associate with aljotta. Rice eventually became a staple with it and how much you put in is up to you. I recommend just a little. In fact, there are no ingredient amounts; the picture should give you an idea of the density you're going for. **Fresh herbs are a must**.
## Ingredients
- Fish stock (see 2.)
- Fish, raw
- Onion, roughly chopped
- Garlic, sliced or diced
- Tomatos, chopped
- frying oil/lard
- Extra virgin olive oil
- Marjoram
- Black pepper (optional)
- Mint, small amount (optional, I never use it myself as it's too overpowering)
- Lemon wedge/juice (optional, also overpowering)
- Rice (optional)
## Directions
1. Cook some rice and set aside. White short-grain is best but other types will do as long as it's not starchy. Don't use arborio or sushi rice.
2. Prepare the stock, possibly the day before, by boiling fish and fish bones in a tall stock pot on medium heat for 1-2 hours. It's customary to have loose chunks of fish in the soup so you can boil the fish and separate the meat as it starts to cook. As an example, the head, tail, skin and spine from the [anglerfish fillet recipe](https://based.cooking/fried-anglerfish-fillet) were used to make stock, then half a fillet and meat that separated from the offal became part of the soup.
3. In a pot, heat some oil on low heat and add in the onions. Saute until translucent.
4. Add the garlic, tomato, herbs and salt if desired. Switch to medium heat, stirring occasionally until the water starts to boil.
5. Add the fish and let simmer on low heat until the fish are cooked thoroughly, being careful not to break them. Turn the heat off and add the olive oil.
6. Take the fish out to be served separately. They are traditionally served topped with olive oil and a squeeze of lemon with steamed vegetables.
7. If you are using lemon juice or rice, add them to each serving according to your preference.
8. Leave some for tomorrow. It always tastes better the next day.
## Contribution
Shou, [website](https://shouganai.xyz)
;tags: fish soup mediterranean

58
src/apple-pie.md Normal file
View File

@ -0,0 +1,58 @@
# Apple Pie
![Apple Pie](pix/apple-pie.webp)
- ⏲️ Prep time: 30 min
- 🍳Cook time: 45 min
- 🍽️ Servings: 8
## Ingredients
### Filling
- 900 g (4-5) golden delicious apples
- 15 g (1 tbsp) lemon juice
- 50 g white sugar
- 65 g brown sugar
- 5 g (1 tsp) cinnamon
- 1-2 g nutmeg
- 15 g cornstarch
- 15 g ice water
- 226 g (2 sticks) cold butter, cut into slices
### Crust
- 350 g flour
- 5 g salt
- 30 g white sugar
- 225 g butter
- 50-100 ml ice water
### Egg Wash
- 1 egg (optional)
- 15 g water (optional)
## Directions
1. Peel and cut the apples into 1-2 inch strips
2. Put the apples in a bowl and mix in the lemon juice, sugar, cinnamon, nutmeg, and cornstarch and let it sit for 15 mins to release water
3. Transfer the filling mixture to a sauce pan and reduce the liquid over medium to low heat for around 15 mins, stirring regularly, then turn off the gas
4. While the filling is sitting / reducing, start the crust by putting the flour, salt, sugar, and pieces of butter in a food processor
5. Run the food processor until it resembles a coarse sand (5-10 seconds) then start dripping in the ice water until the mixture starts to chunk together
6. You'll know when it's done if you can pinch the dough with your hand and it sticks together
7. Preheat oven to 350°F then start making the pie crust
8. Cut the dough in half and roll both halves out with a rolling pin until they are big enough to cover your pie pan (around 9 inch diameter)
9. Put the bottom half dough into the pie pan and cut off the excess dough with a knife
10. Dump the sauce pan full of the filling into the pie pan and even it out
11. Cover the pie filling with the top dough and fold over and tuck in the excess crust
12. Use a fork or your fingers to pinch down the top crust to the bottom crust so you don't have air gaps
13. Optionally you can now brush on the egg wash to make the crust get a shiny golden brown color when it cooks
14. Cut a few slits in the top crust with a knife to give it a nice design and allow for air to release
15. Bake 45 minutes at 350°F or until the crust is brown to your liking and the apples are bubbling inside
## Contribution
- mfed3 - xmr: `48eEMdYtCQaV5wY7wvmxK6jCxKkia9dgpNTMNT1do7RLWXCwWDgSKjN3kiZ6yHbAuAXWgDGN6imnGT9NPeHWD7zX9hSyHu2`
;tags: dessert pie sweet apples

36
src/apple-strudel.md Normal file
View File

@ -0,0 +1,36 @@
# Apple strudel
![apple-strudel-1](pix/apple-strudel-1.webp)
- ⏲️ Prep time: 10 min
- 🍳 Cook time: 40 min
- 🍽️ Servings: 6
## Ingredients
- Puff pastry
- Apricot jam (about 300 g | 10 oz)
- 3 apples
- Ground cinnamon
- Breadcrumbs / crushed cookies
- Butter (optional)
- Powdered sugar (optional)
## Directions
1. Peel and cut the apples in thin slices.
2. Roll out the puff pastry with a rolling pin.
3. Spread the jam over the puff pastry with a spoon.
4. Arrange the apple slices over the jam.
5. Sprinkle with cinnamon and breadcrumbs.
6. Cut tiny pieces of butter and arrange them over the apple slices.
![apple-strudel-2](pix/apple-strudel-2.webp)
7. Roll the puff pastry edges over, overlapping them.
8. Bake for around 40 minutes at 180°C (360° F).
9. Cover with powdered sugar.
## Contribution
- Lorenzo Iuri
;tags: dessert breakfast

37
src/arroz-chaufa.md Normal file
View File

@ -0,0 +1,37 @@
# Arroz Chaufa
Peruvian-chinese dish. Easy to cook just add and mix everything.
![Arroz Chaufa](pix/arroz-chaufa-2.webp)
- ⏲️ Prep time: 40 min
- 🍳 Cook time: 10 min
- 🍽️ Servings: 4
## Ingredients
- Rice
- Salt
- Bell Pepper
- Chicken
- Eggs
- Soy Sauce
- Welsh Onion
![Ingredients](pix/arroz-chaufa-1.webp)
## Directions
1. Cut the chicken into pieces and fry it. Don't forget the salt.
2. Cook scrambled eggs. Don't forget the salt.
3. Cook the rice. If it is yesterday's rice better, preferably without salt.
4. Cut the welsh onion and bell pepper into small squares.
5. Mix everything over low heat, adding soy sauce.
6. Optional: Add bacon, sesame oil.
7. If everything is salty, you can reduce it with just a teaspoon of sugar, especially if you cook the rice with salt.
## Contribution
- Andy Rufasto - [contact](mailto:andy@andyrufasto.cf), [GPG](https://keyoxide.org/0A3D7C5B8C2499A8BEBCE72869D2E5C413569DA2)
;tags: peruvian chinese rice

Some files were not shown because too many files have changed in this diff Show More